9월 21일 D+40 [JSP 15장 : 표현 언어(Expression Language)]
표현 언어 (EL, Expression Language)
* JSP에서 사용가능한 새로운 스크립트 언어
* EL의 주요 기능
- JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용 : response, request, page, Application
- 집합 객체에 대한 접근 방법 제공 : 배열, 컬렉션(list, set, map)
- 수치 연산, 관계 연산, 논리 연산자 제공
- 자바 클래스 메서드 호출 기능 제공
- 표현 언어만의 기본 객체 제공
* 간단한 구문 때문에 표현식<%= %> 대신 사용한다.
구문
* 기본 문법 : ${expr}, #{expr}
* 사용예
<jsp:include page="/module/${skin.id}/header.jsp" />
<b>${sessionScope.member.id}</b> 님 환영합니다.
---------------------------------------------------------------
Member m = session.getAttribute("mnember");
String id = m.getId();
* ${expr}은 표현식이 실행되는 시점에 바로 값을 계산 : ++a
* #{expr}은 값이 실제로 필요한 시점에 값 계산 : a++ ➡️ JSP 템플릿 텍스트에서는 사용 불가함
* 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용함
* ${expr}과 #{expr}의 동작 방식 예
EL에서 기본 객체
기본 객체 | 설명 |
pageContext | JSP의 page 기본 객체와 동일하다. |
pageScope | pageContext 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체. |
requestScope | request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체. |
sessionScope | session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체. |
applicationScope | application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체. |
param | 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체. |
paramValues | 요청 파라미터의 <파라미터이름, 값배열> 매핑을 저장한 Map 객체. |
header | 요청 정보의 <헤더이름, 값> 매핑을 저장한 Map 객체. |
headerValues | 요청 정보의 <헤더이름, 값 배열> 매핑을 저장한 Map 객체. |
cookie | <쿠키 이름, Cookie> 매핑을 저장한 Map 객체. |
initParam | 초기화 파라미터의 <이름, 값> 매핑을 저장한 Map 객체. |
EL 데이터 타입
* 불리언(Boolean) 타입 : true와 false
* 정수 타입 : 0 ~ 9로 이루어진 정수 값
* 실수 타입 : 0 ~ 9로 이루어져 있음, 소수점('.')을 사용할 수 있음, 3.24e3과 같이 지수형으로 표현 가능
* 문자열 타입 : 따옴표(' 또는 ")로 둘러싼 문자열
* 널 타입: null
연산자
* 수치 연산자
- + : 덧셈
- - : 뺄셈
- * : 곱셈
- / 또는 div : 나눗셈
- % 또는 mod : 나머지
* 비교 연산자
- == 또는 eq : 같다
- != 또는 ne : 같지 않다
* 논리 연산자
- && 또는 and
- || 또는 or
- ! 또는 not
* empty 연산자
- empty<값>
- 값이 null : true
- 값이 빈 문자열("") : true
- 값의 길이가 0인 배열, 콜렉션 : true
- 이외의 경우에는 false
EL에서 클래스 메서드 호출하기
* 클래스의 static 메서드를 EL에서 호출 가능 : 클래스의 SimpleDateFormat 메서드를 호출하려고 함
* EL에서 호출하려면 다음의 작업이 필요함
1️⃣ EL 함수를 정의한 TLD 파일 작성
2️⃣ web.xml 파일에 TLD 파일 지정
3️⃣ JSP 코드에서 TLD에 정의한 함수 실행
1️⃣ EL 함수를 정의한 TLD 파일 작성
WEB-INF 폴더 ➡️ new ➡️ others... ➡️ XML File 선택 ➡️ 이름을 전부 지우고 'el-functions.tld' 생성 (파일종류까지 새로 생성하는 것)
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>EL에서 함수실행</description>
<tlib-version>1.0</tlib-version>
<short-name>ELfunctions</short-name>
<function>
<description>Date 객체 포맷팅</description>
<name>dateFormat</name>
<function-class>ez.el.DateUtil</function-class>
<function-signature>java.lang.String format(java.util.Date)</function-signature>
</function>
</taglib>
2️⃣ web.xml 파일에 TLD 파일 지정
WEB-INF 폴더 ➡️ web.xml 파일 ➡️ <jsp-config></jsp-config> 안에 만들어줌
✅ jsp-config는 web.xml파일 안에서 한 번에 한개만 사용할 수 있음. 이미 만들어 놓은 것이 있다면, 원래 있던 것 위에 <taglib-uri>를 넣으면 된다 : <jsp-config>태그 안에 순서가 있기 때문에, 순서에 맞게 넣어주면 됨
<jsp-config>
<taglib>
<taglib-uri>/WEB-INF/tlds/el-functions.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/el-functions.tld</taglib-location>
</taglib>
<jsp-property-group>
<url-pattern>/aug31/view/*</url-pattern>
<include-prelude>/aug31/common/variable.jspf</include-prelude>
<include-coda>/aug31/common/footer.jspf</include-coda>
</jsp-property-group>
</jsp-config>
3️⃣ JSP 코드에서 TLD에 정의한 함수 실행(EL 함수 호출)
<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page session="false" %>
<%@ taglib prefix="elfunc" uri="/WEB-INF/el-functions.tld" %>
<%
java.util.Date today = new java.util.Date();
request.setAttribute("today", today);
%>
<html>
<head><title>EL 함수 호출</title></head>
<body>
오늘은 <b>${elfunc:dateFormat(today) }</b> 입니다.
</body>
</html>
${elfunc:dateFormat(today)} 는 3번째라인의 prefix="elfunc"에서 정의하듯이, TLD에 정의된 함수명을 말한다.
EL의 용법
* request나 session 속성으로 전달한 값을 출력함
* 액션 태그나 커스텀 태그의 속성 값이 된다
: <jsp:include page="/IO/${layouy.module}.jsp" flush="true"/>와 같이 사용함
* 함수를 호출함 : 코드의 간결함과 가독성이 향상된다.