EL이나 액션 태그를 이용해도 여전히 자바 코드를 사용할 수밖에 없는 상황이 있다. 이를테면 반복문이나 조건문 같은 것을 쓸 때. 이것을 제거하기 위해 커스텀 태그가 등장했다. 커스텀 태그는 자바 코드를 대체하기 위해 만든 태그다. JSTL은 커스텀 태그의 한 종류다.
우선 사용하기 위해서 라이브러리를 설치해야 한다. 링크
초록색 테두리 안에 네 개의 라이브러리를 받는다.
WebContent - WEB-INF - lib 안에 다운 받은 라이브러리를 넣는다.
<%page 밑에 taglib추가
<!--이 안에 함께 쓸 수 없음 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--이 태그를 써주지 않으면 JSTL 쓸 수 없음 -->
<%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
해당 태그는 어떤 라이브러리(core, fmt, fn을 쓰느냐에 따라 달라진다.
만약 국제화 라이브러리를 쓴다면
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
라고 고쳐써야 한다.
라이브러리 | 세부 기능 | 접두어 | 관련 URL |
---|---|---|---|
코어 | 변수지원, 흐름제어, 반복문, URL처리 | c | http://java.sun.com/jsp/jstl/core |
국제화 | 지역, 메세지 형식, 숫자 및 날짜형식 | fmt | http://java.sun.com/jsp/jstl/fmt |
XML | XML코어, 흐름제어, XML변환 | x | http://java.sun.com/jsp/jstl/xml |
데이터베이스 | SQL | sql | http://java.sun.com/jsp/jstl/sql |
함수 | 컬렉션 처리, 문자열 처리 | fn | http://java.sun.com/jsp/jstl/functions |
변수를 만드는 태그
<%
String id = "hong";
...
%>
이렇게 써야만 했던 것을 JSTL로 대체한다.
<c:set var="id" value="hong" />
<c:set var="pwd" value="1234" />
<c:set var="name" value="hongcoco" />
<c:set var="age" value="22" />
JSTL로 이렇게 대체할 수 있다.
<h1>${id }</h1>
<h1>${pwd }</h1>
<h1>${name }</h1>
<h1>${age }</h1>
<jsp:useBean id="memberList" class="java.util.ArrayList" />
<jsp:useBean id="memberMap" class="java.util.HashMap" />
<%
MemberBean m1 = new MemberBean("jojo", "1234","조조킴", "jojo@naver.com");
MemberBean m2 = new MemberBean("kal", "1234","김갈량","kal@daum.com");
//리스트에 담는다.
memberList.add(m1);
memberList.add(m2);
//리스트를 맵에 담는다.
memberMap.put("memberList", memberList);
%>
<!-- HashMap에 저장된 List객체를 list라는 변수를 선언하고 그 안에 담는다. -->
<c:set var="list" value="${memberMap.memberList }" />
.....
....
<!-- 읽기 -->
${list[0].id}
<!-- 결과 : jojo -->
지정한 변수를 제거하는 태그
<!-- 설정 -->
<c:set var="id" value="hong" />
<c:set var="pwd" value="1234" />
<c:set var="name" value="hongcoco" />
<c:set var="age" value="22" />
<!-- 삭제 -->
<c:remove var="pwd"/>
<c:remove var="name"/>
조건문을 사용하는 태그
<!--바인딩-->
<c:set var="id" value="admin" />
<c:set var="pwd" value="1234" />
<c:set var="name" value="hongcoco" />
<c:set var="age" value="22" />
..
..
..
<body>
<c:if test='${true }'>
<h1>늘 참이다.</h1>
</c:if>
<c:if test='${id == "admin"}'>
<h1>ID가 ADMIN일 때만 참이다.</h1>
</c:if>
<c:if test="${(id eq 'admin') || (id eq 'hong') }">
<h1>아이디가 admin일 때도 참이고 hong일 때도 참이다.</h1>
</c:if>
..
..
...
switch문을 JSTL로 구현할 수 있는 태그
<c:set var="name" value="dodo" />
<c:choose>
<c:when test="${empty name }">
<h1>이름을 입력하세요</h1>
</c:when>
<c:otherwise>
<h1>${name }</h1>
</c:otherwise>
</c:choose>
when속성을 여러 개 추가할 수 있다.
반복문을 다루는 태그
<c:forEach var='변수이름' items='반복할 객체 이름' begin='시작값' end='마지막 값'
step='증가값' varStatus='반복상태변수이름'>
...
...
</c:forEach>
varStatus의 속성
index (int)
count (int)
first (boolean)
last (boolean)
접근 방법 : ${varStatus이름.index} / ${vs.index}
...
<%
MemberBean m1 = new MemberBean("coco","1234","꼬낌", "no@no.com");
MemberBean m2 = new MemberBean("dodo","1234","낌또", "ddo@no.com");
List<MemberBean> list = new ArrayList<>();
list.add(m1);
list.add(m2);
%>
<!-- 위에서 만든 list를 가져와서 바인딩한다. -->
<c:set var="list" value="<%=list %>" />
...
<c:forEach var="i" begin="1" end="5" step="1" varStatus="loop">
i = ${i}
반복 횟수 : ${loop.count }
</c:forEach>
<hr>
<c:forEach var="i" begin="0" end="${list.size()}">
<h1>${list[i].id }</h1>
</c:forEach>
<hr>
<c:set var="fruits" value="사과, 망고, 참외, 수박, 귤" />
<!--구분자로 문자열을 쪼갠다. -->
<c:forTokens var='token' items="${fruits }" delims=",">
<p>${token }</p>
</c:forTokens>
<br>
...
URL정보를 저장하는 역할을 한다.
...
<!-- 이동할 페이지 설정 -->
<c:url var="url" value="/jstl/member1.jsp">
<!-- 가지고 갈 데이터 -->
<c:param name="id" value="coco" />
<c:param name="name" value="코코리" />
</c:url>
...
<h1><a href="${url }">이동</a></h1>
response.sendRedirect()이 하는 역할을 대신한다.
<c:url...과 유사하다. 데이터를 가지고 설정한 페이지로 보낸다.
<c:redirect url="/jstl/memeber1.jsp">
<c:param name="id" value="${'hong' }" />
<c:param name="name" value="${'김홍' }" />
</c:redirect>
JspWriter에 내용을 처리한 후에 출력하는 태그.
그냥 EL로 출력할 수도 있지만 default값을 지정할 수 있음.
<c:out value="출력값" default="기본값" >
반드시 설정
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
원하는 형식으로 날짜를 출력할 수 있다.
...
<c:set var="now" value="<%=new Date()%>" />
..
..
<fmt:formatDate value='${now}' pattern='YYYY-MM-dd : hh:mm:ss' />