EL태그와 마찬가지로 JSTL을 통해 흐름을 제어할 수 있다.


◆ 커스텀 태그

JSP에서 지원하는 태그가 아닌 직접 태그를 만들어서 사용하는 태그이다.


▶ 커스텀 태그 만들기

1. JSP Tag 파일 생성

JSP Tag를 만들게 되면 확장자 .tag로 되어있는 파일이 만들어진다.
( 해당 JSP Tag파일의 파일명이 JSP에서 사용할 태그의 이름이 되는 것이다. )

WEB-INF/tags 아래에 만들어 두도록 하자.


2. 태그의 속성 지정 및 태그 기능 설정

  • 태그 속성 지정
    attribute지시어의 name으로 태그의 속성명을 지정하고, type으로 해당 옵션에서 받아올 타입을 지정한다.
// required 필수옵션인지를 설정하는 옵션
// ( Integer 받게 되면 수치형 스트링도 가능 )
<%@ attribute name="value" required="true" type="java.lang.Integer" %>
  • 태그 기능 설정
    위에서 attribute지시어로 만든 value라는 변수를 코드 밑에서 사용이 가능하다.
<% out.println("<b>" + value + "</b>"); %>

JSP Tag파일을 위 처럼 만들게 되면, JSP페이지에서 해당 커스텀 태그의 기능이 value값을 찍게되는 역할을 하는 것이다.


▶ 커스텀 태그 사용

JSP파일에서 만들어둔 커스텀 태그를 사용하기 위해서 taglib 지시어가 필요하다.

<%@ taglib prefix="cus" tagdir="/WEB-INF/tags"%>
  • prefix : 커스텀 태그를 사용할 때 태그명 앞에 사용할 이름.
  • tagdir : 커스텀 태그가 있는 경로


=> JSP Tag파일명을 speed.tag로 만들고, taglib지시어를 위 처럼 등록했을 경우 <cus:speed value="${ EL }"/> 형식의 태그를 사용할 수 있다.


◆ JSTL( Jsp Standard Tag Library )

자주 사용되는 커스텀 태그들의 기능들을 모아서 정리해둔 라이브러리이다.
EL태그는 출력용 태그이기 때문에 반복이나, 비교연산을 돌리기 어렵다.
때문에 스크립트렛을 써야 하지만, JSP에서 최대한 스크립트렛을 쓰지 않기 위해(가독성을 높이기 위해) JSTL이라는 태그를 이용한다.

JSTL태그를 중요한 순서로 열거하면 core / fmt / fn / xml / sql이렇게 총 5가지가 있다.


▶ 연동방법

taglib지시어로 사용하고자 하는 태그라이브러리 경로를 uri로 설정하여 사용하면 된다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


▶ 메이븐 추가

jstl라이브러리는 아무거나 사용해도 된다.
(메이븐에 대해서는 Spring에서 자세히 알아보자. 메이븐을 모르시는 분들은 아래 참조)

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>


  • 메이븐을 사용하지 않을 경우
    http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 에서 다운로드 후 ( 1.1.2 zip)

    jakarta-taglibs-standard-1.1.2/lib/jstl.jar, standard.jar 2개의 jar파일을 프로젝트의 WEB-INF/lib에 넣어두는 것이 아닌 서버(톰캣)의 lib(pache-tomcat-8.5.40/lib)에 넣어준다.


◆ JSTL-core

core태그는 JSTL의 핵심적인 기능으로, if 또는 for문 등의 흐름을 처리를 할 수 있다.


▶ 연동

core의 prefix는 보통 c로 사용한다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


▶ core태그 사용법

  • <c:out value=””/>
    value값을 출력해 주는 기능이다. 꺽쇠( < or > )등 html이 출력할 수 없는 문자들을 자동적으로 $lt;, $gt;등의 특수문자로 처리해주어 출력해주는 태그
    (게시글 등에 활용할 수 있겠다.)


  • <c:set var=”” value=””/>
    var에 변수를 등록시켜 두고 value값으로 세팅시켜 놓는다. 단, 이렇게 세팅된 var의 변수는 EL태그에서만 사용이 가능하다.
 
