JSTL은 개발에 적용하기 위해서는 실제 구현된 라이브러리가 필요하다.
여러 구현 버전이 있지만 Apache Standard Taglib을 주로 사용한다.
http://tomcat.apache.org/download-taglibs.cgi에 접속하여 <Impl>, <Spec>을 다운로드 해주자.
+ EL 까지 다운로드 해주자!!
다운로드한 파일을 아파치 톰캣 라이브러리에 넣어주자.
그리고 인텔리제이로 돌아가 Ctrl + Alt + Shift + S를 누른후
Module > Dependencies > +를 눌러 의존성을 추가해주자.
이렇게 추가되면 OK를 눌러주자.
1️⃣ JSP 생성
[ch07]폴더에 jstlExam.jsp를 생성해주자. 생성된 코드는 아래와 같다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
아래와 같이 수정해주자.
<%@ 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>JSTL 종합 예제</title>
</head>
<body>
<h2>JSTL 종합 예제</h2>
<hr>
</body>
</html>
2️⃣ <c:set>, <c:out>
c:set
<c:set>은 특정 scope에 값을 저장하는 기능을 하는데 scope 내장 객체의 setAttribute() 메서드를 사용하는것과 동일하다.
기본적으로 문자열 형태로 저장하지만 EL을 사용할 경우 배열과 같은 객체도 저장 가능.
target 속성으로 특정 타입의 객체에 setter 메서드를 통한 속성 저장도 가능.
이제 <body>태그의 <hr>아래에 아래의 코드를 적어주자.
<h3>set, out</h3>
<c:set var="product1" value="<h2> 애플 아이폰</h2>" />
<c:set var="product2" value="삼성 갤럭시 노트" />
<c:set var="iniArray" value="${[1, 2, 3, 4, 5]}" />
- product1, product2 라는 이름으로 문자열을 page scope에 저장.
- EL을 이용하여 iniArray 라는 이름으로 선언한 배열을 page scope에 저장.
c:out
<c:out>은 출력을 위한 태그로 대부분은 EL로 대체된다.
다만 출력 객체의 이름을 찾을수 없거나 출력값에 태그를 포함한 경우
이를 보여줄지 아니면 태그가 해석되어 보일지 등을 결정할수 있다.
때에 따라 조건문 사용을 줄이는 용도로 활용이 가능하다.
위에서 선언한 product1, iniArray를 출력할것이다.
아래의 코드를 적어주자.
<p>
product1(jstl):
<c:out value="${product1}" default="Not registerd" escapeXml="true" />
</p>
- default : 출력하고자 하는 객체가 없을경우 출력할 값.
- escapeXml : true인 경우 태그를 일반 문자열로 처리한다. 기본값은 false로 태그가 반영되어 출력된다.
추가적으로 아래코드를 적어보자.
<p>product1(el):${product1}</p>
<p>intArray[2]: ${iniArray[2]}</p>
<hr>
3️⃣ <c:forEach>
사용 형식
<c:forEach [var="참조 객체"] [varStatus="상태 정보 변수"] begin="시작" end="종료"
[step="반복 단계 증가값, 1이 기본"]>
</c:forEach>
- var : 배열, 리스트 등 집합형 객체
- varStatus : 반복 진행 상황을 참조하기 위한 객체.
- 주어진 데이터를 모두 순환하지 않고 특정 구간과 상승 단계 지정이 가능.
코딩 해보기
varStatus 속성을 이용해 index값을 함께 출력해보자.
<!-- forEach -->
<h3>forEach : 배열출력</h3>
<ul>
<c:forEach var="num" varStatus="i" items="${iniArray}">
<li>${i.index} : ${num}</li>
</c:forEach>
</ul>
- <c:forEach> : 자바의 for-in 구조와 유사한 형태.
- &{i.index} : 0부터 반복 시작. 1부터 반복하고 싶으면 ${i.count}를 사용하자.
- intArray : 배열의 원소를 하나씩 꺼내서 num 변수로 가져오므로 별도의 인덱스 없이 배열 원소값이 출력됨.
4️⃣ <c:if>
사용 형식
<c:if test="조건" [var="결과변수"] [scope="{page|request|session|application}"]>
조건이 참(true)인 경우 출력되는 부분
</c:if>
- test에서 선언한 조건을 만족하면 태그 보디 부분을 실행한다.
코딩 해보기
특정조건에만 태그 보디 부분이 수행되는 단순한 구조이므로 복잡한 조건체크엔 적합하지 않음.
아래에 새로만들 변수 checkout 값에 따라 조건을 체크해보자.
true 라면 product2를 출력, false라면 주문 제품이 아니다 라고 출력하게 할것이다.
<!-- if -->
<h3>if</h3>
<c:set var="checkout" value="true" />
<c:if test="${checkout}">
<p>주문 제품 : ${product2}</p>
</c:if>
<c:if test="${!checkout}">
<p>주문 제품이 아님!!</p>
</c:if>
<c:if test="${!empty product2}">
<p>
<b>${product2} 이미 추가됨!!.</b>
</p>
</c:if>
- ${!empty product} 조건으로 product 변수에 값이 들어가 있는지 체크하고 출력.
5️⃣ <c:choose>, <c:when>, <c:otherwise>
if ~ else if문 혹은 switch 문과 같은 형식으로 사용할수있다.
단순하게 <c:if>만 사용하는것보다 정교한 처리가 가능하지만 복잡한 구성 조건은 권장 하지 않는다.
<!-- choose, when, otherwise -->
<h3>choose, when, otherwise</h3>
<c:choose>
<c:when test="${checkout}">
<p>주문 제품: ${product2}</p>
</c:when>
<c:otherwise>
<p>주문 제품이 아님!!</p>
</c:otherwise>
</c:choose>
<hr>
6️⃣ <c:forTokens>
자바의 StringTokenizer와 유사하게 구분자로 문자열을 나누는(파싱) 태그다.
출력할 문자열이 구분자로 분리되어 있을 때 모든 값을 반복해서 출력하는 경우에 유용하다.
<!-- forTokens -->
<h3>forTokens</h3>
<c:forTokens var="city" items="Seoul|Tokyo|New York|Toronto" delims="|" varStatus="i">
<c:if test="${i.first}">도시 목록 : </c:if>
${city}
<c:if test="${!i.last}">,</c:if>
</c:forTokens>
- 구분자 I 로 도시이름을 파싱한다.
- 첫번째 순환에서 조건 체크를 통해 도시목록: 문자열을 먼저 출력
- 파싱한 도시명은 다시 콤마로 구분한다. 이때 마지막 데이터에는 콤마가 들어가면 안되기 때문에 i.last 를 체크해 처리한다.
전체 코드는 아래와 같다.
<%@ 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>JSTL 종합 예제</title>
</head>
<body>
<h2>JSTL 종합 예제</h2>
<hr>
<h3>set, out</h3>
<c:set var="product1" value="<h2> 애플 아이폰</h2>" />
<c:set var="product2" value="삼성 갤럭시 노트" />
<c:set var="iniArray" value="${[1, 2, 3, 4, 5]}" />
<p>
product1(jstl):
<c:out value="${product1}" default="Not registerd" escapeXml="true" />
</p>
<p>product1(el):${product1}</p>
<p>intArray[2]: ${iniArray[2]}</p>
<hr>
<!-- forEach -->
<h3>forEach : 배열출력</h3>
<ul>
<c:forEach var="num" varStatus="i" items="${iniArray}">
<li>${i.index} : ${num}</li>
</c:forEach>
</ul>
<hr>
<!-- if -->
<h3>if</h3>
<c:set var="checkout" value="true" />
<c:if test="${checkout}">
<p>주문 제품 : ${product2}</p>
</c:if>
<c:if test="${!checkout}">
<p>주문 제품이 아님!!</p>
</c:if>
<c:if test="${!empty product2}">
<p>
<b>${product2} 이미 추가됨!!.</b>
</p>
</c:if>
<hr>
<!-- choose, when, otherwise -->
<h3>choose, when, otherwise</h3>
<c:choose>
<c:when test="${checkout}">
<p>주문 제품: ${product2}</p>
</c:when>
<c:otherwise>
<p>주문 제품이 아님!!</p>
</c:otherwise>
</c:choose>
<hr>
<!-- forTokens -->
<h3>forTokens</h3>
<c:forTokens var="city" items="Seoul|Tokyo|New York|Toronto" delims="|" varStatus="i">
<c:if test="${i.first}">도시 목록 : </c:if>
${city}
<c:if test="${!i.last}">,</c:if>
</c:forTokens>
</body>
</html>
참고로 테스트시 html, jsp로 직접열면 태그가 그대로 노출될것이다. 원래 컨트롤러로 해야 노출이 안된다.
임시 해결 방편은
맨 첫줄에 아래의 코드를 적어주는것이다.
isELIgnored="false"
요로 코롬.
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
[메인으로 돌아가기]
'Java Spring > 책공부 1 (JSP와 스프링)' 카테고리의 다른 글
14. 고급 컨트롤러 서블릿 구현 (0) | 2022.07.11 |
---|---|
13. 컨트롤러 기초 : 계산기 구현 (0) | 2022.07.11 |
11. 액션 종합: 계산기 구현 (0) | 2022.07.09 |
10. JSP 프로그래밍: 계산기 구현 (0) | 2022.07.09 |
9. JSP 기초 종합 예제 (0) | 2022.07.09 |