JSP/Servlet | JSTL(JSP Standard Tag Library)

JSTL은 Jsp Standard Tag Library의 약자로서 JSP 페이지에서 사용하던 구문을 표준으로 정의한 태그이다.

JSTL은 왜 필요한가?

JSP 페이지에서 일반적으로 JSP(Java)의 코드와 HTML의 코드가 뒤섞여 작성을 하게 되면, 코드가 복잡하게 되어 유지보수가 어려워진다.

아래 코드는 JSP로 작성된 코드과 JSTL로 작성한 코드를 비교해 보길 바란다.

JSP만으로 작성한 경우

<%
    if (list.size() > 0) {
        for(int i = 0; i < list.size(); i++) {
            HashMap map = (HashMap)list.get(i);
%>
            제목 : <%=map.get("title")%>
<%
        }
    }
%>

JSTL으로 작성한 경우

<c:if test="${!empty list}">
    <c:forEach var="item" items="${list}">
        제목 : ${item.title}
    </c:forEach>
</c:if>

확실히 JSTL 쪽에 보기에도 좋아서 알아보기가 쉽다.

JSTL 종류

Core

변수지원, 흐름제어, URL처리를 한다.

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

fmt

지역, 메시지 형식, 숫자 및 날짜형식을 표시한다.

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

functions

문자열, 컬렉션 처리를 한다.

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

JSTL 적용방법

라이브러리 추가

필요한 라이브러리는 jstl-1.2.jar 파일만 추가하면 되는데, maven이라면 아래 dependency를 pom.xml에 추가하면 된다.

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

태그 라이브러리 선언

JSTL를 사용하기 위해서는 JSP 파일 안에 JSTL을 사용하겠다는 선언이 필요하다.

아래 지시문은 JSTL의 core 일명 C Tag를 사용하기 위한 선언문이다.

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

JSP에 적용을 하면 아래와 같아 진다.

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

그런데 위와 같이 선언을 하게 되면 모든 jsp에 지시문은 추가해 줘야 하는 번거려움이 발생한다.

그래서 모든 JSP에 추가되도록 web.xml에 아래와 같이 <include-prelude>을 설정해주면,

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
 
... 생략...
		
    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <el-ignored>false</el-ignored>
            <page-encoding>UTF-8</page-encoding>
            <scripting-invalid>false</scripting-invalid>
            <include-prelude>/WEB-INF/jsp/common/directive.jsp</include-prelude>
        </jsp-property-group>
    </jsp-config>

... 생략...

</web-app>

설정된 JSP(directive.jsp) 파일이 모든 JSP(*.jsp) 파일에 무조건 포함이 된다. 이때 JSTL 지시문을 여기에 작성을 해주면 편해진다.

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