JSP - EL 표현식 문법과 사용 방법
EL(Expression Language)
자바 빈의 프로퍼티, 값을 JSP의 표현식 <%= %>이나 액션 태그 <jsp:useBean>를 사용하는것 보다 쉽고 간결하게 꺼낼수 있게 하는 기술이다.
또한 static 메소드를 호출할 수도 있는데 JSP에서는 주로 서블릿 보관소(JspContext, ServletRequest, HttpSession, ServletContext)에서 값을 꺼낼 때 사용한다.
<%= %> 대신 사용
스크립트요소 (스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용
주요기능
Jsp의 4가지 기본 객체가 제공하는 영역의 속성 사용
집합 객체(set.get..)에 대한 접근 방법 제공
EL 표기법
${ }
-가장많이 사용
- JSP가 실행될 때 즉시 반영된다. (Immediate evaluation)
- 객체 프로퍼티 값을 꺼낼때 주로 사용
- 마치 ++a 가 바로 증가하는 것처럼 바로 반영이 가능
#{ }
- 시스템에서 필요하다고 판단될 때 그 시점에 그 값을 사용한다. (Deferred evaluation)
- 사용자 입력값을 객체의 프로퍼티에 담는 용도로 주로 사용
- a++ 처럼 즉시가 아닌 추후에 사용하듯이
${member.no} 또는 ${member["no"])
위 EL 표현식의 자바 코드는 다음과 같다.
1
2
|
Member obj = (Member) pageContext.findAttribute("member");
int value = obj.getNo();
|
cs |
PageContext의 findAttribute()는 서블릿 보관소를 순서대로 모두 뒤져서 객체를 찾는다.
마지막 보관소에도 없다면 null을 반환한다.
JspContext → ServletRequest → HttpSession → ServletContext
<%
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" 출력 --%>
EL에서 보관소 검색 범위 지정
${member.no} 처럼 보관소를 지정하지 않으면 모든 보관소를 검색하지만 특정 보관소에서만 찾도록 지정할 수 있다.
다음은 EL에서 보관소를 참조할때 사용하는 이름이다.
이름 | 보관소 |
pageScope | JspContext |
requestScope | ServletRequest |
sessionScope | HttpSession |
applicationScope | ServletContext |
따라서 ${requestScope.member.no}와 같이 쓰면 ServletRequest에서만 해당 객체를 찾는다.
참고로 이는 다음 자바 코드와 같다.
1
2
|
Member obj = (Member) request.getAttribute("member");
int value = obj.getNo();
|
cs |
EL 기본 객체
다음은 JSP에서 기본으로 제공하는 EL 객체이다.
\ 객체 |
설명 | 코드 |
pageContext | JSP의 PageContext 객체 | |
servletContext | ServletContext 객체 | ${pageContext.servletContext.객체명} |
session | HttpSession 객체 | ${pageContext.session.객체명} |
request | ServletRequest 객체 | ${pageContext.request.객체명} |
response | ServletResponse 객체 | |
param | 요청 매개변수의 값 조회 | ${param.매개변수명} |
paramValues | 요청 매개변수의 값 배열 조회 | ${paramValues.매개변수명} |
header | HTTP 헤더의 값 조회 | ${header.헤더명} |
headerValues | HTTP 헤더의 값 배열 조회 | ${headerValues.헤더명} |
cookie | 쿠키 값 조회 | ${cookie.쿠키명} |
initParam | 컨텍스트 초기화 매개변수의 값 조회 | ${initParam.매개변수명} |
pageScope | page 보관소의 값 조회 | ${pageScope.객체명} |
requestScope | request 보관소의 값 조회 | ${requestScope.객체명} |
sessionScope | session 보관소의 값 조회 | ${sessionScope.객체명} |
applicationScope | application 보관소의 값 조회 | ${applicationScope.객체명} |
요청 URI: ${pageContext.request.requestURI}
<%= pageContext.getRequest().getRequestURI()%>
request의 name 속성: ${requestScope.name} <br>
<%--
<%= request.getAttribute("name")%>
--%>
code 파라미터: ${param.code}
<%--
<%= request.getParameter("code")%>
--%>
EL 데이터 타입
EL에서 객체에 접근
연산자
EL 클래스 메소드 호출
잘 사용은 하지 않는다.
public class DateUtil {
public static String format(Date date) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.format(date);
}
}
클래스를 만든다
안에 있는 메소드를 TLD라는 파일을 작성해라
web.xml에서 TLD 파일을 지정해야한다
JSP코드에서 PLD에 정의한 함수를 실행한다