개발/JSP
JSP - EL(Expression Language)
함수형 인간
2025. 3. 5. 07:10
JSP EL (Expression Language)
JSP EL(Expression Language)은 JSP 페이지에서 데이터를 간결하고 편리하게 출력하거나, 속성(attribute), 파라미터, 쿠키, 헤더 등의 값에 접근하고, 간단한 연산을 수행하기 위해 사용되는 스크립트 언어다 . EL을 사용하면 JSP 코드 내에서 Java 코드(스크립틀릿) 사용을 최소화하여 가독성과 유지보수성을 높일 수 있다.
1. EL의 특징 및 장점
- 간결성: 복잡한 Java 코드 없이도 데이터를 쉽게 출력할 수 있다.
- 가독성 향상: 스크립틀릿(<% ... %>)보다 훨씬 간결하고 가독성이 좋다.
- NullPointerException 방지: 접근하려는 객체가 null인 경우, NullPointerException이 발생하는 대신, 빈 문자열("")을 반환하거나 아무것도 출력하지 않는다.
- 자동 형변환: 대부분의 경우, 데이터 타입 변환을 명시적으로 하지 않아도 자동으로 처리된다. (예: 문자열을 숫자로 자동 변환)
- 다양한 내장 객체: JSP의 내장 객체(request, response, session, application, param, ...)에 쉽게 접근할 수 있다.
- 연산자 지원: 산술, 관계, 논리 연산자를 사용하여 간단한 연산을 수행할 수 있다.
- 정적 메서드 호출: (EL 3.0부터) Java 클래스의 정적(static) 메서드를 호출할 수 있다.
2. EL의 기본 문법
- ${}: EL 표현식은 ${} 안에 작성.
- List, Map과 같은 컬렉션의 요소에도 쉽게 접근할 수 있다.
- List:
- [] 연산자를 사용하여 인덱스로 접근. (0부터 시작)
- ${list[0]}, ${myList[2]}
- Map:
- [] 연산자 또는 . 연산자를 사용하여 키(key)로 접근.
- ${map["key"]}, ${myMap.key}
- List:
3. EL 내장 객체 (Implicit Objects)
EL은 JSP의 다양한 내장 객체에 쉽게 접근할 수 있도록 미리 정의된 객체들을 제공.
내장 객체설명
pageContext | javax.servlet.jsp.PageContext 객체. 다른 내장 객체에 접근하거나, 페이지 관련 정보 얻기 |
pageScope | Page Scope에 저장된 속성(attribute)에 접근하는 Map 객체 |
requestScope | Request Scope에 저장된 속성에 접근하는 Map 객체 |
sessionScope | Session Scope에 저장된 속성에 접근하는 Map 객체 |
applicationScope | Application Scope(ServletContext)에 저장된 속성에 접근하는 Map 객체 |
param | 요청 파라미터(단일 값)에 접근하는 Map 객체 (String) |
paramValues | 요청 파라미터(여러 값)에 접근하는 Map 객체 (String[]) |
header | 요청 헤더(단일 값)에 접근하는 Map 객체 |
headerValues | 요청 헤더(여러 값)에 접근하는 Map 객체 |
cookie | 쿠키에 접근하는 Map 객체 |
initParam | 웹 애플리케이션 초기화 파라미터(context parameter)에 접근하는 Map 객체 |
- Scope 우선순위: pageScope -> requestScope -> sessionScope -> applicationScope 순으로 속성을 찾는다. (가장 좁은 범위부터)
- Scope 생략: Scope를 명시하지 않으면, 위 우선순위 순서대로 속성을 찾는다.
4. EL 연산자
연산자 종류연산자설명
산술 연산자 | +, -, *, / (또는 div), % (또는 mod) | 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 |
관계 연산자 | == (또는 eq), != (또는 ne), < (또는 lt), > (또는 gt), <= (또는 le), >= (또는 ge) | 동등, 부등, 작음, 큼, 작거나 같음, 크거나 같음 |
논리 연산자 | && (또는 and), ` | (또는or),!(또는not`) |
empty 연산자 | empty | 값이 null이거나 비어 있는지(empty string, empty collection) 확인. empty x는 `x == null |
조건(삼항) 연산자 | condition ? expr1 : expr2 | condition이 true이면 expr1을, false이면 expr2를 반환 |
.(dot) | 객체.프로퍼티 | 객체의 프로퍼티(또는 Map의 key)에 접근 |
[] | 객체["프로퍼티"] 또는 리스트[인덱스] 또는 맵["키"] | 객체의 프로퍼티, 리스트의 요소, 맵의 값에 접근 |
5. EL 사용 예시
Java
<%-- User 객체가 request scope에 "user"라는 이름으로 저장되어 있다고 가정 --%>
<%
User user = new User();
user.setId("test");
user.setName("테스터");
request.setAttribute("user", user);
List<String> colors = new ArrayList<>();
colors.add("red");
colors.add("blue");
request.setAttribute("colors" , colors);
Map<String, Object> map = new HashMap();
map.put("A", "apple");
request.setAttribute("map", map);
%>
<html>
<head>
<title>EL Example</title>
</head>
<body>
<h2>User Information</h2>
<p>User ID: ${user.id}</p> <%-- 객체의 프로퍼티 접근 --%>
<p>User Name: ${user.name}</p>
<p>User Name: ${user["name"]}</p> <%-- 객체의 프로퍼티 접근 --%>
<h2>Request Information</h2>
<p>Request Method: ${pageContext.request.method}</p> <%-- pageContext를 통해 request 객체 접근 --%>
<p>Context Path: ${pageContext.servletContext.contextPath}</p>
<h2>Parameters</h2>
<p>Name Parameter: ${param.name}</p> <%-- 요청 파라미터 (단일 값) --%>
<p>Colors Parameter: ${paramValues.colors[0]}, ${paramValues.colors[1]}</p> <%-- 요청 파라미터 (배열) --%>
<h2>Conditional Expression</h2>
<p>Is Name Empty?: ${empty param.name}</p> <%-- empty 연산자 --%>
<p>Greeting: ${empty param.name ? 'Guest' : param.name}</p> <%-- 삼항 연산자 --%>
<h2>Arithmetic operations</h2>
${1+4} <br/>
${5 div 2} <br/>
<h2>List</h2>
${colors[0]} <br/>
<h2>Map</h2>
${map.A}
${map["A"]}
<h2>Header</h2>
User-Agent : ${header["User-Agent"]}
</body>
</html>
6. 인스턴스 메서드 호출
EL에서는 JavaBean 객체의 getter 메서드뿐만 아니라, 일반적인 인스턴스 메서드도 호출할 수 있다.
Java
${object.methodName(param1, param2, ...)}
예시:
Java
// MyBean.java
package com.example;
public class MyBean {
public String toUpperCase(String str) {
return str.toUpperCase();
}
public int add(int a, int b) {
return a + b;
}
}
Java
<jsp:useBean id="myBean" class="com.example.MyBean" />
<p>Uppercase: ${myBean.toUpperCase("hello")}</p> <%-- HELLO --%>
<p> 5 + 3 = ${myBean.add(5,3)}</p>
10.6 정적 메서드 호출
EL 2.2부터는 정적(static) 메서드 호출도 지원. 단, 이를 위해서는 web.xml 또는 태그 파일에서 설정을 해야 한다.
web.xml (또는 tag file) 설정:
XML
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<scripting-invalid>false</scripting-invalid>
<is-xml>false</is-xml>
<include-prelude>/WEB-INF/jspf/prelude.jspf</include-prelude>
<include-coda>/WEB-INF/jspf/coda.jspf</include-coda>
<trim-directive-whitespaces>true</trim-directive-whitespaces>
<default-content-type>text/html</default-content-type>
</jsp-property-group>
<taglib>
<taglib-uri>http://example.com/functions</taglib-uri>
<taglib-location>/WEB-INF/functions.tld</taglib-location>
</taglib>
</jsp-config>
functions.tld 파일
XML
<?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">
<tlib-version>1.0</tlib-version>
<short-name>Functions</short-name>
<uri>http://example.com/functions</uri>
<function>
<name>max</name>
<function-class>java.lang.Math</function-class>
<function-signature>int max(int, int)</function-signature>
</function>
<function>
<name>reverseString</name>
<function-class>com.example.StringUtils</function-class> <function-signature>java.lang.String reverse(java.lang.String)</function-signature>
</function>
</taglib>
StringUtils.java (유틸리티 클래스):
Java
package com.example;
public class StringUtils {
public static String reverse(String text) {
return new StringBuilder(text).reverse().toString();
}
}
JSP에서 사용:
Java
<%@ taglib prefix="f" uri="http://example.com/functions" %>
<p>Max(10, 20): ${f:max(10, 20)}</p> <%-- 결과 : 20, java.lang.Math 클래스의 max() 메서드 호출 --%>
<p>Reverse: ${f:reverseString("hello")}</p> <%-- 결과: olleh --%>