[JSP] EL 2.2
- 작성규칙
- 연산자
- pageScope, requestScope, sessionScope, applicationScope
- param
- paramValues
- cookie
- initParam
- pageContext
- header, headerValues
참고 문서
EL은 JSP 페이지에 사용되는 자바코드를 대신해 값을 표현하는데 사용된다.
${ object }
스크립릿으로 view에 전달한 값을 화면에 노출하는 방법이 다음과 같다면:
<% Test vo = (Test)request.getAttribute("vo"); %>
<%= vo.getEmail() %>
EL은 아래 한 줄로 끝난다:
${vo.address}
코딩 짱쉽네
작성규칙
- EL은는 항상
${
로 시작해서}
로 끝난다. - EL은
$
와 표현식 그리고 브레이스{ }
를 사용해서 표현한다. - EL은 숫자, 문자열, boolean 값과 null 같은 상수 값(리터럴)들도 포함할 수 있다.
- 스크립릿 내부에서 쓸 수 없다. 즉,
<% %>
,<%! %>
,<%= %>
내에서 사용할 수 없다. - 표현식 안에 연산식도 작성이 가능 하다.
- 프로퍼티 접근 연산자(혹은 속성 접근자) 온점
.
은 EL에게 자바 빈이나 맵/컬렉션 객체에서 다음에 오는 이름과 같은 프로퍼티를 찾게 한다. ex:${article.num}
- 프로퍼티 접근 연산자 대괄호
[ ]
에 지정된 값이 문자열일 땐 온점.
과 동일하게 작동한다. 지정된 값이 숫자일 땐 배열로 인식하고 해당 숫자와 동일한 인덱스를 찾는다. ex:${article['num']}
,${arry[0]}
연산자
연산자 | 설명 |
---|---|
. |
빈의 프로퍼티나 맵(Map)의 엔트리 접근 |
[] |
배열이나 리스트(List) 엘리먼트 접근 |
() |
괄호. 표현식의 연산 순서를 바꿔서 연산하게 할 때 |
a ? b : c |
EL의 삼항연산자. a가 true면 b, false면 c |
+ |
더하기 연산이지만 문자열 연산은 불가 (문자열 연산은 EL 3.0부터 += 연산자로 가능) |
- |
|
* |
|
/ 또는 div |
|
% 또는 mod |
|
! 또는 not |
|
== 또는 eq |
|
!= 또는 ne |
|
< 또는 lt |
|
> 또는 gt |
|
<= 또는 le |
|
>= 또는 ge |
|
&& 또는 and |
|
|| 또는 or |
|
empty |
빈 변수값 체크. null 혹은 빈문자열, 빈배열, 엔트리가 없는 맵/컬렉션이면 true |
not empty |
empty가 아닌경우 true |
func(args) |
함수 호출 |
<script>
function fnTest() {
if (${not empty session.info}) {
//...
}
}
</script>
<c:if test="${empty session.info}">
<div id="login">로그인</div>
</c:if>
<c:if test="${not empty session.info}">
<div id="logout">로그아웃</div>
</c:if>
<tr>
<th scope="row">등록자명</th>
<td>${mode eq 'new' ? '#' : 'admin0101' }</td>
<th scope="row">등록일시</th>
<td>${mode eq 'new' ? '#' : '2013-00-00 23:00' }</td>
</tr>
pageScope, requestScope, sessionScope, applicationScope
각 영역 객체들에 대한 스코프
${ scope.데이터명 }
request.setAttribute("email", "noname@site.com");
request.getSession().setAttribute("phonenumber", "0100100100");
request.getSession().getServletContext().setAttribute("country", "korea");
가령 위처럼 각 객체에 할당한 속성에 접근할 때 아래와 같이 사용한다:
${email}
${pageScope.myname}
${requestScope['email']} // == requestScope.email
${sessionScope['phonenumber']} // == sessionScope.phonenumber
${applicationScope.country}
scope를 생략하면 pageScope > requestScope > sessionScope > applicationScope 순으로 찾는다. (pageScope의 우선순위가 가장 높다)
pageScope에 속성 추가하기
<% pageContext.setAttribute("pagename", "scope-test"); %>
${pageScope.pagename}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="myname" value="waldo" scope="page"/>
${pageScope['myname']}
request.attribute의 'javax.servlet.forward.request_uri' 가져오기
${requestScope['javax.servlet.forward.request_uri']}
// 여기서 점(.)은 접근연산자가 아니라 연결된 단어이므로 대괄호([ ])를 사용해야한다.
param
모든 request 파라미터들을 문자열로 가진 맵(request.getParameter()
메서드)
${ param.파라미터명 }
${ param[ "파라미터명" ]}
param은 말 그대로 클라이언트에서 전달된 파라미터에 접근한다. html의 form을 통해 입력된 데이터, 혹은 query string이 이에 해당한다.
<form action="test2.jsp" method="post">
<input type="text" name="num">
<input type="submit" value="보내기">
</form>
위의 폼에서 넘어온 num을 찾으려면:
${param.num}
${name}과 ${param.name}의 차이
${ name }
-> page/request/session/application scope의 attrtibute에서 'name'을 찾는다.${ param.name }
-> request 객체의 parameter에서 'name'을 찾는다.
paramValues
모든 request 파라미터들을 파라미터당 문자열 배열로 가진 컬렉션
${ paramValues.데이터명[ idx ] }, ${ paramValues[ "데이터명" ][ idx ]})
form을 이용한 입력 중 checkbox, select 등 같은 name의 데이터를 가져올 때는 paramValues를 사용한다. 구문은 param과 비슷하나 여러 개의 입력 값이 있으므로 배열 형태가 된다:
<form action="test2.jsp" method="post">
<input type="checkbox" value="firstValue" name="ck"/>
<input type="checkbox" value="secondValue" name="ck"/>
<input type="submit" value="보내기">
</form>
위 폼에서 넘어온 첫 번째 값을 찾으려면:
${paramValues.ck[0]}
배열 순서는 HTML 태그가 작성된 순서를 따른다.
cookie
cookie는 웹 브라우저가 웹 서버로 보낸 쿠키를 가져올 때 사용한다.
${ cookie.쿠키명 }
${ cookie[ "쿠키명" ]}
cookie에서 반환되는 타입은 쿠키 객체라는 것을 주의해야 한다. 해당 쿠키 객체의 값을 출력하기 위해서는 다음처럼 작성한다:
${cookie.쿠키명.value}
// 혹은
${cookie["쿠키명"]["value"]}
쿠키의 값 대신 쿠키의 다른 정보를 얻기 위해 쿠키명 뒤에 .domain
, .path
, .maxAge
등을 사용할 수 있다.
initParam
모든 애플리케이션의 초기화 파라미터의 이름의 맵
${ initParam.파라미터명 }
${ initParam[ "파라미터명" ]}
initParam은 웹 애플리케이션의 초기화 파라미터를 가져오는데 사용한다. 이 값을 얻기 위해서는 해당 이름의 초기화 파라미터가 web.xml 에 등록되어 있어야 한다.
pageContext
현재 페이지를 위한 javax.servlet.jsp.PageContext
. JSP 페이지의 환경 정보.
${ pageContext.메서드명 }
${ pageContext[ "메서드명" ]}
pageContext는 java.servlet.jsp.PageContext
타입의 객체로, 이 클래스에 속하는 get 메서드들의 호출에 사용된다.
그 중에서도 파라미터가 사용되지 않는 메서드들만 실행할 수 있다. 사용 형식은 pageContext 뒤에 마침표나 대괄호를 붙혀 사용하나, 메서드 명에서 get을 버리고 난 후, 가장 첫 문자를 소문자로 고쳐 사용한다.
PageContext 클래스의 getRequest 메서드를 사용한다고 하면:
${pageContext.request}
// 혹은
${pageContext["request"]}
위와 같은 형식이 된다. 각 메서드의 반환값은 각각의 객체가 돌아오므로 필요한 필드를 불러와 출력할 수 있다.
${pageContext.request.contextPath} // == request.getContextPath()
${pageContext.request.requestURI} // == request.getRequestURI()
header, headerValues
HTTP 요청 헤더들을 문자열이나 문자열배열로 가진 컬렉션
${ header.헤더명 }
${ header[ "헤더명" ]}
${ headerValues.헤더명[ idx ]}
${ headerValues[ "헤더명" ][ idx ]}
HTTP 요청 메시지 안에 같은 이름의 HTTP 헤더가 둘 이상 있는 경우는 headerValues 내장객체를 사용한다.
${header.Cookie} // syntax #1
${header["Cookie"]} // syntax #2
${headerValues.Cookie[0]} // syntax #3
${headerValues["Cookie"][0]} // syntax #4