EL(Expression Language)
개요
표현 언어(EL)는 JSTL 1.0 스펙에서 소개되었던 것으로 JSP 2.0 스펙부터 공식적으로 포함되었으며, JSP 페이지에서 값을 표현하는데 사용되는 새로운 스크립트 언어로서 JSP의 기본문법을 보완하는 역할을 한다. 표현 언어는 다음과 같은 기능을 제공한다.
⋅ JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용(page, request, session, application에 binding된 attribute(객체)나 그 attribute의 property 값 출력)
⋅ collection 객체에 대한 접근 방법 제공
⋅ 수치 연산, 관계 연산, 논리 연산자 제공
⋅ 자바 클래스의 메소드 호출 기능 제공
⋅ 표현 언어만의 기본 객체 제공
즉, 표현 언어는 JSP 페이지에서 어플리케이션 데이터와 자바 빈즈에 좀 더 쉽게 접근하기 위한 용도로 사용된다.
또한, 표현 언어는 JSP 페이지에서 자바 코드를 없애기 위한 노력의 한 형태이다.
다음은 서블릿에서 요청 스코프에 member라는 값을 저장해 놓고 표현하는 JSP 페이지에서 표현언어를 사용하여 값을 출력하는 예이다. 아래와 같이 서블릿에서 member 변수에 홍길동이라는 값을 지정해 놓는다.
request.setAttribute("member", "홍길동");
이를 받아 표현하는 JSP 페이지(포워딩 된 페이지)에서 표현 언어를 사용하면 다음과 같다.
${member}
즉, JSP 페이지에서 String member=(String)request.getAttribute("member") 라는 코드가${member} 로 줄어드는 것을 확인할 수 있다. 그리고 EL을 사용하면 쉽게 텍스트를 조합하거나, 속성의 값으로 사용할 수 있다.
다음에서 Test 클래스에 private String address 필드와 public void setAddress(String address), public String getAddress() 메소드가 존재한 경우
Test vo=new Test();
vo.setAddress("서울");
request.setAttribute("vo", vo);
에서 setAttribute() 메소드에서 설정된 정보를 출력하기 위해서는 지금까지 사용한 방법은
<%Test vo=(Test)request.getAttribute("vo");%>
<%= vo.getAddress() %>
이지만 EL에서는 다음과 같이 프로퍼티를 이용하여 간단하게 출력 할 수 있다.
${vo.address}
또한 표현 언어(EL) 는 null 값을 가지는 변수에 대해 좀 더 관대하고, 데이터 형 변환을 자동적으로 해 준다. JSP 페이지에서 null 값을 가지는 변수인 경우 NullPointerException 예외가 발생하며 객체가 저장되는 곳에 따라 본래의 객체가 Object 형으로 추출되는 경우 사용하기 위해서는 다시 본래의 객체 형으로 형 변환을 해야 하지만 EL은 이들을 자동으로 처리 한다.
■ 표현 언어(EL)의 표현식의 기능
⋅변수와 연산자를 포함한다.
⋅JSP의 영역(page, request, session, application)에 저장된 속성 및 자바 빈도 표현 언어(EL)의 변수로서 사용될 수 있다.
⋅내장 객체도 지원한다.
■ 표현 언어(EL) 작성방법
⋅표현 언어(EL) 표현 식은 숫자, 문자열, boolean 값과 null 같은 상수 값(리터럴) 들도 포함할 수 있다.
⋅표현 언어(EL) 는 $ 와 표현식 그리고 { } 를 사용해서 표현 한다.
⋅표현 언어(EL)는 항상 『${』 로 시작해서 『}』로 끝난다.
- ${num}
- 표현식은 JSP 스크립트 내부에서 쓸 수 없다. 즉, <% %>, <%! %>, <%= %> 안에는 사용할 수 없다.
⋅표현 언어(EL) 표현식 안에 연산식도 작성이 가능 하다.
- ${num + 1}
- ${article.num + 1}
프로퍼티 접근 연산자 닷(dot(.)) 은 표현 언어(EL) 에게 자바 빈이나 컬렉션 객체에서 다음에 오는 이름과 같은 프로퍼티를 찾게 한다.
- ${article['num'] + 1} or ${article["num"] + 1}
표현 언어(EL) 표현식에는 브라켓 연산자(bracket([ ]) operator) 를 사용해도 된다. 닷(dot(.))과 같다. 즉, 브라켓 연산자의 배열 형태로 객체의 프로퍼트 혹은 변수에 접근 할 수 있다.
표현 언어(EL)에서 사용되는 연산자
■ 연산자
⋅. → 빈의 프로퍼티나 맵(Map)의 엔트리 접근
⋅[] → 배열이나 리스트(List) 엘리먼트 접근
⋅() → 괄호. 표현식의 연산 순서를 바꿔서 연산하게 할 때.
⋅a?b : c → 조건 테스트 - 조건(a) ? true 일 때 리턴 값(b) : false일 때 리턴 값 (c)
⋅+ → 더하기
⋅- → 빼기
⋅* → 곱하기
⋅/ 또는 div → 나누기
⋅% 또는 mod → 나머지
⋅== 또는 = → 같다
⋅!= 또는 =! → 다르다
⋅< 또는 lt → 보다 작다
⋅> 또는 gt → 보다 크다
⋅<= 또는 le → 작거나 같다
⋅>= 또는 ge → 크거나 같다
⋅&& 또는 and → 논리 AND
⋅|| ('|'가 연속으로 두개) 또는 or → 논리 OR
⋅! 또는 not → 단항 not (true를 false로 false를 true로)
⋅empty → 빈 변수 값 체크. null, 빈 문자열, 빈 배열, 엔트리가 없는 맵(Map)이나 컬렉션(Collection) 인가 테스트
⋅func(args) → 함수 호출. func는 함수 이름이고 args는 인자로 없을 수도 있고, 한개 혹은 쉼표(,)로 분리된 여러 개의 함수 인자를 가질 수 있음
표현 언어(EL)에서 제공되는 내장객체
■ 내장객체
⋅pageScope : 모든 page 영역 객체들에 대한 컬렉션
⋅requestScope : 모든 request 영역 객체들에 대한 컬렉션
⋅sessionScope : 모든 session 영역 객체들에 대한 컬렉션
⋅applicationScope : 모든 application 영역 객체들에 대한 컬렉션
⋅param : 모든 request 파라미터들을 문자열로 가진 컬렉션(request.getParameter() 메소드)
⋅paramValues : 모든 request 파라미터들을 파라미터 당 문자열 배열로 가진 컬렉션
⋅header : HTTP 요청 헤더를 문자열로 가진 컬렉션
⋅headerValues : HTTP 요청 헤더들을 헤더 당 문자열 배열로 가진 컬렉션
⋅cookie : 모든 쿠키의 컬렉션
⋅initParam : 모든 어플리케이션의 초기화 파라미터의 이름의 컬렉션
⋅pageContext : 현재 페이지를 위한 javax.servlet.jsp.PageContext. JSP 페이지의 환경 정보
■ 설명
⋅pageScope, requestScope, sessionScope, applicationScope 를 사용하여 애트리뷰트를 접근하는 경우 ${requestScope.result} 처럼 객체 뒤에 '.애트리뷰트_명' 의 형식으로 사용한다.
⋅param 은 html 의 form 을 통해 입력된 데이터를 가져올 때 사용한다. ${param.데이터_명} 혹은 ${param["데이터_명"]} 의 형식으로 사용한다.
⋅form 을 이용한 입력 중 checkbox, select 등 같은 name 애트리뷰트를 가진 데이터를 가져올 때는 paramValues 를 사용한다. 사용 형식은 param 과 비슷하나 여러 개의 입력 값이 있으므로 배열 형태가 된다.(예 : ${paramValues.데이터_명[0]}, ${paramValues["데이터_명"][0]} ) 배열 순서는 form 태그에 작성 된 순서를 따른다.
⋅자바의 식별자 명명규칙을 따르지 않는 헤더는 반드시 ${header["헤더_명"]} 의 형식으로 가져와야 한다.
⋅HTTP 요청 메시지 안에 같은 이름의 HTTP 헤더가 둘 이상 있는 경우는 headerValues 내장 객체를 사용한다. 사용 형식은 paramValues 의 형식과 같다.
⋅cookie는 웹 브라우저가 웹 서버로 보낸 쿠키를 가져올 때 사용한다. 형식은 마찬가지로${cookie.쿠키_명 } 혹은 ${cookie["쿠키_명"]} 형식으로 사용한다. 주의 할 것은 이때 반환되는 타입이 쿠키의 값이 아니라 쿠키 객체라는 점이다. 따라서 쿠키의 값을 출력하기 위해서는 ${cookie.쿠키_명.value } 혹은 ${cookie["쿠키_명"]["value"]} 라고 해주어야 한다. 쿠키의 값 대신 쿠키의 다른 정보를 얻기 위해 쿠키 명 뒤에 .domain, .path, .maxAge 등을 사용할 수도 있다.
⋅initParam 은 웹 애플리케이션의 초기화 파라미터를 가져오는데 사용한다. 형식은 ${initParam.파라미터_명} 이나 ${initParam["파라미터_명"]} 을 사용한다. 이 값을 얻기 위해서는 해당 이름의 초기화 파라미터가 web.xml 에 등록되어 있어야 한다.
⋅pageContext 는 java.servlet.jsp.PageContext 클래스 타입의 객체로, 이 클래스에 속하는 get 메소드들의 호출에 사용된다. 그 중에서도 파라미터가 사용되지 않는 메소드들만 실행할 수 있다. 사용형식은 pageContext 뒤에 마침표나 대괄호를 붙혀 사용하나, 메소드 명에서 get을 버리고 난 후, 가장 첫 문자를 소문자로 고쳐 사용한다. PageContext 클래스의 getRequest 메소드를 사용한다고 하면 ${pageContext.request} 혹은 ${pageContext["request"]} 의 형식이 된다. 각 메소드의 리턴 값은 각각의 객체가 돌아오므로 필요한 필드를 불러와 출력할 수 있다.
■ 사용 예
⋅세션 값 가져오기 : ${sessionScope.userId} → userId 라는 이름으로 설정한 값
⋅HTTP 파리미터 값 가져오기 : ${param.userId} → userId 라는 이름으로 설정한 값
⋅request.getContextPath() 가져오기 : ${pageContext.request.contextPath}
⋅URI : ${pageContext.request.requestURI}
자바 클래스 메소드에 접근
■ 표현 언어(EL)에서 자바 클래스의 메소드에 접근하는 방법
① 자바의 클래스 파일을 작성한다.
② 클래스 파일을 작성하고 나면 태그라이브러리에 대한 설정정보를 담고 있는 TLD 파일을 작성한다.
③ web.xml 파일에 TLD 파일을 사용할 수 있는 설정 정보를 추가한다.
④ 자바클래스의 메소드에 접근하는 JSP 페이지를 작성한다.
■ 표현 언어(EL)에서 자바 클래스의 메소드에 접근하는 방법
자바 클래스 파일 ↔ TLD파일 ↔ web.xml ↔ JSP 페이지
■ 사용 예
1) 클래스 작성
package com.jsp.test;
public class Compute {
public static int add(String x, String y) {
int a = 0;
int b = 0;
try {
a = Integer.parseInt(x);
b = Integer.parseInt(y);
}catch(Exception e) {}
return a + b;
}
}
2) "elFunctions.tld" 파일을 작성하여 "웹 루트\WEB-INF\tlds" 폴더에 저장한다.
<?xml version="1.0" encoding="utf-8" ?>
<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">
<description>EL에서 함수실행</description>
<tlib-version>1.0</tlib-version>
<short-name>ELfunctions</short-name>
<uri>/ELFunctions</uri>
<function>
<description> x 와 y의 합</description>
<name>add</name>
<function-class>com.jsp.test.Compute</function-class>
<function-signature>
int add(java.lang.String, java.lang.String)
</function-signature>
</function>
</taglib>
3) "웹 루트\WEB-INF\web.xml" 파일 수정
<?xml version="1.0" encoding="utf-8"?>
<web-app 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
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
:
<taglib>
<taglib-uri>
/WEB-INF/tlds/elFunctions.tld
</taglib-uri>
<taglib-location>
/WEB-INF/tlds/elFunctions.tld
</taglib-location>
</taglib>
</web-app>
4) JSP 페이지 작성 - elFunctionTest.jsp
<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="test" uri="/WEB-INF/tlds/elFunctions.tld" %>
<% request.setCharacterEncoding("utf-8");%>
<h3>표현 언어에서 함수사용하기 -두 숫자의 덧셈</h3>
<p/>
<form action="elFunctionTest.jsp" method="post">
X : <input type="text" name="x" value="${param['x']}"/>
<br>/
Y : <input type="text" name="y" value="${param['y']}"/>
<input type="submit" value="덧셈"/>
</form>
<p/>
합은 : ${test:add(param["x"],param["y"])} 입니다
JSP에서 EL 비활성화
web.xml 파일의 <jsp-property-group> 태그 아래의 <el-ignored> 태그의 값을 true로 설정하면 <url-pattern> 태그로 명시한 URL 패턴에 매칭 되는 JSP는 EL을 모두 일반 문자열 처럼 처리한다.
<jsp-config>
<jsp-property-group>
<url-pattern>/oldversion/*</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
EL중에서 ${expr}형식은 그대로 EL로 처리하고 #{expr} 형식의 EL만 문자열로 처리하고 싶다면 web.xml 파일에 <deferred-syntax-allowed-as-literal> 태그의 값을 true로 지정해주면 된다.
<jsp-property-group>
<url-pattern>/chap15/*</url-pattern>
<deferred-stntax-allowed-as-literal>
true
</deferred-syntax-allowed-as-literal>
</jsp-property-group>
그리고 JSP 페이지에서 page 디렉티브를 이용하여 EL을 활성화 시키거나 비활성화 시킬 수 있으며, 이와 관련된 page 디렉티브의 속성은 다음과 같다.
isELIgnored : 이 값이 true 일경우 EL을 일반 문자열로 처리한다.
deferredSyntaxAllowedAsLiteral : 이 값이 true 일 경우 #{expr} 형식의 EL을 문자열로 처리한다.
web.xml 파일의 버전에 따른 EL 처리
web.xml 파일이 서블릿 버전에 따라서 EL 지원 여부도 결정된다.
⋅서블릿 2.3 버전의 web.xml : EL을 지원하지 않는다.
⋅서블릿 2.4 버전의 web.xml : #{expr}을 지원하지 않는다.
⋅서블릿 2.5 버전의 web.xml : ${expr} 및 #{expr}을 지원한다.
'JSP(Java Server Page) > EL' 카테고리의 다른 글
자바스크립트에서 EL 사용하기 (0) | 2014.05.25 |
---|---|
Attribute와 Parameter의 EL 차이 (0) | 2014.05.25 |
EL 기본 개념잡는 예제 (0) | 2014.04.28 |
EL을 이해하는 예제 (0) | 2013.07.02 |