jstl el 쓰기
Servlet 설정
Fancy URL
스프링노트의 url 처럼 확장자가 안들어가고 serial 번호나 몇가지 키워드만 딸랑 들어가도록 url을 만드는 방법.
확장자가 없는 파일 매핑하기 : urlRewrite Filter
- Servlet의 기본 설정으로는 root부터 해서 확장자가 없는 모든 파일을 매핑할 수는 없다.
- "/app/*"와 같이 /app 폴더에 있는 파일들 모두는 가능하다.
- url을 /app 밑으로 모두 지정해둔 후에
- urlRewrite Filter를 사용해서 "/xx" => "/app/xx"와 같이 url을 rewrite 하도록 해준다.
JSTL #
JSTL로 JSP 페이지를 업데이트 하는 방법#
http://www.ibm.com/developerworks/java/library/j-jsp05273.html
Core #
url #
- c:url의 주된 목적은 cookie가 disable 됐을 때 sessionID를 붙여 주는 것이다.
- 즉, 국내에서는 쓸 필요가 없다. <= 국내에서는 Cookie를 disable로 해두면 웹 브라우징이 안된다.
jsp 파일에서 List나 Map 객체 만들기#
Scriptlet 사용...<% %>#
- <%!
public class Keyword {
String docid;
String title;
String link;
public Keyword( String c, String n, String l ) { this.docid = c; this.title = n; this.link = l; }
public String getDocid(){return docid;}
public void setDocid( String c ) { this.docid = c; };
public String getTitle(){return title;}
public void setTitle( String n ) { this.title = n; };
public String getLink(){return link;}
public void setLink( String c ) { this.link = c; };
}
%>
<jsp:useBean id="keywords" class="java.util.ArrayList" type="java.util.List"></jsp:useBean>
<%
keywords.add( new Keyword( "a", "에이", "http://a.com" ) );
keywords.add( new Keyword( "b", "비기", "http://b.com" ) );
keywords.add( new Keyword( "c", "시러", "http://c.com" ) );
%>
<vms:csv items="${keywords}" itemLabel="title" itemLink="link"/>
${keywords }
Scriptlet Free#
- <jsp:useBean id="svcLinkMap" class="java.util.HashMap" type="java.util.Map" />
<c:set target="${svcLinkMap}" property="tv팟" value="http://tvpot.daum.net/best/BestToday.do?lu=t_c_bestmore" />
<c:set target="${svcLinkMap}" property="카페" value="http://cafe.daum.net/?_top_cafetop=cafelogo" />
<c:set target="${svcLinkMap}" property="아고라" value="http://agora.media.daum.net/" />
<c:set target="${svcLinkMap}" property="연예" value="http://media.daum.net/entertain/" />
<c:set target="${svcLinkMap}" property="블로그" value="http://blog.daum.net/?nil_profile=mini&nil_src=blog" />
MicroNova YUZU 라이브러리 사용#
소스코드: http://sourceforge.net/projects/micronova-yuzu
사용법: http://forum.java.sun.com/thread.jspa?threadID=582948&messageID=2977097
<jsp:useBean id="array_list" class="java.util.ArrayList" type="java.util.List"/> <jsp:useBean id="hash_map" class="java.util.HashMap" type="java.util.Map"/>
요렇게 하고... Map은 아래와 같이 하고
<m:set var="x" className="java.util.HashMap"> <m:set property="a" value="alpha"/> <m:set property="b" value="beta"/> </m:set>
List는
<m:set var="y" className="java.util.ArrayList"> <m:set property="*" value="1"/> <m:set property="*" value="2"/> </m:set>
요렇게 하면 된단다.
List에 Map을 넣으려면...
<m:set var="z" className="java.util.ArrayList"> <m:set property="*" className="java.util.HashMap"> <m:set property="name" value="first"/> <m:set property="value" value="100"/> </m:set> <m:set property="*" className="java.util.HashMap"> <m:set property="name" value="second"/> <m:set property="value" value="200"/> </m:set> </m:set>
요렇게...
JSTL Tags.. <c:..>#
forTokens#
<c:forTokens items="" delims=""></c:forTokens>
-
csv와 같이 토큰으로 구성된 문자열에 대하여 적절한 처리를 해준다.
-
이걸 보니까 왠지 csv로 구성하는 것이 일반적인 것 같은 생각이 든다.
-
근데 막상 어디에 쓰일까 생각하면 좀 막막하다...
커스텀 태그 custom tag#
커스텀 태그 Best Practice#
tooltip.tag#
-
요약
- 쉬운 사용법: 설명할 용어를 태그로 둘러싸기만 하면됨.
- 쉬운 유지보수: 용어 변경이나 help 추가시 tooltip.tag 파일만 수정하면 된다.
- 단점: 필요없는 도움말도 페이지에 모두 include 된다.
-
특징
- javascript를 내부에 포함시킴 + 한번만 load됨.
- Hash()를 사용해서 공통 메시지를 관리함.
- 사용법: <vms:tooltip code="C1">용어</vms:tooltip>
-
개선사항
-
도움말을 dwr을 써서 동적으로 가져온다?
- 태그가 삽입되는 순간에 필요한 메시지만 받아올 수 있으면 좋겠다.
- 서블릿을 안건드리고 처리하기 위해서는 DWR( AJAX)가 필요할듯?
- 아니면 아예 세션에 도움말을 가져올 수 있는 유틸 함수를 추가해둔다?
- 즉, 특정 빈에 getter를 호출하면 db에서 가져오도록...
-
custom tag(tag files) 관련 링크...#
스펙?: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags5.html
해결 안된 문제점#
Eclipse에서 html 태그 warning이 너무 많이 뜰 경우...#
- 근본적인 해결은 안됐기 때문에 현재로써는 아래와 같은 우회방법을 사용해야 한다.
contentsList.tag와 같이 내용이 많으면
warning이 너무 많이 떠서 작업이 힘들어지는 경우가 있다.
이럴 때에는 jsp editor가 아닌 일반 text editor로 작업을 하는 것이 속 편하다.
일단 jsp로 확장자를 바꿔서 태그 손질을 한 다음에
다시 tag로 확장자를 돌려 놓고...
Eclipse에서 파일에 대고 오른쪽 클릭 > open with > text editor 메뉴를 선택하면 깔끔하게 텍스트 에디터로 작업할 수 있다.
태그파일 중복 사용 피하기#
- <c:if test="${empty tooltip_isFirst}">
<script type="text/javascript" src="/js/tooltip.js"></script>
</c:if>
<c:set var="tooltip_isFirst" value="false" scope="request"/>
- 위와 같이 request 범위에서 <c:set>태그로 변수를 선언해주면
- 해당 request 처리 중에 태그파일이 여러번 호출되더라도
tooltip.js에 대한 include는 한번만 발생한다.
custom tag file안에서 다른 tag file 사용하기#
- Unpackaged Tag Files: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html
-
자동생성 tld 파일
- /WEB-INF/tags/ 폴더에 있는 .tag 파일들은 TLD 파일이 필요 없다고 한다.
- 자동 생성 된다고 함.
- 규칙은 링크 참조.
- 문제는! 이 자동 생성된 tld파일은 uri를 지정하지 않기 때문에
다른 custom tag file에서 include를 할 수 없다! - 생각해보면 당연한 것이...
다른 tag file에서 include할 수 있으면 재귀적인 include가 발생할 수도 있다....? 아닌가?
나름 해결법...#
- tld 파일을 명시적으로 생성한다.
- <?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<tlib-version>1.0</tlib-version>
<uri>/WEB-INF/tags/vms.tld</uri>
<short-name>vms tag files</short-name>
<tag-file>
<name>Must</name>
<path>/WEB-INF/tags/Must.tag</path>
</tag-file>
</taglib>
한글 깨지는 문제#
<%@ tag language="java" body-content="empty" pageEncoding="UTF-8"%>
위 라인을 페이지 시작에 지정해준다.
사용자 정의 함수 사용하기#
기본 형태#
- <taglib>
<function>
<name>limitStr</name>
<function-class>net.daum.vms.common.Format</function-class>
<function-signature>
String limitStr( java.lang.String, java.lang.Integer )
</function-signature>
</function>
</taglib>
functions.tld에서 주의할 사항#
- 참고: [시에라]의 p422 ~ p425
-
<name>
- <function-name>이 아니고 <name>이다!
-
<function-signature>
- 반환형은 자료형의 이름(String)만 적어주면 되지만
인자는 자료형의 완젼한 경로(java.lang.String)를 적어줘야 한다. -
인자의 이름은 적지 않는다! 자료형만 적는다!
- (x) String limitStr( java.lang.String src, java.lang.Integer limit)
- (o) String limitStr( java.lang.String, java.lang.Integer)
- 반환형은 자료형의 이름(String)만 적어주면 되지만
-
primitive에 대한 자동 boxing은 하지 않는다.
- 즉, 원래 파라매터가 int인데 java.lang.Integer를 인자로 적어주거나
그 반대로, java.lang.Integer인데 int를 적어주면 안된다.
- 즉, 원래 파라매터가 int인데 java.lang.Integer를 인자로 적어주거나
커스텀태그 인자로 List/Map 받기#
- <%@ attribute name="items" type="java.util.List" %>
<%@ attribute name="items" type="java.util.Map" %>
-
주의사항!
- type을 반드시 지정해줘야 한다!
- 안그려면 String 타입으로 받기 때문에 파라매터에 .toString()한 값을 갖게 된다.
- Unable to find a value for "stddate" in object of class "java.lang.String" using operator "."
에러가 뜬다.
커스텀 태그 인자로 속성 이름 받기#
-
요약: EL에 있는 [] 연산자를 이용하면 속성을 동적으로 결정할 수 있다.
- ${item [ attribute_name ]}
- <%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="items" required="true" type="java.util.List" %>
<%@ attribute name="itemLink" required="false" %>
<%@ attribute name="itemLabel" required="true" %>
<c:forEach items="${items}" var="item">
<c:if test="${!empty itemLink}">
<a href="${item[ itemLink ] }" target="_blank">
</c:if>
${item[ itemLabel ] }
<c:if test="${!empty itemLink}">
</a>
</c:if>
</c:forEach>
Trouble Shooting#
예외 처리#
JasperException#
Attribute target invalid for tag a according to TLD#
- org.apache.jasper.JasperException: /jsp/viral/viralReportContent.jsp_contentsList_DETAIL.jsp(34,53) Attribute target invalid for tag a according to TLD
정확히는... target이라는 속성이 TLD에 없다는 의미이다.
<vms:a link="xx" target="_blank"/>처럼 했을 때, target은 tld에 정의하지 않은 속성이기 때문에 에러가 발생한다.
해결법: target 속성(attribute)을 삭제해주면 된다.
The function limitStr cannot be located with the specified prefix#
태그 라이브러리를 인클루드 안한 것임.
- <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
와 같이 태그 라이브러리를 인클루드 해주면 된다.
The function limitStr cannot be located with the specified prefix#
말 그대로 prefix가 잘못된 경우이다.
VMS의 경우 기본 함수에 대한 prefix인 fn외에 vmsf라는 사용자 정의 함수를 사용했는데,
vmsf:를 적어줘야 할 곳이 fn:를 적어줘서 이 문제가 발생하기도 한다.
Unable to find a value for "stddate" in object of class "java.lang.String" using operator "."#
커스텀 태그에서 위와 같은 에러가 나는 경우...
attribute의 type을 지정해주지 않아서 기본 type인 String으로 설정됐기 때문에 발생하는 문제이다.
Unable to compile class for JSP#
태그: <%@ attribute %>의 type 속성이 잘못 된 경우.#
type=""에 존제하지 않는 type을 적어주면 위 에러가 발생한다.
Reference #
EL Reference#
-
http://www.ibm.com/developerworks/java/library/j-jstl0211.html#N1008A
- 10페이지 분량의 Reference
-
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html
- ibm것보다 좀 더 간결하다.
What's new in JSP 2.0 #
Using JSTL#
Tips#
Properties 파일#
- ResourceBundle 클래스를 사용하면 된다.
- // Auth.properties의 값을 가져온다.
- ResourceBundle bundle = ResourceBundle.getBundle("Auth");
- 이것을 사용하면 Readonly로 속성을 사용할 수 있다!
- Properties for net.daum.vms.VmsMailSender.java
host=hm-local.hanmail.net
FMT_RESETPW_BODY=%s님, VMS의 임시 비밀번호가 발급됐습니다.\n \
임시 비밀번호: %s\n \
만약 본인이 비밀번호 재설정을 신청하지 않으신 경우, VMS관리자에게 연락 바랍니다.
- 위와 같이 역 슬레시(\)를 이용하면 여러 줄에 걸친 속성도 넣어줄 수 있다.
디버깅#
- Eclipse에서 JSP 디버깅이 가능하다. -> Scriptlet (즉, <% %>부분)만 가능함.
JSP에서 scriptlet(<% %>) 막기#
-
Tomcat 5.x Servlet 2.4, JSP 2.0 을 사용하면 web.xml 에 다음을 추가하면 스크립틀릿 사용 금지 상태가 됩니다.
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
HttpRequestParameter values 얻기#
- request 객체의 getParameterMap()에는
- values()에 String[]이 들어가 있다!
- 이때문에 이것을 한번 Arrays.deepToString()으로 풀어낸 뒤에 다시 deepToString()을 해줘야 한다.
- String msg = " param values: "
- + getAllParamValues( request.getParameterMap().values() );
- private String getAllParamValues( Collection col ){
String[] ret = new String[ col.size()];
Iterator itor = col.iterator();
int i = 0;
while( itor.hasNext() ){
Object item = itor.next();
ret[ i] = Arrays.deepToString( (String[])item );
i++;
}
return Arrays.deepToString( ret );
}
Velocity vs. JSTL#
- 큰 차이는 없다고 예기함.
-
velocity의 장점
- runetime에 interprete 되고, db에서도 template을 가져올 수 있다.[1]
- 성능이 더 좋다.[2]
-
velocity의 단점
-
HTML 엔티티 이스케이핑이 자동으로 안된다.[2]
- Velocity의 경우 HTML 엔티티 이스케이핑이 자동으로 이뤄지지 않기 때문입니다. 이래저래 꽁수가 있긴 하지만 권장하고 싶지 않습니다.
HTML 이스케이핑 해주는 것을 까먹을경우, XSS 공격에 노출될 확률이 높아집니다. -> 간단히 말해 해킹당할 확률이 높아집니다.
- Velocity의 경우 HTML 엔티티 이스케이핑이 자동으로 이뤄지지 않기 때문입니다. 이래저래 꽁수가 있긴 하지만 권장하고 싶지 않습니다.
-
커스텀 태그를 사용할 수 없고, 이것 대신 매크로를 써야 한다.
- 문제는 아무래도 매크로는 태그처럼 HTML 코드들과 잘 어울리지 못한다.
-
-
Reference
- [1] Velocity vs JSP/JSTL, http://squizlog.keithpitty.org/archives/2004/09/14/velocity_vs_jspjstl.html
- [2] jstl vs velocity, http://www.okjsp.pe.kr/seq/108143
-
- /