이전글
표현언어(EL)에서 ${}과 #{} 표기법의 차이
표현언어(Expression Language)에는
${}와 #{} 두가지 표기법이 있습니다. #{}표기법의 경우 JSP 2.1 버전에 추가된것으로 JSF(Java Server Faces)에서 사용됩니다.${}의 경우 해석되는 즉시 해당 표현식의 값이 반영되므로 즉시 적용(immediate expression)이라 하며, #{}의 경우 해당 값이 쓰일때 해당 값이 적용되므로 지연 적용(deferred expression)이라 합니다.이 차이를 알아보기 위해 다음의 예제를 참고해 보도록 하겠습니다. GIT 링크
<% MemberBean m = new MemberBean(); m.setName("dololak"); pageContext.setAttribute("mem", m); %> <c:set var="name" value="#{mem.name}"/> <% m.setName("dololak2"); %> 출력 : ${name} | cs |
위의 예제에서는
JSTL Core의 <c:set> 기능을 통해 page영역에 name이라는 속성명으로 MemberBean객체의 name값을 설정하였습니다. 이 경우 name에는 dololak이 들어간다고 예상할 수 있습니다.이후에 스크립트릿에서
m.setName()을 통해 dololak2를 name으로 세팅하지만 이미 page영역에는 dololak이 들어가 있기 때문에 MemberBean 객체의 name값 자체는 dololak2로 변경되었다고 하더라도 page 영역의 name속성에는 dololak이 들어있을것으로 예상됩니다.마지막으로
${name}로 page영역에 설정되어있는 name 속성값을 출력합니다. 결과는 어떨까요? 결과는 dololak2가 출력됩니다.결과 분석
결과가 이렇게 나온 이유는 무엇일까요? 스크립트릿에서 수행한
m.setName("dololak2") 코드가 어떻게 page 영역에 세팅된 name 속성에 영향을 미쳤을까요?그 이유는 EL 표현 방법 중
#{} 표기법을 사용하면 구문을 해석할때 값을 판단하는 것이 아닌 실제로 해당 값이 사용되는 시점에 해석되기 때문입니다. 만약 위의 예제를 ${}표기로 바꾸면 어떻게 될까요?<% MemberBean m = new MemberBean(); m.setName("dololak"); pageContext.setAttribute("mem", m); %> <c:set var="name" value="${mem.name}"/> <% m.setName("dololak2"); %> 출력 : ${name} | cs |
결과는 처음과 다르게
dololak이 출력됩니다.그 이유는
${}의 경우 #{}표기법과는 다르게 구문이 해석되는 해당 시점의 값을 기준으로 판단하기 때문입니다. 아래의 구문을 해석할때 page영역의 name속성에는 그 당시 값인 dololak이 설정되는것입니다.<c:set var="name" value="${mem.name}"/> | cs |
결론
표현언어(EL)의 표기법에 따라 값이 해석되는 시점의 차이가 있습니다. 그러나
#{}의 경우 JSF(Java Server Faces)에서 사용되는 구문으로 거의 대부분의 경우에는 ${}표기를 사용하니 어렵게 고민할 필요는 없을것 같습니다.다음글
'Servlet&Jsp' 카테고리의 다른 글
| [서블릿/JSP] 표현 언어(EL)의 연산자 규칙 및 사용법. (0) | 2019.08.06 |
|---|---|
| [서블릿/JSP] 표현 언어(EL) 기본 사용법 및 자료형 설명 (0) | 2019.08.06 |
| [서블릿/JSP] 표현 언어(EL, Expression Language)란? (0) | 2019.08.05 |
| [서블릿/JSP] 서블릿 url-pattern 실습 예제 (0) | 2019.08.02 |
| [서블릿/JSP] 서블릿 맵핑시 url-pattern 규칙 (0) | 2019.08.02 |