이전글
표현언어(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 |