이번 실습에서는 JSTL과 EL을 활용한 jsp 구현을 살펴본다. 올바른 MVC 패턴 기반의 jsp 활용을 위해 JSTL과 EL은 자유롭게 활용할 수 있어야 한다.

실습을 통해 기본 JSTL 태그들과 EL을 화면 구성에 활용할 수 있다.

실습 내용

예제 파일은 jstlExam.jsp 로 생성하고 기본 코드는 다음에서 부터 시작 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>JSTL core tag examples</h2>
	<hr>
</body>
</html>

set은 특정 scope에 값을 저장한다. scope 내장객체의 setAttribute() 를 사용하는 것과 동일하다. 기본적으로 문자열 형태의 저장이 이루어지지만 EL을 사용할 경우 배열등도 저장이 가능하며 target 속성을 통해 특정 타입의 객체에 setter 메서드를 통한 속성 저장도 가능하다.

<!-- set, out -->
<h3>set, out</h3>
<c:set var="product" value="<b>Apple Iphone</b>" />
<c:set var="intArray" value="${[1,2,3,4,5]}" />

out 은 출력을 위한 태그로 대부분의 경우 EL로 대체가 된다. 다만 출력 객체 이름을 찾을수 없거나 출력값에 태그를 포함한 경우 이를 보여줄지 아니면 태그가 해석되어 보여질지 등을 결정할 수 있어 경우에 따라서는 조건문 사용을 줄이는 용도로 활용할 수 있다.

<p>
	product name(jstl):
	<c:out value="${product}" default="Not registerd" escapeXml="true" />
</p>
<p>product name(el):${product}</p>
<p>array[2] value: ${intArray[2]}</p>

<hr>

실행 결과는 다음과 같다.

set,out 실행결과

forEach는 JSTL에서 가장 널리 사용되는 태그중 하나이다. 여기서는 가장 기본적인 활용만 실습해보고 고급 활용은 별도 예제로 살펴본다.

앞에서 set을 이용해 선언했던 배열 값을 출력한다. varStatus 를 이용해 index 값을 함께 출력 하도록 했다.

<!-- forEach -->
<h3>forEach Basic</h3>
<ul>
	<li>Print all items in array</li>
	<c:forEach var="num" varStatus="i" items="${intArray}">
		<li>${i.index} : ${num}</li>
	</c:forEach>
</ul>

<hr>

forEach 실행결과

if 역시 forEach와 함께 JSTL에서 가장 널리 사용되는 태그중 하나이다. 특정 조건에만 태그 바디 부분이 수행되는 단순한 구조이므로 복잡한 조건 체크에는 적합하지 않다.

checkout 변수 값에 따라 조건 체크를 하도록 구성된 예제이다. true 인 경우 앞의 set 에서 설정했던 product 정보를 출력한다. false 인 경우 No Checkout 메시지가 출력된다.

<!--  if -->
<h3>if</h3>
<c:set var="checkout" value="true" />
<c:if test="${checkout}">
	<p>Order: ${product}</p>
</c:if>
<c:if test="${!checkout}">
	<p>No checkout!!</p>
</c:if>

<c:if test="${!empty product}">
	<p>
		<b>${product} Already added!!.</b>
	</p>
</c:if>

<hr>

if 실행결과

if ~ else if 혹은 switch 문의 형식으로 사용할 수 있다. 단순하게 if만 사용하는것 보다는 보다 정교한 처리가 가능하지만 복잡한 조건 구성은 권장되지 않는다.

checkout 이 true 이며 상품정보를 출력하고 그외 조건이면 No checkout 을 출력한다.

<!-- choose, when, otherwise  -->
<h3>choose, when, otherwise</h3>
<c:choose>
	<c:when test="${checkout}">
		<p>Order product: ${product}</p>
	</c:when>
	<c:otherwise>
		<p>No Checkout!!</p>
	</c:otherwise>
</c:choose>

<hr>

if 실행결과

자바의 StringTokenizer 와 유사하게 구분자로 문자열을 파싱하는 태그이다. 출력할 문자열들이 구분자로 분리되어 있을때 모든값을 반복해서 출력하는 경우 유용하다.

예제에서는 |로 구분된 도시명들을 forTokens 를 이용해 출력하고 있다. 조건 체크를 통해 첫번째 순환인 경우 City ist:라는 문자열을 먼저 출력하고 파싱한 도시명은 다시 콤마로 구분한다. 이때 마지막 데이터에는 콤마가 들어가면 안되기 때문 i.last 를 체크해 처리 했다.

	<!-- forTokens 예 -->
	<h3>forTokens</h3>
	<c:forTokens var="city" items="Seoul|Tokyo|New York|Toronto"
		delims="|" varStatus="i">
		<c:if test="${i.first}">City list : </c:if>
     ${city} 
     <c:if test="${!i.last}">,</c:if>
	</c:forTokens>

	<hr>

forTokens 실행결과