본문 바로가기
WEB/Servlet, JSP

[JSP] JSTL 사용법

by Amy IT 2022. 7. 18.

 

목차

     

    JSTL 이란?

    JSTL은 Java Server Pages Standard Tag Library의 약자로서, JSP에서 사용하는 태그 라이브러리를 공통으로 사용하기 위해 정해진 표준화된 커스텀 태그 라이브러리입니다. 시스템을 개발할 때 공통적으로 사용하는 기능들을 미리 구현해 놓았기 때문에, JSTL로 구현된 기능은 별도로 커스텀 태그를 만들어 사용할 필요 없이 JSTL을 그대로 사용하면 됩니다. 

     

     

    JSTL 환경설정

    드라이버 다운로드

    JSTL은 외부 라이브러리이기 때문에 드라이버를 따로 다운 받아서 넣어주는 것이 필요합니다. https://tomcat.apache.org/taglibs/standard/ 에서 태그 라이브러리 파일을 다운 받은 후, jstl.jar 파일과 standard.jar 파일 두 가지를 아래와 같이 webapp 폴더 > WEB-INF 폴더 > lib 폴더 안에 붙여넣기 합니다. 

     

     

    라이브러리 선언

    JSP 페이지 헤더 부분에서 taglib 지시어를 사용하여 라이브러리를 불러옵니다.

     

    라이브러리 선언
    Core <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    XML Processing <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
    I18N formatting <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    SQL <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
    Functions <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    ...

     

     

    JSTL Core 라이브러리

     

    분류 태그 설명
    기본 액션 <c:out> 지정된 값을 출력할 때 사용한다.
    <c:set> JSP 페이지에서 사용하는 변수를 설정한다. JSP의 setAttribute(name,value) 메소드와 동일한 기능으로서, scope에 따른 바인딩 처리가 가능하다.
    <c:remove> <c:set> 태그로 정의한 변수를 삭제한다. JSP의 removeAttribute(name) 메소드와 동일한 기능으로서, scope에 따른 속성 제거가 가능하다.
    조건 액션 <c:if> if 문장을 처리할 때 사용한다.
    <c:choose>
    <c:when>
    <c:otherwise>
    여러 개의 조건식을 사용하여 처리하고자 할 때 사용한다. 하나의 <c:choose>에 여러 개의 <c:when> 조건들로 구성되어 있으며, 조건에 만족하는 문장 하나만 처리된다. 조건을 만족하지 못한 경우에는 <c:otherwise>가 실행된다. 자바의 switch문과 유사하다.
    반복 액션 <c:forEach> 지정된 횟수만큼 명령문을 반복 실행할 때 사용한다.
    <c:forTokens> 문자열을 특정 문자로 구분하여 분리한 후 분리된 문자열만큼 명령문을 반복 수행한다. 자바의 StringTokenizer 클래스와 유사한 기능이다.
    URL 액션 <c:url> URL 정보를 생성한다.

     

    <c:out>

    현재 JSP 페이지에 데이터를 출력하기 위해 사용하는 태그입니다. JSP에서 out.print() 를 이용하는 것과 동일한 기능입니다.

    <c:out value="value" [escapeXml="true|false"] [default="기본값"] />
    <c:set var="xxx" value="홍길동" scope="request"></c:set>
    <c:out value="${xxx}"></c:out><!-- JSTL 안에서 EL 표현식 사용 가능 -->
    <!-- 아래 JSP 코드와 동일 -->
    <% 
    	request.setAttribute("xxx", "홍길동");
    	String x = (String) request.getAttribute("xxx");
    	out.print(x); 
    %>
    <%= x %>
    <c:out value="<%= x %>"></c:out><!-- JSTL 안에서 JSP 태그 사용 가능 -->

     

    • value : 출력할 값을 지정합니다. 값의 지정은 문자열, 표현식, EL 형식이 가능합니다.
    • escapeXml : true 또는 false 값을 지정합니다. true면 <, >, ', " 와 같은 문자를 특수 문자코드로 변환합니다. 기본값은 true입니다.
    • default : value 속성에 값이 지정되지 않은 경우 출력할 값을 지정합니다.

     

    <c:set>

    scope 객체에 데이터를 저장하기 위한 태그입니다. JSP에서 setAttribute 메소드를 이용하는 것과 동일한 기능입니다.

    <!-- value attribute를 사용하여 지정 -->
    <c:set value="value" var="varName" [scope="page|request|session|application"] />
    <!-- value attribute를 사용하여 대상 객체의 값을 지정 -->
    <c:set value="value" target="target" property="propertyName" />
    <c:set value="이순신" var="yyy" scope="request"></c:set>
    <c:out value="${yyy}"></c:out>
    <!-- 아래 JSP 코드와 동일 -->
    <%
    	request.setAttribute("yyy", "이순신");
    	String y = (String) request.getAttribute("yyy");
    	out.print(y);
    %>

     

    • var : 변수의 이름을 지정합니다.
    • value : 변수의 값을 지정합니다. 문자열, EL, 표현식 형태로 지정할 수 있습니다.
    • scope : 정의하는 변수를 scope에 저장합니다. scope 속성값으로 page, request, session, application을 지정할 수 있으며, 기본값은 page 입니다.
    • target : setter 메소드를 호출할 자바 객체를 지정합니다.
    • property : 값을 변경할 자바 객체의 멤버변수 이름을 지정합니다.

     

    <c:remove>

    <c:set> 태그로 정의한 변수를 삭제하는 태그입니다. JSP의 removeAttribute 메소드와 동일한 기능입니다.

    <c:remove var="var" [scope="page|request|session|application"] />

     

    • var : 삭제하고자 하는 변수의 이름을 지정합니다.
    • scope : scope를 지정하면 지정된 scope 영역 내에서만 변수를 삭제하고, 지정하지 않을 경우 모든 scope에서 var에 지정한 이름의 변수를 삭제합니다.

     

    <c:if>

    if 문장을 처리하기 위한 태그입니다.

    <c:if test="testCondition" [var="varName"] [scope="page|request|session|application"] />
    <c:set var="xxx" value="홍길동"></c:set>
    <c:if test="${xxx == '홍길동'}">if문 실행</c:if>
    <c:if test="${10>4}">if문 실행</c:if>
    <c:if test="<%= true %>">if문 실행</c:if>

     

    <c:choose>, <c:when>, <c:otherwise>

    여러 개의 조건식을 사용하여 처리하고자 할 때 사용하는 태그입니다. 하나의 <c:choose>에 여러 개의 <c:when> 조건들로 구성되어 있으며, 조건에 만족하는 문장 하나만 처리됩니다. 조건을 만족하지 못한 경우에는 <c:otherwise>가 실행됩니다.

    <c:choose>
    	<c:when test="testCondition"></c:when>
    	<c:otherwise></c:otherwise>
    </c:choose>
    <c:set var="aaa" value="홍길동"></c:set>
    <c:choose>
    	<c:when test="${aaa=='홍길동'}">홍길동임</c:when>
    	<c:when test="${aaa=='이순신'}">이순신임</c:when>
    	<c:when test="${aaa=='유관순'}">유관순임</c:when>
    	<c:otherwise>자료가 없음</c:otherwise>
    </c:choose>

     

    <c:forEach>

    지정된 횟수만큼 명령문을 반복 실행하는 태그입니다.

    <!-- 객체들의 collection을 수행할 경우 -->
    <c:forEach [var="varName"] items="collection"
    	[varStatus="varStatusName"]
    	[begin="begin"] [end="end"] [step="step"] >
    	body 내용
    </c:forEach>
    
    <!-- 지정된 횟수만큼 반복 수행할 경우 -->
    <c:forEach [var="varName"] 
    	[varStatus="varStatusName"]
    	begin="begin" end="end" [step="step"] >
    	body 내용
    </c:forEach>

     

    • items : 반복 실행할 데이터가 저장된 배열, Collection 객체를 지정합니다. 지정된 데이터의 요소 수만큼 반복 실행합니다.
    • var : items에 지정된 요소 수만큼 반복 실행될 때 각 요소가 저장되는 변수 이름을 지정합니다.
    • begin : 반복 실행 횟수의 시작값을 지정합니다.
    • end : 반복 실행 횟수의 끝값을 지정합니다.
    • step : 반복 실행 횟수의 증감값을 지정합니다.

     

    지정된 횟수만큼 반복문을 실행하도록 하는 경우입니다.

    <c:forEach var="x" begin="1" end="10" step="2">
    	${x}         <!-- 1 3 5 7 9 -->
    </c:forEach>

     

    객체들의 collection을 반복 수행할 경우를 알아보기 위해 Person 클래스를 만들고 list에 담아 포워드해 보겠습니다.

    public class Person {
    	String username;
    	int age;
    	//생성자와 getXXX,setXXX 함수 구현
    }
    @WebServlet("/TestServlet")
    public class TestServlet extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		List<Person> list = Arrays.asList(
    				new Person("이순신", 10),
    				new Person("홍길동", 20),
    				new Person("유관순", 30)
    				);
    		request.setAttribute("xxx", list);
    		RequestDispatcher dis = request.getRequestDispatcher("forEach.jsp");
    		dis.forward(request, response);
    	}
    }
    <!-- forEach.jsp -->
    <!-- status: for문이 현재 수행되고 있는 상태값들 저장되어 있음 -->
    <c:forEach var="p" items="${xxx}" varStatus="status"> 
    	index: ${status.index} <br> <!-- 인덱스번호 -->
    	count: ${status.count} <br> <!-- for문 몇번째 돌고있는지 for문 돌아간 횟수 -->
    	current: ${status.current} <br> <!-- 현재 들어있는 객체 -->
    	first: ${status.first} <br> <!-- 첫번째인지 여부 -->
    	last: ${status.last} <br> <!-- 마지막번째인지 여부 -->
    	<!-- 하나씩 꺼내서 저장한 변수 p 이용해서 데이터 출력 -->
    	${p.username} : ${p.age} <br>
    	<!-- 변수 저장 안하고 status 이용 바로 데이터 출력 -->
    	current: ${status.current.username} <br>
    	<hr>
    </c:forEach>

     

    <c:forTokens>

    문자열을 특정 문자로 구분하여 분리한 후 분리된 문자열만큼 명령문을 반복 수행합니다.

    <c:forTokens items="stringOfTokens" delims="delimiters"
    	[var="varName"] 
    	[varStatus="varStatusName"]
    	[begin="begin"] [end="end"] [step="step"] >
    	body 내용
    </c:forEach>
    <c:set var="str" value="AAA/BBB/CCC"></c:set>
    <c:forTokens var="x" items="${str}" delims="/">
    	${x}     <!-- AAA BBB CCC -->
    </c:forTokens>

     

    • items : 분리하고자 하는 문자열을 지정합니다.
    • delims : 문자열을 분리할 때 구분자로 사용할 기호를 지정합니다.

     

     

    참고

    처음 해보는 Servlet&JSP 웹 프로그래밍 (오정임 지음, 루비페이퍼)

     

     

    댓글