1. Expression Language(표현 언어 또는 익스프레션 언어)
- 값을 표현하는데 사용되는 새로운 스크립트 언어로 JSP의 기본문법을 보완하는 역활을 한다.
- JSP 네 가지 기본 객체가 제공하는 영역의 속성 사용
- 집합 객체에 대한 접근 방법 제공
- 수치 연산, 관계 연산, 논리 연산자 제공
- 자바 클래스 메서드 호출 기능 제공
- 표현 언어만의 기본 객체 제공
2. EL 기본 문법
- ${식}
- 식 부분에는 표현 언어가 정의한 문법에 따라 값을 표현하는 식이 온다. (액션태그 또는 커스텀태그의 속성 값, 표현식)
- JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있다.
- #{식}
- Deferred Expression 이라고 한다.
- JSP 2.1 버전부터 새롭게 지원하는 구문으로 JSF(JavaServer Faces)에서 사용되던 표현 언어 구문이다.
- ${식}은 표현식이 실행되는 시점에 곧바로 값을 계산하고 #{식}은 실제로 값이 실제로 필요한 시점에 값을 계산한다.
- JSP 템플릿 텍스트에서는 사용할 수 없고, 허용되는 태그의 속성에만 위치할 수 있다.
3. EL 기본 객체
- 표현 언어도 11개의 기본 객체를 제공한다.
- 값이 존재하지 않을 경우 null을 출력하지 않고 아무것도 출력하지 않는다.
기본 객체 | 설명 |
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 객체 (request.getHeader(이름)의 결과와 동일) |
headerValues | 요청 정보의 <헤더이름, 값 배열> 매핑을 저장한 Map 객체 (request.getHeaders(이름)의 결과와 동일) |
cookie | <쿠키 이름, Cookie> 매핑을 저장한 Map 객체 (request.getCookies()로 구한 Cookie 배열로 부터 매핑을 생성) |
initParam | 초기화 파라미터의<이름, 값> 매핑을 저장한 Map 객체 (application.getInitParameter(이름)의 결과와 동일) |
<!-- elForm.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>표현 언어</title> </head> <body> <form action="elResult.jsp" method="post"> 아이디 : <input type="text" name="id"> <br> <br> 회원님이 관심있는 스포츠를 선택하세요 <br> 축구<input type="checkbox" name="sports" value="축구"> 농구<input type="checkbox" name="sports" value="농구"> 야구<input type="checkbox" name="sports" value="야구"> 골프<input type="checkbox" name="sports" value="골프"> <br> <br> <input type="submit" value="확인"><input type="reset" value="취소"> </form> </body> </html>
<!-- web.xml --> <context-param> <description>테스트 파라미터1</description> <param-name>testParamName</param-name> <param-value>GZ</param-value> </context-param> <context-param> <description>테스트 파라미터2</description> <param-name>testParamAge</param-name> <param-value>25</param-value> </context-param>
<!-- elResult.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8"); %> <% request.setAttribute("name", "갱짱"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>표현 언어</title> </head> <body> 초기화 파라미터 이름 : ${ initParam.testParamName }<br> 초기화 파라미터 나이 : ${ initParam.testParamAge } <hr> 요청 URI : ${ pageContext.request.requestURI } <hr> request의 name 속성 : ${ requestScope.name } <hr> 아이디 : ${ param.id }<br> 선택한 운동 : ${ paramValues.sports[0] } ${ paramValues.sports[1] } ${ paramValues.sports[2] } ${ paramValues.sports[3] } </body> </html>
4. EL 데이터 타입
- 불리언(Boolean) 타입 : true, false
- 정수 타입 : 0 ~ 9로 이루어진 정수 값, 음수의 경우'-'가 붙는다.
- 실수 타입 : 0 ~ 9로 이루어져 있고, 소수점('.')을 사용할 수 있고, 3.24e3과 같이 지수형으로 표현 가능하다.
- 문자열 타입 : 따옴표(' 또는 ")로 둘러싼 문자열, 만약 홑따옴표(')를 사용시 표현할 경우 값에 포함된 작은 따옴표는 \'로 입력한다. \기호는 \\로 표시한다.
- 널 타입 : null
5. EL 객체 접근
- ${ <표현1>.<표현2> } 또는 ${ <표현1>[<표현2>] } 형식을 사용한다.
- <표현1>을 <값1>로 변환한다.
- <값1>이 null이면 null을 리턴한다.
- <값1>이 null이 아니면 <표현2>를 <값2>로 변환한다.
- <값2>가 null이면 null을 리턴한다.
- <값1>이 Map, List, 배열인 경우
- <값1>이 Map 이면
- <값1>.containsKey(<값2>)가 false이면 null을 리턴한다.
- 그렇지 않으면 <값1>.get(<값2>)를 리턴한다.
- <값1>이 List나 배열이면
- <값2>가 정수값인지 검사한다.(정수값이 아닐 경우 에러 발생)
- <값1>.get(<값2>) 또는 Array.get(<값1>, <값2>)를 리턴한다.
- 위 코드가 익셉션을 발생하면 에러를 발생한다.
- <값1>이 다른 객체이면
- <값2>를 문자열로 변환한다.
- <값1>이 이름이 <값2>이고 읽기 가능한 프로퍼티를 포함하고 있다면 프로퍼티의 값을 리턴한다.
- 그렇지 않을 경우 에러를 발생한다.
6. EL 객체의 탐색
- ${ EL기본객체영역.이름 } 또는 ${ 이름 }
- PAGE, REQUEST, SESSION, APPLICATION 영역에 저장된 속성에 접근 할 때에는 pageScope, requestScope, sessionScope, applicationScope 기본객체를 사용한다.
- 영역을 나타내는 EL 기본객체를 사용하지 않고 이름만 지정할 경우 EL은 네개의 영역을 차례대로 검색해서 속성이 존재하는지 확인한다.
- 단 영역별로 이름이 같은 객체가 있을 경우 작은 영역이 우선이다. (page < request < session < application)
7. EL 수치 연산자
- '+' : 덧셈
- '-' : 뺄셈
- '*' : 곱셈
- '/' 또는 div : 나눗셈
- '%' 또는 mod : 나머지
- 숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환한 후 연산자를 수행한다. (단, 숫자로 변환할 수 있는 객체)
- 객체가 null이면 0으로 처리된다.
- 나눗셈 연산자는 피연산자를 Double 타입으로 변환한 뒤 연산을 수행한다.
8. EL 비교 연산자
- '==' 또는 eq : 같은가
- '!=' 또는 nu : 같지 않은가
- '<' 또는 lt : 작은가
- '>' 또는 gt : 큰가
- '<=' 또는 le : 작거나 같은가
- '>=' 또는 ge : 크거나 같은가
<!-- elOp.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <% pageContext.setAttribute("name", "페이지네임"); request.setAttribute("name", "리퀘스트네임"); session.setAttribute("name", "세션네임"); application.setAttribute("name", "어플리케이션네임"); %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>표현 언어</title> </head> <body> <h1>객체</h1> name : ${ name }<br> pagename : ${ pageScope.name }<br> requestName : ${ requestScope.name }<br> sessionName : ${ sessionScope.name }<br> applicationName : ${ applicationScope.name }<br> <hr> <h1>수치 연산자</h1> 더하기 : ${ 10 + 10 }<br> 빼기 : ${ '10' - 10 }<br> 곱하기 : ${10 * "10" }<br> 몫 : ${'40' div '6' }<br> 나머지 : ${40 mod 6 }<br> <hr> <h1>비교 연산자</h1> 같은가 : ${ 10 eq 10 }<br> 다른가 : ${ 10 eq 10 }<br> 작은가 : ${ 10 lt 10 }<br> 큰가 : ${ 10 gt 10 }<br> 작거나같은가 : ${ 10 le 10 }<br> 크거나같은가 : ${ 10 ge 10 }<br> <hr> </body> </html> <!-- 실행 결과 객체 name : 페이지네임 pagename : 페이지네임 requestName : 리퀘스트네임 sessionName : 세션네임 applicationName : 어플리케이션네임 -------------------------------------------------- 수치 연산자 더하기 : 20 빼기 : 0 곱하기 : 100 몫 : 6.666666666666667 나머지 : 4 -------------------------------------------------- 비교 연산자 같은가 : true 다른가 : true 작은가 : false 큰가 : false 작거나같은가 : true 크거나같은가 : true -->
9. EL 논리 연산자
- '&&' 또는 and : 그리고
- '||' 또는 or : 이거나
- '!' 또는 not : 부정
10. EL empty 연산자
- empty <값>
- 검사할 객체가 null 인지 검사하기 위해 사용한다.
- <값>이 null이면 true
- <값>이 빈 문자열("")이면 true
- <값>이 길이가 0인 배열이면 true
- <값>이 빈 Map이면 true
- <값>이 빈 Collection이면 true
- 이 외의 경우에는 false
11. EL 비교 선택 연산자
- <수식> ? <값1> : <값2>
- <수식>의 결과값이 ture 이면 <값1>을 리턴하고, false이면 <값2>를 리턴한다.
12. EL 연산자 우선순위
- 우선순위가 높은순으로 먼저 실행되고, 같을 경우 왼쪽에서 오른쪽으로 진행된다.
- [] .
- ()
- -(단일) not ! empty
- * / div % mod
- + -
- < > <= >= lt gt le ge
- == != eq ne
- && and
- || or
- ? :
13. EL 특수문자 처리
- \${식} 또는 \#{식}
- JSP 템플릿 텍스트에서 처리할때 앞에 역슬래시(\)를 위치시킨다.
14. EL 객체의 메서드 호출
- JSP 2.2 버전에 추가된 기능으로 객체의 메서드를 직접 호출할 수 있다.
- 자바빈스타일의 메서드, 리턴타입이 void이거나 파라미터 개수의 관계없이 호출 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // ELMethod.java package com.tistory.gangzzang; import java.util.HashMap; import java.util.Map; public class ELMethod { private Map memberMap = new HashMap(); public int sumNumber( int num1, int num2) { return num1 + num2; } // sumNumber : 두 정수를 더한다. public void setMember(String name, String tel) { memberMap.put(name, tel); } // setMember : memberMap에 회원 추가한다. public String getMember(String name) { return memberMap.get(name); } // getMember : memberMap에서 회원 이름의 연락처를 얻는다. public String getInfo() { return "EL 메서드 호출" ; } // getInfo : 정보 출력 } // ELMethod |
<!-- elMethod.jsp --> <%@page import="com.tistory.gangzzang.ELMethod"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% ELMethod elMethod = new ELMethod(); request.setAttribute("el", elMethod); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>EL 메서드</title> </head> <body> ${ el.getInfo() } <br><br> 회원 추가 : ${ el.setMember('Gz', '01012345678') } <br><br> 회원 연락처 : ${ el.getMember('Gz') } <br><br> 두 정수의 합 : ${ el.sumNumber(5, 10) } </body> </html> <!-- 실행결과 EL 메서드 호출 회원 추가 : 회원 연락처 : 01012345678 두 정수의 합 : 15 -->
15. EL 클래스 정적 메서드 호출
- JSP 2.2 버전 이하에서는 위처럼 호출이 불가능하다.
- JSP 2.0 버전 이상부터 지원되는 정적(static) 메서드 호출 방법이 있다.
15-1. 클래스에 static 메서드 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // ELStaticMethod.java package com.tistory.gangzzang; import java.util.HashMap; import java.util.Map; public class ELStaticMethod { private static Map memberMap = new HashMap(); public static int sumNumber( int num1, int num2) { return num1 + num2; } // sumNumber : 두 정수를 더한다. public static void setMember(String name, String tel) { memberMap.put(name, tel); } // setMember : memberMap에 회원 추가한다. public static String getMember(String name) { return memberMap.get(name); } // getMember : memberMap에서 회원 이름의 연락처를 얻는다. public static String getInfo() { return "EL 메서드 호출" ; } // getInfo : 정보 출력 } // ELMethod |
15-2. EL 메서드를 정의한 TLD 파일 작성
- TLD(Tag Library Descriptor) : 태그 라이브러리에 대한 설정 정보를 담고 있다.
- TLD 파일은 WEB-INF\tlds 디렉터리에 위치시킨다.
<?xml version="1.0" encoding="UTF-8"?>
<!-- WEB-INF\tlds\el-functions.tld -->
<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"> <tlib-version>1.0</tlib-version> <short-name>functions</short-name> <function> <name>elSum</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> java.lang.Integer sumNumber(java.lang.Integer, java.lang.Integer)</function-signature> </function> <function> <name>elSet</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> void setMember(java.lang.String, java.lang.String)</function-signature> </function> <function> <name>elGet</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> java.lang.String getMember(java.lang.String)</function-signature> </function> <function> <name>elInfo</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> java.lang.String getInfo()</function-signature> </function> </taglib>
15-3. web.xml 파일에 TLD 파일 지정
<?xml version="1.0" encoding="UTF-8"?> <!-- web.xml --> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <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>
15-4. JSP 코드에서 TLD 파일에 정의한 함수 실행
- taglib 디렉티브는 web.xml 파일에서 설정한 태그 라이브러리를 JSP 페이지에서 사용한다는 것을 명시한다.
- taglib에 prefix 속성은 태그 라이브러리를 구분할 때 사용할 접두어를 나타낸다.
- EL 에서 태그 라이브러리에 정의된 메서드를 사용하려면 ${태그라이브러리접두어:메서드() } 코드를 사용한다.
- 단, 실제 사용할 클래스의 메서드이름이 아닌 TLD 파일의 <name> 태그에서 지정한 이름을 사용한다.
<!-- elStaticMethod.jsp --> <%@page import="com.tistory.gangzzang.ELMethod"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="el" uri="/WEB-INF/tlds/el-functions.tld"%> <% ELMethod elMethod = new ELMethod(); request.setAttribute("el", elMethod); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>EL static 메서드</title> </head> <body> ${ el:elInfo() } <br><br> 회원 추가 : ${ el:elSet('Gz', '01012345678') } <br><br> 회원 연락처 : ${ el:elGet('Gz') } <br><br> 두 정수의 합 : ${ el:elSum(5, 10) } </body> </html> <!-- 실행결과 EL 메서드 호출 회원 추가 : 회원 연락처 : 01012345678 두 정수의 합 : 15 -->
16. EL 사용 및 활용
- <jsp:foword> <jsp:include>에 속성으로 전달한 값 활용
<% request.setAttribute("boardInfo", boardInfo); %> <jsp:include page="<%= includedPage %>" flush="false" /> <!-- 포함되는 JSP에서 스크립트릿과 표현식을 사용하는 경우 --> <% BoardInfo boardInfo = (BoardInfo) request.getAttribute("boardInfo"); %> 이름 : <%= boardInfo.getName() %> <!-- 포함되는 JSP에서 EL 사용하는 경우 --> 이름 : ${boardInfo.name}
- 액션 태그나 커스텀 태그의 속성값으로 사용
<jsp:include page="/layout/top.jsp" flush="false" /> <!-- 표현식을 사용하는 경우 --> <jsp:include page='<%="/layout/" + layout.getModuleName() + ".jsp" %>' flush="true" /> <!-- EL 사용하는 경우 --> <jsp:include page="/layout/${ layout.moduleName }.jsp" flush="true" />
17. EL 비활성화
- web.xml 파일에 비활성화 옵션 설정
<!-- EL ${식} 비활성화 --> <jsp-config> <jsp-property-group> <url-pattern>/디렉터리명/*</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config> <!-- EL #{식} 비활성화 --> <jsp-config> <jsp-property-group> <url-pattern>/디렉터리명/*</url-pattern> <deferred-syntax-allowed-as-literal>true</deferred-syntax-allowed-as-literal> </jsp-property-group> </jsp-config>
- JSP 페이지내에서 page 디렉티브에서 비활성화 설정
- web.xml 파일 여부와 상관없이 page 디렉티브를 이용해서 활성화 또는 비활성화가 가능하다.
- isELIgnored : true일 경우 EL ${식}을 일반 문자열로 처리한다.
- deferredSyntaxAllowedAsLiteral : true일 경우 EL #{식}을 일반 문자열로 처리한다.
<!-- EL ${식} 비활성화 --> <%@ page isELIgnored="true" %> <!-- EL #{식} 비활성화 --> <%@ page deferredSyntaxAllowedAsLiteral="true" %>
- web.xml 파일 버전에 따른 EL 자동 비활성화
- 서블릿 2.3 버전의 web.xml : EL 미지원
- 서블릿 2.4 버전의 web.xml : #{식} 미지원
- 서블릿 2.5 / 서블릿 3.0 버전의 web.xml : ${식}, #{식} 지원
- 비활성화 처리 여부
web.xml <el-ignored> | page isELIgnored | EL 처리여부 |
설정하지 않음 | 설정하지 않음 | web.xml 파일이 서블릿 2.3 또는 그 이전버전이라면 EL 처리하지 않는다. |
false | 설정하지 않음 | EL 처리한다. |
true | 설정하지 않음 | EL 처리하지 않는다. |
상관없음 | false | EL 처리한다. |
상관없음 | true | EL 처리하지 않는다. |
'프로그래밍 > Servlet & JSP' 카테고리의 다른 글
jsp:include 와 <%@ include%> 차이 (1) | 2012.09.13 |
---|