표현언어 EL (Expression Language)
EL은 다양한 위치에 있는 데이터에 접근하기 위한 언어이다. 문법체계가 직관적으로 아주 쉽다. jsp 에서는 모든 변수의 생성과 선언을 반드시 표시를 해주어야 되지만 EL은 그 과정 없이 바로 접근이 가능하다.
1. EL 의 표시형식
EL임을 표시하는 형식은 ${} 이다. 이 안에 들어있는 것은 EL 로 처리된다. 내장객체의 접근이 가능하고, 산술연산과 비교연산이 가능하다.
자바스크립트와 비슷한 방법으로 객체 내부의 자원에 접근이 가능하다. dot(.) 과 bracket([]) 모두를 이용해서 접근할 수 있으며, 예를 들면
${header.cookie} 와 ${header['cookie']} 는 같은 결과 값을 얻을 수 있다. 만일 user-agent 처럼 - 와 같이 있을 경우는 ${header['user-agent']} 로 접근하는 것이 좋다.
[] 를 이용해서 객체에 접근할 경우에 index 를 대신해서 사용할 수도 있다.
다음 예제는 이전 내용을 요약한 것이다.
예제 1. jstlel01.jsp |
<% response.setContentType("text/html;"); %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <h3>header</h3> <c:forEach items="${header}" var="h"> <c:out value="${h}"/><br/> </c:forEach> <h3>header.cookie</h3> <c:out value="${header.cookie}"/><br/> <c:out value='${header["cookie"]}'/> |
header 라는 객체가 갖고 있는 값들을 불러서 보여주는 소스이다. request.getHeader() 로 가져올 수 있는 것인데, 훨씬 깔끔한 소스로 보여진다.
JSTL 태그에서 기본적으로 EL을 사용한다. var 속성은 변수를 지정하는데, 여기에는 문자열 상수로 지정되며, 이 후에 이 변수를 참조하기 위해서는 EL 을 사용한다.
2. EL 내장객체
EL 로 접근할 수 있는 내장 객체들은 다음과 같다.
pageScope |
page scope 의 변수들 |
requestScope |
request scope 의 변수들 |
sessionScope |
session scope 의 변수들 |
applicationScope |
application scope 의 변수들 |
param |
parameter 변수들 문자열 |
paramValues |
parameter 변수들 문자열 배열 |
header |
HTTP request 헤더 |
headerValues |
HTTP request 헤더 문자열 배열 |
initParam |
컨텍스트 초기 변수 web.xml 에서 지정 |
cookie |
쿠키 변수들 |
pageContext |
현재 페이지의 pageContext 객체 |
pageScope 의 변수는 스크립틀릿의 변수와는 틀리며, 이를 이용하려면 조금은 번잡한 과정을 거치게 된다. 따라서 가능하면 스크립틀릿은 사용하지 않기를 권장한다. 이를 활용하는 소스이다.
예제 2. jstlel02.jsp |
<% response.setContentType("text/html;"); %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c_rt" uri="http://java.sun.com/jsp/jstl/core_rt" %> <% String[] abc = {"빨강","파랑","노랑"}; %>
<c:set var="t" value="hello"/> <c:set var="color" value="${abc}"/>
<h3>pageScope</h3> <c:forEach items="${pageScope}" var="h"> <c:out value="${h}"/><br/> </c:forEach>
<h3>colors</h3> <c:forEach items="${color}" varStatus="i"> <c:out value="${i.count}"/>. <c:out value="${color[i.index]}"/><br/> </c:forEach>
|
<c:forEach/> 를 통해서 pageScope 의 값을 모두 출력해보면, String 배열변수인 abc 는 접근할 수 없게 되어있다. <c:set/> 과 <c_rt:set/> 으로 정해놓은 t와 color 만 나타나는 것이 보인다.
color 의 값을 출력하는 코드를 보면 color 의 인덱스를 이용해 배열 내용을 뽑아 왔다. varStatus 대신 var 변수를 통해서 바로 내용을 출력할 수도 있다.
value 가 들어가는 자리에 표현식을 쓰기 위해서는 RT 기반의 태그를 사용해야 된다. 만일 <c_rt:set var="color" value="<%=abc%>"/> 에서 <c_rt:set/> 대신 <c:set/> 를 사용하면 color 가 갖게 되는 값은 "<%=abc%>" 문자열이 되어버린다.
3. EL 연산자
null 인지 아닌지 판단하기 위해서는 empty 라는 키워드를 사용한다. 세션 값이 없으면 세션에 값을 저장하고, 있을 경우 하나를 더한 후에 출력하는 코드이다
예제 3. jstlel03.jsp |
<% response.setContentType("text/html;"); %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:if test="${!empty hit}"> <c:set var="hit" value="${hit+1}" scope="session"/> <c:out value="${hit}"/> 번 리로드되었습니다. </c:if> <c:if test="${empty hit}"> <c:set var="hit" value="1" scope="session"/> 세션에 값을 저장했습니다. </c:if> <% String temp = request.getParameter(“hit”); If(temp != null) out.writer(Integer.parseInt(temp) + 1); Else {temp = 1; session.setAttribute(“hit”,temp); %> <br> <a href="jstlel03.jsp">reload</a>
|
EL 의 장점은 객체의 접근이 쉽다고 했다. ${empty 객체} 를 통해서, 객체의 null 을 확인할 수 있다. ${!empty hit} 는 ${!empty sessionScope.hit} 로 대치해도 같은 결과가 나온다.
EL 의 연산자는 관계연산자, 산술연산자, 논리연산자, empty 연산자가 있고 다음 표와 같다.
연산자 구분 |
연산자 |
관계 |
< lt > gt <= le >= ge == eq != ne |
산술 |
+ - * / div % mod |
논리 |
&& and || or ! not |
Empty |
empty |
연산자들간의 우선순위는 다음과 같다.
1. [] .
2. ()
3. - (단항) not ! empty
4. * / div % mod
5. + - (이항)
6. < > <= >= lt gt le ge
7. == != eq ne
8. && and
9. || or
'강의노트 > 웹' 카테고리의 다른 글
JSTL 국제화 지역화 태그 (0) | 2013.07.10 |
---|---|
JSTL core (0) | 2013.07.10 |
JSTL(JSP Standard Tag Library) (0) | 2013.07.09 |
DTO와 DAO 패턴 (0) | 2013.06.14 |
로그인하기 (0) | 2013.06.05 |