<c:set var="m" value="0" />
${m } / ${ cate[m] }


  • <c:if test="">
    if문으로 비교할 수 있는 태그, test옵션 값은 자동으로 파싱된다.
    test옵션의 비교는 EL태그 안에서 사용한다.
    ( 주의할 점은 “ “ 문자열 안에 공백이 있으면 파싱이 되지 않는다. )
<c:if test="${prize != null }">
    prize : <b>${prize }</b>
</c:if>


  • <c:choose> <c:when test=""> <c:otherwise>
    swich 또는 elsif 문으로 처리되는 태그 (마이바티스와 동일한 사용법)
    단, choose태그 안엔 when태그 또는 otherwise태그만 들어갈 수 있다.
<c:choose>
    <c:when test="${difficulty >= 5 and difficulty < 8}">(겁나어려움)</c:when>
    <c:when test="${difficulty >=5 and difficulty >= 8 }">(겁나매우어려움)</c:when>
    <c:otherwise>(겁나 쉬움)</c:otherwise>
</c:choose>


  • <c:forEach var="" begin="" end="" step="">
    var에 설정된 변수에 begin값부터 시작하여 end값 까지 step만큼 증가하는 반복문을 돌려주는 태그
    ( step의 디폴트는 ‘1’, 음수는 안 됨, var의 변수는 해당 반복문이 끝나면 사라진다. )
<c:forEach var="i" begin="1951" end="2000" step="1">
    ${i },  
    <c:if test="${i % 10 == 0 }">
        <br />
    </c:if>
</c:forEach>


  • <c:forEach var=“” items=“”>
    forEach를 items옵션으로 사용할 시 forEach문이 돌아가는 태그이다.
    items는 다중 값들이 있는 컬렉션 등일 때 사용이 가능하다.
<c:forEach var="v" items="${cate }">
    ${v },  
</c:forEach>
  • <c:forEach varStatus=“”>
    forEach태그에서만 사용이 가능한 varStatus라는 객체변수를 사용할 수 있다.
<c:forEach var="v" items="${cate }" varStatus="vs">
    ${v } : ${v.bytes } ( ${vs } )
    .index : ${vs.index } / 
    .count : ${vs.count} / 
    .first : ${vs.first } / 
    .last : ${vs.last }<br />
</c:forEach>

▶ varStatus객체가 반환할 수 있는 값

  • .index : v변수의 인덱스값 ( 0~ )
  • .count : v변수가 몇 번째인지? ( 1 ~)
  • .first : v변수가 해당 반복문에서 첫번째 인지? true/false
  • .last : v변수가 해당 반복문에서 마지막 인지? true/false

  • <c:forTokens item="" delims="" var="">
    item에 있는 문자열을 delims로 분리해서 var변수에 저장하여 반복 해당 태그 또한 varStatus를 사용할 수 있다. ( 문자열 split기능 )
검색 카테고리 
<select>
    <c:forTokens items="제목,내용,작성자,제목+내용" delims="," var="t" varStatus="vs">
        <c:if test="${vs.first }">
            <option disabled selected>카테고리선택</option>
        </c:if>
        <option>${t }</option>
    </c:forTokens>
</select>


  • <c:redirect url=”url”/> : 리다이렉트
  • <c:param name=”네임” value=”벨류”/> : 파라미터전달
<c:catch val=er>
</c:catch>
<c:out value=”${er}”>

try~-cath문


◆ JSTL-function

function태그는 El태그 내부에서 사용하는 함수태그이고, 대부분이 문자열 객체에 국한되어있다.


▶ 연동

function태그의 prefix는 보통 fn으로 한다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>


