- EL Expression Language 이란?
- JSP는 자바문법과 HTML문법을 엄격하게 분리한다. 그리고 자바문법은 스크립트릿<% %>안에서만 사용 가능하다.
- EL은 HTML문법에 종속된다. 스크립트릿과 관계없이 사용한다.
- 스크립트릿과 분리되기 때문에, 스크립트릿에서 선언된 자바 코드의 값을 EL을 통해 바로 가져올 수 없다. (이 부분이 지금 블로그를 작성한 이유이다.)
- EL을 통해 JAVA의 값을 가져오기
<%
String str = "hello java";
%>
<c:out value="${str }"></c:out> // 작동안함
<c:out value="<%=str %>"></c:out> // 작동함
- EL이 JSP를 위한 태그이기 때문에 스크립트릿에서 바로 값을 호출할 수 있을 것이라 생각했다. 하지만 그렇게 사용할 수 없었다.
<%
String[] list = {"1", "a", "가"};
for(String s : list){
out.print(s+" "); // 작동함
}
<c:forEach var = "s" items="${list }" varStatus="status"> //작동 안함
${s}
<c:if test="${not status.last}">
,
</c:if>
</c:forEach>
<c:set var="listt" value="<%=list %>"/> ..........(1)
<c:forEach var = "s" items="${listt }" varStatus="status"> //작동함
${s}
<c:if test="${not status.last}">
,
</c:if>
</c:forEach>
%>
- 배열도 동일하다. JSTL 코드인 (1) <c:set var="listt" value="<%=list %>"/> 을 통해 선언한 후에 작동했다.
- EL의 스코프
- 그럼 EL은 어느 값을 가지고 오는가? 변수에 접근할 수 있는 범위를 스코프라 한다. 스코프는 서블릿(jsp)의 스코프와 일치한다.
web.xml
<context-param>
<param-name>where</param-name>
<param-value>initContext</param-value>
</context-param>
test.jsp
<%
pageContext.setAttribute("where", "pageContext");
request.setAttribute("where", "request");
session.setAttribute("where", "session");
application.setAttribute("where", "applicationContext");
%>
${where}
${initParam.where}
- EL 문법을 통해 접근 가능한 위치는 page, request, session, context, initContext(web.xml)이다.
- EL은 변수를 찾을 때 앞서의 순서에 따라 검색한다. page->request->session->context. 그러므로 변수를 선언할 때 그 이름을 정하는데 있어서 신경써야 한다.
- initContext(web.xml)의 경우 initParam을 그래프하여 호출한다.
- 앞서 JSTL을 통해 변수를 선언할 때<c:set> 기본 스코프는 page이다. 그러므로 앞서의 예제에서 ${listt}는 페이지에서 가지고 온 변수이다.
- JSP의 태그인 <jsp:usebean> 역시도 scope를 가진다. JSTL, EL과 마찬가지로 Servlet에 종속된다. 그러나 <jsp:useBean id="mem" class="bean.Member"></jsp:useBean>의 class 요소처럼,스크립트릿 없이 자바 소스에 접근 가능하다.
- Servlet에서 선언된 객체에 대하여 자바 코드로 변경하면?
Member.java
public class Member {
private String name;
public Member() {
this.name="kim";
}
//....getter, setter....//
}
test.jsp
<jsp:useBean id="mem" class="bean.Member"></jsp:useBean>
<jsp:setProperty property="*" name="mem"/>
${mem.name} // kim
<%
mem.setName("김");
%>
${mem.name} // 김
- Member 객체가 생성 될 때 생성자에 선언된 값에 따라 name 이 kim으로 초기화 된다. 그래서 첫 번째 EL은 "kim"을 출력한다.
- 스크립트릿에서 해당 객체의 name을 변경한다. 그러면 그 값이 적용되어 두 번째 EL에는 "김"이 출력되는 것을 확인할 수 있다.
- 서블릿에 저장된 객체는, (request.getAttribute->request.setAttribute과 같은 연동 작업 없이)스크립트릿 블럭 안에서 자바 코드로 바로 수정할 수 있음을 확인할 수 있다.
참고 :https://skibis.tistory.com/205