[JSP] EL 2.2

Published: by Creative Commons Licence

참고 문서

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.쿠키명.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