▶ function태그 사용법

  • ${fn:length(넘겨준 객체) }
    컬렉션이나 문자열의 길이를 얻어낼 때 사용된다.
    ex ) List<Map>형태를 list라는 이름으로 넘겨주었다면
    ${fn:length(list)} 는 해당 컬렉션의 길이를 반환해주고, 만약 스트링이었다면 문자열의 길이를 반환한다.


  • ${fn:toUpperCase(넘겨준 객체) }
    넘겨받은 해당 스트링객체를 대문자로 표기해준다.


  • ${fn:toLowerCase(eng) }
    넘겨받은 해당 스트링객체를 소문자로 표기해준다.


  • ${fn:startsWith(kor, ‘윤’) }
    넘겨받은 해당 kor스트링 객체가 ‘윤’으로 시작되는지 true/false 반환


  • ${fn:endsWith(kor,’호’) }
    넘겨받은 해당 kor스트링 객체가 ‘호’로 끝나는지 true/false 반환


  • ${fn:contains(eng, ‘aa’) }
    넘겨받은 해당 eng스트링 객체가 ‘aa’를 포함하는지 true/flase 반환


  • ${fn:substring(eng, 1, 3) }
    넘겨받은 해당 eng스트링 객체에서 인덱스 1~2까지 반환 ( start ~ (end-1) )


  • ${fn:substring(eng, 3, -1) }
    넘겨받은 해당 eng스트링 객체에서 인덱스 3부터 끝까지 반환


  • ${fn:indexOf(eng, ‘Soo’) }
    넘겨받은 해당 eng스트링 객체에서 ‘Soo’가 시작하는 인덱스 번호 반환


  • ${fn:replace(kor, ‘윤’,’YOON’) }
    넘겨받은 해당 kor스트링 객체에서 ‘윤’을 ‘YOON’으로 전부 변환


  • ${fn:join(jobAr, ‘◁〓▷’) }
    앞에 변수에 담긴 스트링배열을 뒤에 문자열로 연결하여 스트링 반환


 
<c:set var="job" value="전사,도적,마법사,사제,궁수" /> 
<c:set var="jobAr" value="${fn:split(job, ',') }" />
//  방법처럼 사용할 수도 있다.


◆ JSTL-fmt

수치 또는 시간형 데이터를 형식에 맞춰서 출력해주는 JSTL태그


▶ 연동

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>


▶ fmt태그 사용법

  • <fmt:formatNumber value=”${n1 }” />
    해당 수치형 데이터를 중간 중간 콤마(,)를 붙여서 수치를 보기 쉽게 해준다.
    수치 데이터 포맷 (#, ###.###)
    ( 실수는 소수점이하 3자리까지만 출력해줌 )

    포맷팅 패턴은 끝자리부터 체크한다. 만약 5자리라면 00,000 으로 되지만 7자리라면 0, 000,000 으로 된다.
    ( 소수점은 앞자리는 무시하고 . 이 들어간 패턴으로 체크 )


  • <fmt:formatNumber value=”${n1 }” var=”fn1” />
    var을 이용해서 변수에 담게 되면 바로 출력되지 않고 ${fn1}을 했을 때만 출력된다.


  • <fmt:formatNumber value=”${d }” pattern=”#, ###.000” />
    pattern을 지정해서 패턴을 지정해줄 수도 있다. #으로 자릿수를 맞출 수도 있고, 0으로 지정하는 경우 해당 자릿수에 맞춰서 0을 끼워 넣어준다.


  • <fmt:formatDate value=”${time1 }” />
    java.util.Date 또는 java.sql.Date 객체의 데이터 포맷형태를 yyyy.MM.dd 로 출력해 준다.


  • <fmt:formatDate value=”${time1 }” pattern=”MM/dd/yyyy HH:mm:ss” />
    java.util.Date 또는 java.sql.Date 객체의 데이터 포맷형태를 pattern으로 지정해 줄수도 있다.
    ( MM-월, dd-일, yyyy-년, HH-시, mm-분, ss-초 )