JSTL 개요
Custom Tag
- JSP에서 반복적으로 사용되는 프로그램 로직을 캡슐화하여 태그 형태로 정의한 것
- JSP 페이지에서 scriptlet (java code)을 대체하기 위해 사용 - JSP에서 바로 Java 코드를 작성하는 건 안 좋음
JSP Standard Tag Library (JSTL)
- JSP와 함께 Java EE Platform에 포함됨
- JSP 개발에서 공통적으로 사용되는 유용한 custom tag들을 정의
- MVC 구조에서 collection과 같이 여러 원소들을 포함하는 데이터를 처리할 때 특히 유용
- Expression Language (EL)와 함께 사용
설치
- Maven repository에서 JSTL API 및 구현체 library를 직접 download
- jstl-1.2.jar 파일을 Web application 내의 WEB-INF/lib 폴더에 복사
- Maven dependency 설정을 통해 자동 download (권장)
Maven
https://kimmy100b.github.io/maven/2020/09/16/maven/
JSTL 구성
해당 Library 쓰려면 uri, prefix로 미리 어떤 것을 쓸 거라고 정의해야 한다.
- Core 기능 : 변수 설정 및 제거, 흐름제어, URL 사용 등 ( 처음에 미리 정의 안 하고 사용했다가 삽질한 경험 있..)
- uri : http://java.sun.com/jsp/jstlcore
- prefix : c
- Funtion 기능 : 다양한 기능의 함수 제공
- uri : http://java.sum.com/jsp/jstl/functions
- prefix : fn
Expression Language (EL)
- JSP에서 JavaBeans나 Map과 같은 Java component를 Java code(scriptlet)를 사용하지 않고 쉽게 접근하게 해 주는 언어
- standard part of JSP 2.0 +
- JSP 또는 JSTL과 함께 사용됨
- ${expression} 형식을 사용하여 다음과 같은 것들을 접근 가능
- JavaBean properties
- Map, List, 또는 배열의 원소 (collection)
- Servlet 내장객체의 속성
- ex) JavaBean에 대한 접근
// EL
${person.name} 또는 ${person["name"]}
// Java (script tag)
<%= ((Person) request.getAttribute("person")).getName() %>
- EL 내장객체
- pageScope, requestScope, sessionScope, applicationScope
- ${name} : page, request, session, application 순으로 검색해서 찾음
- ${requestScope.name} : request에서만 검색
- <%= request.getAttribute("name") %>와 동일
- ${sessionScope.name} : session에서만 검색
- <%= session.getAttribute("name") %>와 동일
- param, paramValues
- request parameter를 접근
- <input type="text" name="myID"> -> ${param.myID} or ${paramValues.name[0]}
- header, headerValues, pageContext
- cookie
- initParam
- pageScope, requestScope, sessionScope, applicationScope
JSTL Core Library
1. Variable Support Tags : <c:set> Tag
- JSP의 setAttribute()와 같은 역할
- page, request, session, application 범위의 변수(속성)를 설정 -> 이 순으로 탐색
2. Iteration Tags : <c:forEach> Tag
- 객체 전체에 걸쳐 반복 실행 시 사용
- for문 대체 태그 (다 태그로 구성되어 있어서 보기 좋고 편리함)
- JSP 실행 전 Servlet이 실행되고 그 결과로 collection 형태의 reqeust 속성이 forwarding으로 넘어옴 -> 그럼 바로 ${words} 와 같이 EL로 받을 수 있고 <c:forEach>로 collection 형태에 원소 하나씩 접근해 사용할 수 있음
- varStatus 속성 이용 가능
<c:forEach var="name" items="${names}" varStatus="status">
${name} <c:if test="${!status.last}">, </c:if>
</c:forEach>
3. Conditional Evalutation Tags : <c:if> Tag
- 하나의 조건문 표현한다. 조건을 걸고 부합 시 태그를 생성한다.
<c:if test="${i > 7}"> greater than 7 </c:if>
<c:choose>
<c:when test="test1">Content1</c:when>
<c:when test="test2">Content2</c:when>
// ..
<c:otherwise>Default Content</c:otherwise>
</c:choose>
- 비교 연산자
- eq : equal (==)
- ne : not equal (!=)
- empty : list, set, map 등 collection 객체가 원소를 갖고 있는지 여부 검사
<c:if test="${name eq null}">
<c:if test="${name eq 'hhj'}">
<c:if test="${name eq 23}">
<c:if test="${empty userList}">
4. URL Related Tags - <c:url> Tag, <c:param> Tag
- <c:url> Tag : query parameter로부터 URL을 생성함.
- <c:param> Tag : <import> 태그 사용 시 parameter 전달을 위해 사용
5. <c:out> Tag
- JSP 표현식을 대체하기 위해 사용됨
- 식 계산 및 결과 화면 출력
<c:forEach var="word" items="${words}">
<c:out value="${word}" /> // == ${word}
</c:forEach>