개발/JSP
chap15 표현 언어(Expression Language)
까망군
2011. 11. 8. 15:56
JSP 2.0 버전부터 표현 언어(Expression Language)가 추가되었다. 표현 언어는 또 다른 형태의 스크립트 언어로서 스크립트 요소 중의 하나인 표현식보다 간결하고 표현식 대신 사용할 수 있기 때문에 많이 사용되고 있는 요소이기도 하다. 이 장에서는 표현언어가 무엇이며, 어떻게 표현 언어를 사용하는지에 대해서 살펴볼 것이다.
01. 표현 언어란?
표현 언어(Expression Language)는 JSTL(JSP Standard Tag Library) 1.0 규약에 소개된 내용으로서 JSP 2.0 버전부터 표현 언어가 포함되었다. JSP 2.1 버전에서는 표현 언어와 관련된 규약을 별도 문서로 제공하고 있으며, 이 장에서는 표현 언어 2.1 규약을 기준으로 설명할 것이다.
표현 언어는 이름에서 알 수 있듯이 값을 표현하는 데 사용되는 새로운 스크립트 언어로서 JSP의 기본 문법을 보완하는 역할을 한다. 표현 언어는 다음과 같은 기능을 제공하고 있다.
표현 언어를 사용하면 표현식을 사용하는 것보다 간단한 방법으로 값을 출력할 수 있게 되는데, 이 장을 통해서 이를 확인할 수 있을 것이다.
1.1 표현 언어의 기본 문법
표현 언어는 다음과 같이 $와 표현식 그리고 괄호('{'와 '}')를 사용하여 값을 표현한다.
expr 부분에는 표현 언어가 정의한 문법에 따라 값을 표현하는 식이 온다. 표현 언어는 액션 태그나 19장에서 배울 커스텀 태그의 속성값으로 사용할 수 있다. 예를 들어, 다음과 같은 형태로 사용이 가능하다.
액션 태그나 커스텀 태그뿐만 아니라 비 스크립트 요소 부분에서도 표현식처럼 값을 출력하기 위해 사용할 수 있다.
표현 언어는 JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있으며, 표현 언어를 통해서 표현식보다 편리하게 값을 출력할 수 있다.
JSP 2.1 버전부터는 ${expr} 형식뿐만 아니라 #{expr} 구문을 새롭게 지원하고 있다. #{expr}형식의 JSF(JavaServer Faces)에서 사용되던 표현 언어 구문으로 JSP 2.1 버전에 새롭게 추가 되었다. #{expr}과 ${expr}의 가장 큰 차이점은 실제로 EL의 값을 언제 생성하느냐에 있다.
${expr} 형식의 EL은 ${expr} 구문을 분석할 때 곧바로 값을 계산한다. 예를 들어, 아래 코드를 보자.
아직 배우지 않았지만 <c:set> JSTL 태그는 EL 변수를 생성해 주는 기능을 제공한다. 위 코드에서 name EL 변수의 값으로 ${m.name}을 지정했는데, m.name을 계산한 결과인(즉, m.getName()의 결과인) "이름1"을 name의 값으로 할당한다. 따라서 그 뒤에 m.setName()으로 값을 변경하더라도 name 변수의 값은 변경되지 않는다.(JSTL에 대한 내용은 16장에서 자세히 살펴볼 것이다.
반면에 #{expr} 형식의 구문은 실제로 값이 사용될 때 값을 계산한다. 아래 코드는 사용 예를 보여주고 있다.
앞서 코드와의 차이가 있다면 ${m.name} 대신에 #{m.name}을 사용한 것인데, #{m.name}은 실제로 값을 계산하지 않고 name 변수의 값을 m.name으로부터 가져온다고만 설정한다. 그리고 실제로 값을 사용할 때 매번 값을 계산해서 출력하게 된다. 위 코드에서는 name을 출력하기 전에 m.setName()을 이용해서 값을 변경해 주었는데 앞서 ${expr}을 사용한 경우와 달리 값이 필요할 때 매번 계산하기 때문에 ${name}코드는 변경된 값을 출력하게 된다.
이렇게 #{expr} 형식의 EL은 실제로 값이 필요할 때 계산을 수행하기 때문에 Deferred Expression이라고 부른다. #{expr}은 곧바로 값이 생성되는 것이 아니기 때문에 JSP 템플릿 텍스트에서는 사용할 수 없다. 예를 들어, 아래와 같이 #{expr}을 일반 텍스트에서 사용하면 예외가 발생한다.
JSP 2.1에서 #{expr}은 Deferred Expression을 허용하는 태그의 속성에만 위치할 수 있다. 예를 들어, 앞서 JSTL의 <c:out>태그의 value 속성은 Deferred 을 허용하기 때문에 <c:out> 태그의 value 속성에는 #{expr} 형식의 EL을 값으로 설정할 수 있다.
이 장에서는 ${expr} 형식을 중심으로 표현 언어가 어떻게 사용되는지 살펴볼 것이다.
01. 표현 언어란?
표현 언어(Expression Language)는 JSTL(JSP Standard Tag Library) 1.0 규약에 소개된 내용으로서 JSP 2.0 버전부터 표현 언어가 포함되었다. JSP 2.1 버전에서는 표현 언어와 관련된 규약을 별도 문서로 제공하고 있으며, 이 장에서는 표현 언어 2.1 규약을 기준으로 설명할 것이다.
표현 언어는 이름에서 알 수 있듯이 값을 표현하는 데 사용되는 새로운 스크립트 언어로서 JSP의 기본 문법을 보완하는 역할을 한다. 표현 언어는 다음과 같은 기능을 제공하고 있다.
- JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용
- 집합 객체에 대한 접근 방법 제공
- 수치 연산, 관계 연산, 논리 연산자 제공
- 자바 클래스 메서드 호출 기능 제공
- 표현 언어만의 기본 객체 제공
표현 언어를 사용하면 표현식을 사용하는 것보다 간단한 방법으로 값을 출력할 수 있게 되는데, 이 장을 통해서 이를 확인할 수 있을 것이다.
1.1 표현 언어의 기본 문법
표현 언어는 다음과 같이 $와 표현식 그리고 괄호('{'와 '}')를 사용하여 값을 표현한다.
${expr}
expr 부분에는 표현 언어가 정의한 문법에 따라 값을 표현하는 식이 온다. 표현 언어는 액션 태그나 19장에서 배울 커스텀 태그의 속성값으로 사용할 수 있다. 예를 들어, 다음과 같은 형태로 사용이 가능하다.
<jsp:include page="/module/${skin.id}/header.jsp" flush="true" />
액션 태그나 커스텀 태그뿐만 아니라 비 스크립트 요소 부분에서도 표현식처럼 값을 출력하기 위해 사용할 수 있다.
<b>${sessionScope.member.id}</b>님 환영합니다.
표현 언어는 JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있으며, 표현 언어를 통해서 표현식보다 편리하게 값을 출력할 수 있다.
JSP 2.1 버전부터는 ${expr} 형식뿐만 아니라 #{expr} 구문을 새롭게 지원하고 있다. #{expr}형식의 JSF(JavaServer Faces)에서 사용되던 표현 언어 구문으로 JSP 2.1 버전에 새롭게 추가 되었다. #{expr}과 ${expr}의 가장 큰 차이점은 실제로 EL의 값을 언제 생성하느냐에 있다.
${expr} 형식의 EL은 ${expr} 구문을 분석할 때 곧바로 값을 계산한다. 예를 들어, 아래 코드를 보자.
<%
Member m = new Member();
m.setName("이름1");
%>
<c:set var="m" value="<%= m %>"/>
<c:set var="name" value="${m.name}"/> <%-- 이 시점에 곧 바로 값 계산 --%>
<% m.setName("이름2"); %>
${name} <%-- name의 값은 "이름1" --%>
아직 배우지 않았지만 <c:set> JSTL 태그는 EL 변수를 생성해 주는 기능을 제공한다. 위 코드에서 name EL 변수의 값으로 ${m.name}을 지정했는데, m.name을 계산한 결과인(즉, m.getName()의 결과인) "이름1"을 name의 값으로 할당한다. 따라서 그 뒤에 m.setName()으로 값을 변경하더라도 name 변수의 값은 변경되지 않는다.(JSTL에 대한 내용은 16장에서 자세히 살펴볼 것이다.
반면에 #{expr} 형식의 구문은 실제로 값이 사용될 때 값을 계산한다. 아래 코드는 사용 예를 보여주고 있다.
<%
Member m = new Member();
m.setName("이름1");
%>
<c:set var="m" value="<%= m %>"/>
<c:set var="name" value="#{m.name}"/> <%-- 이 시점에는 값 생성하지 않음 --%>
<% m.setName("이름2"); %>
${name} <%-- 사용될 때 계산, "이름2" 출력 --%>
<% m.setName("이름3"); %>
${name} <%-- 사용될 때 계산, "이름3" 출력 --%>
앞서 코드와의 차이가 있다면 ${m.name} 대신에 #{m.name}을 사용한 것인데, #{m.name}은 실제로 값을 계산하지 않고 name 변수의 값을 m.name으로부터 가져온다고만 설정한다. 그리고 실제로 값을 사용할 때 매번 값을 계산해서 출력하게 된다. 위 코드에서는 name을 출력하기 전에 m.setName()을 이용해서 값을 변경해 주었는데 앞서 ${expr}을 사용한 경우와 달리 값이 필요할 때 매번 계산하기 때문에 ${name}코드는 변경된 값을 출력하게 된다.
이렇게 #{expr} 형식의 EL은 실제로 값이 필요할 때 계산을 수행하기 때문에 Deferred Expression이라고 부른다. #{expr}은 곧바로 값이 생성되는 것이 아니기 때문에 JSP 템플릿 텍스트에서는 사용할 수 없다. 예를 들어, 아래와 같이 #{expr}을 일반 텍스트에서 사용하면 예외가 발생한다.
<%-- JSP의 템플릿 텍스트에서 #{expr}을 사용하면 에러 발생 --%>
#{sessionScope.name.id}님 환영합니다.
JSP 2.1에서 #{expr}은 Deferred Expression을 허용하는 태그의 속성에만 위치할 수 있다. 예를 들어, 앞서 JSTL의 <c:out>태그의 value 속성은 Deferred 을 허용하기 때문에 <c:out> 태그의 value 속성에는 #{expr} 형식의 EL을 값으로 설정할 수 있다.
이 장에서는 ${expr} 형식을 중심으로 표현 언어가 어떻게 사용되는지 살펴볼 것이다.