#013 표현언어(Expression Language)

표현언어는 이름에서 알수 있듯이 값을 표현하는데 사용되는 새로운 스크립트 언어로서 JSP의 기본 문법을 보오나하는 역할을 한다.
1. JSP의 네가지 기본 객체가 제공하는 영역의 속성을 사용한다.
2. 집합 객체에 대한 접근 방법 제공
3. 수치 연산, 관계연산, 논리 연산자 제공
4. 자바 클래스 메서드 호출 기능 제공
5. 표현언어만의 기본 객체 제공

1.1 표현언어의 기본 문법
${expr}

<jsp:include page=”/module/${skin.id}/header.jsp” flush=”ture” />

<b>${sessionScope.member.id}</b>님 환영합니다.

#{expr} 형식의 EL은 실제로 값이 필요할때 계산을 수행하기 때문에 Deferred Expression 이라고 부른다.

02. 표현언어의 기본 객체
EL도 이와 마찬기지로 11개의 기본 객체를 제공함으로써 요청 파라마터나 세션 속성값등을 표현식에서 쉽게 사용할수 있도록 하고 있다.

pageContext : JSP의 page 기본 객체와 동일한다.
pageScope : pageContext 기본 객체에 저장된 속성의<속성, 값> 매핑을 저장한 Map 객체
requestScope : request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 MAP 객체
sessionScope : session기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 MAP 객체
applicationScope : application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 MAP 객체
param : 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체, 파라미터 값의 타입은 String으로서 request.getParameter의 결과와 동일하다
paramValues : 요청 파라미터의<파라미터이름, 값배열> 매핑을 저장한 map 객체. 값의 타입은 String[]으로서, request.getParametervalues의 결과와 동일하다
header : 요청정보의<헤더이름, 값> 매핑을 저장한 map 객체
headervalues : 요청정보의<헤더이름, 값 배열> 매핑을 저장한 Map 객체
cookie : <쿠키이름, Cookie> 매핑을 저장한 Map 객체
initParam  : 초기화 파라미터의 <이름, 값> 매핑을 저장한 map 객체

EL언으의 특징으로서 EL언어는 값이 존재하지 않을 경우 아무것도 출력하지 않는다.
${cookie.ID.value}
EL의 cookie 기본 객체는<이름, Cookie 객체>의 맵을 저장하고 있기 때문에 cookie.ID는 이름이 ID인 Cookie 객체를 리턴하다. 따라서 Cookie.ID.value 가 출력값은 이름이 ID인 Cookie 객체의 getValue() 메서드의 리턴 값이 된다. 이름이 “ID”인 쿠키가 존재 하지 않는다면 아무 값도 출력되지 않는다.

03. 표현언어의 기본

3.1 EL의 데이터 타입
블리언 : true, false
정수 타입 : 0~9로 이루어진 정수값 음수의 경우 -가 붙음
실수타입 : 0~9로 이루어져 있으며, 소수점을 사용할수 있고 3.24e3과 같이 지수형 표현가능
문자열타입 : 따옴표(‘,”)로 둘러싼 문자열.
널타입 : null

3.2 객체에 접근하기
<표현1>.<표현2> 또는 <표현1>[<표현2>]

1. 표현1을 값1로 변환한다.
2. 값1이 null 이면 null을 리턴한다.
3. 값1이 null이 아닐경우 표현2를 값2로 변환한다.
ㅇ 값2가 null 이면 null을 리턴한다.
4. 값1이 map,list 배열인 경우
ㅇ 값1이 map이면
1. 값1.containsKey(값2)가 false이면 null을 리턴한다.
2. 그렇지 않으면 값1.get(값2)를 리런한다.
ㅇ 값1이 list 이면
1. 값2가 정수인 값인지 검사한다(정수값이 아닐경우 에러발생)
2. 값1.get(값2)또는 Array.get(값1, 값2)를 리턴한다.
3. 위코드가 예외를 발생하면 에러를 발생한다.
5. 값1이 다른객체이면
ㅇ 값2를 문자열로 변호낳ㄴ다.
ㅇ 값1이 이름이 값2이고 읽기 가능한 프로퍼티를 포함하고 있다면 프로퍼티의 값을 리턴한다.
ㅇ 그렇지 않을경우 에러를 발생한다.

————————${cookie.ID.value} EL 표현식을 분석 ——————–
cookie는 EL이 제공하는 기본 객체로서 타입은 Map이다 따라서 위 처리과정중에서 4-A에 해당한다. cookie.ID를 분석할때에는 cookie.containsKey(“ID”)의 존재 여부를 확인한후, 존재할 경우 cookie.get(“ID”)를 리턴한다. cookie.get(“ID”)가 리턴하는 객체는 Cookie 객체이므로 cookie.ID.value는 위의 과정중 5에 해당한다. value를 문자열로 변혼한후, cookie.ID 객체가 읽기 가능한  value 프로퍼티가 있는지 조사한다. cookie.ID는 Cookie 클래스의 객체이고 Cookie 클래스는m getValue() 메서드를 제공하므로 읽기 가능한 value 프로퍼티가 존재한다. 따라서 결과적으로 Cookie.ID.value는 이름이 ID인 쿠키 값을 리턴하게 된다.

