학습(구)/JSP

표현 언어(EL)

잉아당 2020. 9. 16. 22:07
728x90
스크립트릿 <% ~~ %>
함수 선언부 <%! ~~~%>
표현식 <%= ~~~%>

이때까지는 Java를 스크립트릿을 사용해서 동적 요소를 표현했습니다. 이것은 가독성이 별로 좋지 못합니다.

그리고 이러한 요소들은 JVM에서 처리되어 결과만 JSP페이지가 받는 방식이였습니다.

그러므로 JSP 자체에서 처리하며 가독성이 좋은 표현 언어, JSTL, 커스텀 태그를 사용합니다.

 

표현 언어(EL)

EL은 JSP 문서에서 값 출력을 수행하는 언어입니다. 

EL이 3.0으로 넘어오면서 람다, 스트림 API 등 여러 기능이 사용 가능하게 됬습니다.

EL은 액션 태그, JSTL 태그, 커스텀 태그 등을 사용하여 값을 동적으로 생산하면 이를 JSP 문서에 포함시킵니다. 

 

EL 기능(3.0)

주요 기능 설명
EL 기본 객체 제공 11개의 기본 객체 제공
다양한 연산자 제공 값 생산을 위한 각종 연산자 제공
메서드 호출 객체 메서드 및 클래스 메서드 호출
람다 사용 람다 표기를 사용한 함수 정의와 실행
스트림 API 제공 기본 컬렉션에 대해 스트림 API 제공
영역 객체 사용  4개의 영역 객체 사용

EL의 기본 사용법은 다음과 같습니다.

 

${EL 표현식} => 정적 바인딩

#{EL 표현식} => 동적 바인딩

 

바인딩이란 속성의 특정값을 결정하는 행위 입니다. 

정적 바인딩은 런타임 이전에 바인딩합니다.

동적 바인딩은 런타임에 바인딩합니다.

 

<%-- ${EL 표현식} 사용 --%>
<c:set var="subject1" value="JSP" />
<%-- name1의 값을 subject1의 값으로 정적 바인딩한다. --%>
<c:set var="name1" value="${subject1}" />
<%-- subject1의 값을 Spring으로 변경한다. --%>
<c:set var="subject1" value="Spring" />
<%-- subject1의 값을 변경하였지만 –-%.
<%-- name1의 값은 정적 바인딩 되었기 때문에 변경되지 않는다. --%> 
name1 : ${name1} <br/><br/>


<%-- #{EL 표현식} 사용 --%>
<c:set var="subject2" value="JSP" />
<%-- name2의 값을 subject2의 값으로 동적 바인딩한다. --%>
<c:set var="name2" value="#{subject2}" />
<%-- subject2의 값을 Spring으로 변경한다. --%>
<c:set var="subject2" value="Spring" />
<%-- subject2의 값을 변경하면 name2의 값도 변경된다. --%>
<%-- #{subject2}는 값을 고정시키지 않고 값 연결 방법만을 지정한다. --%>
name2 : ${name2}<br/>

4개의 영역 객체는 <속성, 값>인 Map 구조로 정보를 제공하며 이를 사용하면 자바 구현과 EL 사이에 정보공유가 가능합니다. 

영역 객체를 사용할 때 영역객체를 지정하지 않고 속성지정으로만 사용이 가능하며 EL이 4개의 영역 객체를 page, request, session, application 순으로 차례대로 조사하여 저장된 속성을 찾습니다.

 

EL 표현식에서 기본 객체의 값을 사용할 경우 getter을 사용지 않고 .(점)이나 [](대괄호) 연산자로 프로 퍼티를 지정하여 객체 프로퍼티의 값을 사용합니다.

 

<%@ page contentType = "text/html; charset=utf-8" %> 
<%
request.setAttribute("name", "강익태");
%>
<html>
<head><title>EL 객체 사용하기</title></head>
<body>
<%-- 객체의 멤버를 접근할 때에는 게터를 사용하지 않고 프로퍼티를 사용하여 접근한다.--%>
요청 URI: ${pageContext.request.requestURI}<br>
<%-- 자바 구현 스크립트의 영역 객체를 EL의 Scope 영역 객체로 접근한다. --%> 
requestScope의 name 속성 : ${requestScope.name}<br>
<%-- EL의 param 기본 객체를 사용하여 요청 파라미터에 접근한다. --%> 
subject 파라미터 : ${param.subject}
</body>
</html>

