본문 바로가기
프로그래밍 놀이터/Web

Chap 15. 표현 언어 ( Expression Language )

by 돼지왕왕돼지 2015. 1. 21.

Chap 15. 표현 언어 ( Expression Language )


* 표현 언어란?


표현 언어( Expression Language ) 는 JSTL ( JSP Standard Tag Library ) 1.0 규약에 소개된 내용.

JSP 2.0 부터 사용 가능하다.



-

표현 언어의 기본 문법


${variable}


" " 안에서도 사용될 수 있다.


<jsp:include page="/module/${member.id}/header.jsp" flush="false" />


표현 언어는 JSP 의 스크립트 요소 ( 스크립트릿, 표현식, 선언부 ) 를 제외한 나머지 부분에서 사용될 수 있다.




JSP 2.1 부터는 아래와 같은 형식의 EL 도 지원된다.


#{variable}


저 둘의 가장 큰 차이는 실제로 EL 의 값을 언제 생성하느냐에 있다.


${variable} 은 interpreter 가 해당 구문을 맞딱뜨렸을 때 바로 값을 계산한다.

반대로 #{variable} 은 실제 값이 사용될 때 값이 계산된다.




* 표현 언어의 기본 객체


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 객체. String 값.

headerValues : 요청 헤더를 저장한 Map 객체. String[] 값.

cookie : cookie 를 저장한 Map 객체

initParam : 초기화 파라미터의 매핑을 저장한 Map 객체.


cf) EL 에서는 객체의 값에 접근할 때 자바빈 객체의 프로퍼티를 사용한다. 




* 표현 언어의 기본


-

객체의 탐색.


EL variable 값은 page, request, session, application 영역을 차례대로 검사해서 해당 variable 이 있는지 확인하여 사용한다.



-

수치 연산자


숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환한 후 연산자를 수행한다.

숫자로 변환할 수 없는 객체와 수치 연산자를 함께 사용하면 에러를 발생시킨다.

null 객체는 0으로 처리된다.

EL 의 연산 결과는 소숫점이 있다면 Double 타입으로 변환된다.



-

비교 연산자


문자열을 비교할 경우에는 String.compareTo() 메서드를 사용한다.



-

empty 연산자


empty <값>


null 이면 true.

"" 이면 true.

길이가 0인 배열이면 true

빈 Map 이면 true.

빈 Collection 이면 true

이외의 경우는 false.



-

특수 문자 처리하기.


\${expr}

\#{expr}





* 표현 언어에서 객체의 메서드 호출


JSP 2.2 버전에서부터 객체의 메서드를 직접 호출할 수 있다.

static method 는 다른 방식으로 해야 한다.







* 표현 언어에서 클래스 정적 메서드 호출하기.


JSP 2.0 버전부터 사용 가능하다.



-

함수를 정의한 TLD 파일 작성


<!-- WEB-INF/tlds/el-functions.tld -->

<?xml version="1.0" encoding="euc-kr"?>


<taglib xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

version="2.1">


<description>EL에서 함수실행</description>

<tlib-version>1.0</tlib-version>

<short-name>ELfunctions</short-name>


<function>

<description>Static Method Call Test</description>

<name>test</name>

<function-class>test.StaticMethodTest</function-class>

<function-signature>

java.lang.String myTest( java.lang.String )

</function-signature>

</function>


</taglib>



name 을 test 라고 주었다. 실제 static function 이름은 myTest 이다.


<!-- WEB-INF/web.xml -->


<web-app ...>

<jsp-config>

<taglib>

<taglib-uri>

/WEB-INF/tlds/el-functions.tld

</taglib-uri>

<taglib-location>

/WEB-INF/tlds/el-functions.tld

</taglib-location>

</taglib>

</jsp-config>

</web-app>


taglib-uri 는 JSP 에서 TLD 태그 라이브러리를 참조할 때 사용하는 식별자



-

EL 에서 함수 사용하기.


...

<%@ taglib prefix="elfunc" uri="/WEB-INF/tlds/el-functions.ltf" %>

...

${elfunc:test( "감자" ) }

...




* 표현 언어 비활성화 방법


EL 언어가 지원되기 전에 작성된 코드를 EL 언어가 지원되는 container 등으로 이전했을 경우 문제가 될 수 있기에 비활성화 방법을 알아두는 것도 나쁘지 않다.


EL 을 비활성화시키는 방법은 크게 3가지 가 있다


1. web.xml 파일에 비활성화 옵션 지정하기

2. JSP 페이지에 비활성화 옵션 지정하기.

3. web.xml 파일을 서블릿 2.3 또는 2.4 버전에 맞게 ㅈ가성하기.



-

web.xml 파일에 EL 비활성화 옵션 추가하기


<web-app ...>

<jsp-config>

...

<jsp-property-group>

<url-pattern>*.jsp</url-pattern>

<el-ignored>true</el-ignored>

<deferred-syntax-allowed-as-literal>true</deferred-syntax-allowed-as-literal>

</jsp-property-group>

</jsp-config>

</web-app>


el-ignored 값은 모든 EL 을 무시한다.
deferred-syntax-allowed-as-literal 은 ${ } 은 EL 로 처리하고 #{ } 은 문자열로 처리한다.


-
JSP 페이지에서 EL 비활성화시키기.

<%@ page isELIgnored="true" %>

<%@ page deferredSyntaxAllowedAsLiteral="true" %>


-

web.xml 파일의 버전에 따른 EL 처리.


서블릿 2.3 버전의 web.xml 파일은 XML 스키마가 아닌 DTD 를 이용해서 web.xml 파일의 구조를 정의하고 있다.

DTD 를 사용하는 경우 JSP 는 1.2 버전이고 이는 EL 을 지원하지 않으므로 JSP 에 포함된 EL 이 처리되지 않는다.


DTD : Document Type Definition.


<!DOCTYPE ...> 으로 정의



서블릿 2.4 버전의 경우에는 XML 스키마를 사용하며, XML 네임스페이스를 사용한다.

이 때 name space 에 서블릿 버전을 2.4 ( JSP 2.0 ) 을 지정하면 ( web-app_2_4.xsd ) ${ } 형태의 EL 만 지원하고,

버전을 그 이상으로 하면 #{ } EL 까지 모두 지원한다.








댓글0