EL의 대표적인 형태는 ${--.--} 이다. EL의 특징은 아래와 같다.
- JSP 스크립트의 표현식을 대신하여 속성 값을 쉽게 출력할 수 있도록 고안된 언어이다.
따라서 표현식(<%= %>)을 대체할 수 있다.- 왼쪽 --은 반드시 java.util.Map 객체 또는 Java Bean 객체여야 한다.
- 오른쪽 --은 반드시 Map의 키이거나 Bean 프로퍼티여야 한다.
EL 문법의 예시는 아래와 같다.
<%= ((model.MemberDto) request.getAttribute("userinfo")).getZipDto().getAddress() %>
=> ${ userinfo.zipDto.address }
EL에는 . 대신 [] 로도 객체의 값에 접근할 수 있다.
따라서 위 예시는 ${ userinfo[zipDto[address]] }
로도 표현 가능하다.
리스트나 배열 요소에는 인덱스로 접근 가능하다. 아래 예시를 살펴보자.
// Servlet
String[] names = {"홍길동", "이순신", "임꺽정"};
request.setAttribute("userNames", names);
// JSP
${ userNames[0] } // 홍길동 출력
${ userNames["1"] } // 이순신 출력
문자로 된 인덱스 값은 알아서 숫자로 변경된다.
EL의 내장 객체는 아래와 같다.
EL에서 객체에 접근하는 방법은 아래와 같다.
request.setAttribute("userinfo", "안효인");
${ requestScope.userinfo }, ${ userinfo }
${ pageContext.request.userinfo }
url?name=안효인$fruit=사과$fruit=바나나
${ param.name }
${ paramValues.fruit[0] }
만약 ${ userinfo }
처럼 property 이름만 사용할 경우
pageScope -> requestScope -> sessionScope -> applicationScope 순으로 객체를 찾는다.
EL에서 객체 멤버 변수에 접근하는 방법은 아래와 같다.
// Servlet
request.setAttribute("samsung.user", memberDto); // 객체 할당
// JSP
${ samsung.user.name } <%-- 오류 발생 --%>
${ requestScope["samsung.user"].name } <%-- 객체의 name 멤버변수 값 출력 --%>
EL에서 쿠기에 접근하는 방법은 아래와 같다.
${ cookie.userId.value } <%-- 쿠키 값 출력 --%>
cookie가 null이거나, userId가 null이거나, value가 null이면 빈 문자열이 출력된다.
EL 연산자는 아래와 같다.
{ empty var } 에서 true를 반환하는 경우는 아래와 같다.
- var이 null일 때
- var이 값이 빈 문자열일 때
- var이 길이가 0인 배열일 때
- var이 빈 Map 객체일 때
- var이 빈 Collection 객체일 때
EL에서 객체 메서드를 호출하는 방법은 아래와 같다.
<%
List<MemberDto> list = dao.getMembers();
request.setAttribute("users", list);
%>
${ requestScope.users.size() } <%-- 객체 메서드 결과 출력 --%>
이 때, ${ users.size } 를 출력하면 <%= request.getAttribute("users").getSize() %> 로 해석된다.
JSTL은 JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하기 위한 수단이다.
선언 형식은 <%@ taglib prefix="prefix" uri="uri" %> 이다. 예시는 아래와 같다.
가장 많이 쓰이는 core 태그의 선언 방법은
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>이다.
예시는 아래와 같다.
변수나 특정 객체의 프로퍼티에 값을 할당할 때는 <c:set>을 사용한다.
예시는 아래와 같다.
객체의 속성값에 값을 할당할 때는 target에 객체를 설저하고 property에 속성명을 설정한다.
예외 처리를 수행할 때는 <c:catch>를 사용한다.
try-catch 처럼 예외 처리를 한 예시는 아래와 같다.
<%@ page contentType="text/html" pageEncoding="UTF-8" errorPage="error.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:catch var="ex>
<%
String str = null;
out.println("Length of string : " + str.length());
%>
</c:catch>
<c:if test="${ex != null}">
예외가 발생했습니다. {$ex.message}
</c:if>
예외가 발생하면 ex에 값이 할당되고, 예외 처리된다.
조건을 줄 때는 <c:if>를 사용한다. 예시는 아래와 같다.
<c:if test="${userType eq 'admin'}">
<jsp:include page="admin.jsp" /> <%-- 동적으로 페이지 할당 --%>
</c:if>
다중 조건을 줄 때는 <c:choose><c:when><c:otherwise>를 사용한다. 예시는 아래와 같다.
<c:choose>
<c:when test="${userType == 'admin'}"> <%-- if --%>
관리자 화면...
</c:when>
<c:when test="${userType == 'member'}"> <%-- else if --%>
회원 사용자 화면...
</c:when>
<c:otherwise> <%-- else --%>
일반 사용자 화면...
</c:otherwise>
</c:choose>
반복문을 줄 때는 <c:forEach>를 사용한다. 예시는 아래와 같다.
실행 결과는 아래와 같다.