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"%>