EL로 값 표현, 연산식 게산, 함수 호출이 가능합니다.

<%@ page contentType = "text/html; charset=utf-8" %> 
<%!
public int multiply(int a , int b) { 
int c = a * b;
return c;
 } %>
<html>
<head><title>자바 구현 스크립트의 Expression</title></head> 
<body>
<%
int sum = 0;
for (int i = 1 ; i <= 10 ; i++) {
sum = sum + i;
} %>
<%-- 스크립트 변수를 표현식으로 사용한다. --%> 
1 부터 10까지의 합은 <%= sum %> 입니다. 
<br/><br/>
1 부터 10까지의 합은
<%-- 연산식을 표현식으로 사용한다. --%>
<%= 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 %>
입니다.
<br/><br/>
<%-- 값을 반환하는 함수 호출을 표현식으로 사용한다. --%> 
10 * 25 = <%= multiply(10, 25) %>
</body>
</html>

EL표현식의 연산자의 내용은 대부분 자바 연산자와 거의 동일합니다. 그러나 배정 연산자('=')를 사용하여 EL 변수를 생성하는 것( 변수가 없으면 생성) 과 세미콜론 연산자를 사용하여 식의 값을 소멸시키는 것 등 다른 부분이 존재합니다. =>3.0버전에서만 가능합니다.

 

<%-- EL 3.0 변수 생성 --%>
<%-- 배정 연산자를 사용하여 변수 생성과 동시에 변수에 값 할당 및 식의 값을 출력 --%>
${val3 = 10}
<%-- EL 3.0의 세미콜론 연산자 사용 --%>
<%-- 세미콜론 연산자는 연산자 왼쪽에 위치하는 연산식의 값은 출력하지 않고 연산만하고 --%>
<%-- 오른쪽에 위치하는 연산자는 연산하여 출력 --%>
${1+1 ; 10 + 20}
${val4 = 10 ; ‘’} 
<%-- ‘’은 빈 문자열 출력 --%>

 

EL표현식에서의 컬렉션 사용

<%-- EL 3.0의 List 컬렉션 사용 --%>
<%-- value 속성에서 EL 표현식으로 사용하여 List 리터럴로 LIst 컬렉션 객체를 직접 생성 --%>
<c:set val=“val2” value=“${[1, 2, 3]}” />

<%-- EL 3.0의 Map 컬렉션 사용 --%>
<%-- value 속성에서 EL 표현식으로 사용하여 Map 리터럴로 Map 컬렉션 객체를 직접 생성 --%>
<c:set val=“val2” value=“${{‘name’ : ‘홍길동’, ‘age’ : 30}}” />

<%-- EL 3.0의 Set 컬렉션 사용 --%>
<%-- value 속성에서 EL 표현식으로 사용하여 Set 리터럴로 Set 컬렉션 객체를 직접 생성 --%>
<c:set val=“val2” value=“${{‘a’, ‘b’, ‘c’}}” />

 

자바 구현 스크립트에서 생성한 객체를 EL표현식에서 사용하기 위해서는 JSTL을 사용하여 영역 객체를 통해 EL 해당 객체를 EL변수로 등록하여 프로퍼티로 접근하여 해당 객체를 사용합니다.

 

<%@ page contentType="text/html; charset=utf-8"%> 
<%@page import="chap06.Thermometer"%>
<%
Thermometer thermometer = new Thermometer(); 
request.setAttribute("t", thermometer); //request 영역 객체에 저장
%> 
<html> 
<head>
<title>객체 메서드 사용 예제</title> </head>
<body>
<%-- 자바 구현 스크립트에서 생성한 Termometer 객체를 직접 접근한다. --%> 
<%-- celsius 세터를 사용하여 HashMap에 새로운 엔트리를 생성한다. --%>
${t.setCelsius('진주', 20)}
<%-- celsius 게터와 fahrenheit 게터를 사용하여 해당 프로퍼티를 읽는다 --%>
진주 온도: 섭씨 ${t.getCelsius('진주')}도 / 화씨 ${t.getFahrenheit('진주')}도 <br/>
정보 : ${t.info}
</body> 
</html>

EL 3.0에서는 람다와 스트림도 사용이 가능합니다.