'el'에 해당되는 글 5

  1. 2011.07.22 web.xml 에 EL 사용하기 4
  2. 2009.08.06 EL이 안되는 경우
  3. 2009.07.26 Java EE 5 스펙에서 JSTL 구현
  4. 2009.07.19 JSP 2.0 EXPRESSION LANGUAGE
  5. 2009.06.11 JSTL 비교 연산자

web.xml 에 EL 사용하기

시스템 프로퍼티를 web.xml 에서 EL 로 사용 가능하다.
동일한 소스를 사용하는 2대의 서버에서 처리한 예
- 요구사항
대외계에서는 security_outer.xml 을 로드하고 세션타임아웃을 30분으로 설정한다.
내부 시스템에서는 security_inner.xml 을 로드하고 세션이 끊기지 않도록 설정한다.

환경에 따라 web.xml 을 변경하지 않고 각 환경에 맞게 적용할 수 있다.
java -cp ... -Denv.type=outer -Dsession.timeout=30 xxx.HttpServer
java -cp ... -Denv.type=inner -Dsession.timeout=-1 xxx.HttpServer

- env.type 이 outer 인 경우 세션 타임아웃을 별도로 지정하지 않아도 30분으로 설정하고 싶은데 web.xml 에서 논리 표현을 지원하지 않는다.
(Resin 설정 파일에서는 가능함)

EL이 안되는 경우

필요한 라이브러리(jstl.jar, standard.jar) 모두 넣었음.
Tomcat 5.5 환경에서 EL이 안됨

혹시나 해서 isELIgnored를 false로 두니깐 된다.

그런데 왜 C사 박모씨 개발환경에서만 이럴까?

그리고 el-enabled 속성은 없다.
스펙에도 없는데 왜 많은 사이트에서 이 속성을 언급하는지 모르겠다.

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
http://java.sun.com/xml/ns/j2ee/jsp_2_0.xsd
<xsd:element name="el-ignored"
           type="j2ee:true-falseType"
           minOccurs="0">
    <xsd:annotation>



Java EE 5 스펙에서 JSTL 구현

- Geronimo의 배신: GlassFish JSTL 1.2와 Apache Geronimo 2.0 통합 패키지 사용하기 (한글)

- JSF와 JSP 1.2
JSF 1.0에서는 JSTL의 EL과 비슷하게 동작하는 고유의 EL을 갖고 있으며, 이 때까지는 JSF EL과 JSTL EL은 호환성이 없었다.

- 통합 표현식 언어(Unified expression language)
자바 EE 5에서는 JSTL과 JSF의 EL이 합쳐져 JSTL과 JSF를 혼합해 쓰는 것이 가능해졌다.

- 자바 EE 5의 일부로서 EL
J2EE 1.4 스펙까지는 JSTL 구현이 필수 사항이 아니었지만 자바 EE 5 스펙에서는 JSTL 구현이 필수 사항이다.

- 제로니모와 글래스피시 JSTL
아파치 제로니모 개발자들은 자바 EE 5 구현체인 제로니모 2.0을 만들 때, JSTL 구현체를 포함해야만 했다.
통합 표현식 언어는 JSTL 구현체의 주요 요구사항이었지만, 많은 JSTL 구현체는 JSF와 함께 동작할 수 없어서 기존 구현체 중에서 선택할 수 없었다.
다행히도 제로니모 팀은 직접 JSTL과 통합 표현식 언어 구현체를 만드는 대신 썬의 글래스피시를 활용할 수 있었다.
글래스피시는 자바 EE 5 스펙을 위한 썬의 참조 구현체다.

JSP 2.0 EXPRESSION LANGUAGE

http://blog.sdnkorea.com/blog/272

- "." 와 [] 연산자 비교
${header["host"]} localhost:8080
${header.host} localhost:8080

${header["user-agent"]} Mozilla/5.0 (Macintosh;...)
${header.user-agent} 0 //마이너스 연산을 한다.

- []에 EL변수 사용가능
<c:set var="headerName" value="host"/>
${header[headerName]}

- 디폴트 값 정의하기
<c:out value="${colors[1024]}" default="transparent"/>

${colors[1024] == null ? "transparent" : colors[1024]}

- forEach구문에서 Map 사용하기
JSTL태그 forEach를 이용할 때, 반복 변수(iteration)는 java.util.Map.Entry 타입이다.
Map에 들어있는 데이터에 접근하려면 Entry#key 와 Entry#value를 사용하면 된다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
    java.util.Map map = new java.util.HashMap();
    map.put("a", "1");
    map.put("b", "2");
    map.put("c", "3");
    map.put("4", "d");
    pageContext.setAttribute("map", map);
%>
<c:forEach var="data" items="${map}">
${data.key}=${data.value}<br>
</c:forEach>
<hr>
${map["4"]}<br>
${map.4}<br> //EXCEPTION
<hr>
<c:forEach var="hdr" items="${header}">
${hdr.key}=${hdr.value}<br>
</c:forEach>
<hr>
<c:forEach var="cookieVal" items="${cookie}">
${cookieVal}<br>
</c:forEach>

JSTL 비교 연산자

- 테스트환경 1
잘모름

- 테스트환경 2
Apache Tomcat/5.5.9
standard-taglib 1.1.2

  ${test} ${empty test} ${test == null} ${test == 'null'} ${test == ''} ${test == ' '}[각주:1] ${test == '0'} ${test == 0}
 [각주:2] "" true true false false false false false
pageContext.setAttribute("test", null); "" true true false false false false false
pageContext.setAttribute("test", ""); "" true false false true false false true
pageContext.setAttribute("test", " "); " " false false false false true false Exception[각주:3]
pageContext.setAttribute("test", new Integer(0)); 0 false false[각주:4]
Exception[각주:5]
Exception[각주:6] true Exception[각주:7] true true
pageContext.setAttribute("test", "0"); 0 false false false false false true true

- empty 연산자는 test 가 없는 경우 참이다.
- Map, List, 배열이 비어 있는 경우에도 참이다.

[todo] 다른 구현체에서도 해볼 것.(resin, glassfish...구현체 확인해 둘것)
  1. 테스트환경 2에서 추가 [본문으로]
  2. 테스트환경 2에서 추가 [본문으로]
  3. An exception occured trying to convert String " " to type "java.lang.Long" [본문으로]
  4. 테스트환경 1 [본문으로]
  5. 테스트환경 2, An exception occured trying to convert String "null" to type "java.lang.Long" [본문으로]
  6. An exception occured trying to convert String "null" to type "java.lang.Long" [본문으로]
  7. An exception occured trying to convert String " " to type "java.lang.Long" [본문으로]