3.3 객체의 탐색
Page, Request, Session, Application 영역에 저장된 속성에 접근 할때에는 pageScope, requestScope, sessionScope,applicationScope 기본 객체를 사용한다고 했다. 예를들어 다음 코드는 apge 영역에 저장되어 있는 name이라는 속성값을 참고하게 된다. ${pageScope.NAME}

영역을 나타내는 EL 기본 객체를 사용하지 않고 이름만 지정할 경우 EL은 4개의 영역을 차례대로 검색해서 속성이 존재하는지 확인한다.
${NAME}
3.4 수치 연산자
+ : 덧셈
– : 뺄샘
* : 곱셈
/ : 나눗셈
% : 나머지

숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환한 후 연산자를 수행한다.
${“10″+1} = 에러 발생
${“일”+1} = 에러발생
${null +1} = 1 null은 0으로 처리
${3/2} = 1.5 EL에서 나눗셈 연산자는 정수가 아님

3.5 비교 연산자
–, !=, <, >, <=, >=

문자열 비교 : String.compareTo()
${someValue == “2004”}
—> (someValue.compareTo(“2004″)==0)과 같은 의미

3.6 논리연산자
&&,||,!

3.7 empty 연산자
empty연산자는 검사할 객체가 텅 빈 객체인지를 검사하기 위해 사용하낟. empty 연산자는 다음과 같이 사용한다. empty <값>
여기서 <값>에 따라 리턴되는 값은 다음과 같이 결정된다.
1. <값>이 null이면 true를 리턴한다.
2. <값>이 빈문자열이면  true를 리턴한다.
3. <값>이 길이가 0인 배열이면 true를 리턴한다.
4. <값>이 빈 Map이면 true를 리턴한다.
5. <값>이 빈 Collection이면 true를 리턴한다.
6. 이외의 경우에는  false를 리턴한다.

3.8 비교 선택 연산자
<수식>? 값1: 값2

3.9 특수문자 처리하기
\${expr} 또는 \#{expr}을 입력 할 경우 있는 그대로를 출력한다.

* EL에서 클래스의 메소드를 사용하기 위해서는 클래스의 메소드를 static으로 정의해야 하며, static 이 아닌 메소드는 사용할수 없다.

4.1 함수를 정의한 TLD 파일 작성
클래스 파일을 작성했다면 TLD 파일을 작성해 주어야 한다. TLD 파일은 태그 라이브러리에 대한 설정 정보를 담고 있다.
TLD파일은 WEB-INF\tlds디렉터리나 WEB-INF\jsp 디렉터리와 같은곳에 위치시킨다.

el-function.tld
<?xml version =”1.0″ encoding=”euc-kr”?>
<taglib xmlns=”…………….”>
<description>EL에서 함수 실행</description>
<tlib-version>1.0</tlib-version>
<short-name>ELfunctions</short-name>

<function>
<descpritoion> date 객체 포맷팅 </description>
<name dateFormat</name>
<function-class>kame.dateUtil</function-clas>
<function-signature>java.lang.String format(java.util.Date)</fucntion-signature>
</function>

4.3 web.xml 파일에 TLD 내용 추가 하기
TLD 파일을 작성한 다음에는 web.xml 팡리에 TLD 파일에 대한 내용을 추가 해 주어야 한다.

<jsp-config>
<taglib>
<taglib-uri>
/WEB-INF/tlds/elfunction.tld
</taglib-uri>
<taglib-location>
/WEB-INF/tlds/el-functions.tld
</taglib-location>
</taglib>
</jsp-config>

4.4 EL에서 함수 사용하기
EL에서 함수를 사용하기 위해서는 다음과 같은 형태의 코드를 사용한다.
<%@ taglib prefix=”pre” uri=”..” %>
${pre:functionName(arg1,arg2,..)}

<%@ taglib prefix=”elfunc” uri=”/WEB-INF/tlds/el-function.tld” %>
${elfunc:dateFormat(today)}

5. 표현언어 비활성화 방법
ㅇ web.xml 파일에 비활성화 옵션 지정하기

<jsp-config>
<jsp-property-group>
<url-pattern>/oldversion/*</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>

또는

<jsp-config>
<jsp-property-group>
<url-pattern>/oldversion2_4/*<url-pattern>
<deferren-syntax-allowed-as-literal>true </deferren-syntax-allowed-as-literal>
</jsp-property-group>
</jsp-config>

ㅇ JSP 페이지에 비활성화 옵션 지정하기
JSP 페이지의 page 디렉티브를 이용하여 EL을 활성화 시키거나 비활성화 시킬수 있다.
isELlogored :  이값이 true 일경우 EL을 일반 문자열로 처리한다.
defrredSyntaxAllowedAsLiteral : 이 값이 true일 경우 #{expr} 형식의 EL을 문자열로 처리 한다.
<%@ page isELIgnored=”true” %>
<%@ page deferredSyntaxAllowedAsLiteral=”true”%>

web.xml 파일을 서블릿 2.3 또는 2.4 버젼에 맞게 작성하기

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

%d 블로거가 이것을 좋아합니다: