この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:T
更新日時:2026-06-11 07:10:02

タイトル: taglib
SEOタイトル: JSP taglib (JSTL) 完全ガイド(c:if / c:forEach / カスタムタグ / Spring

この記事の要点
  • JSP の taglib は HTML 内に Java ロジック(<%= ... %>)を直接書かず、タグで表現するための仕組み
  • JSTL (JSP Standard Tag Library) が事実上の標準。<%@ taglib uri="jakarta.tags.core" prefix="c" %>
  • 主要タグ: <c:if> / <c:forEach> / <c:choose> / <c:set> / <c:out>
  • 独自タグは TLD (Tag Library Descriptor) + Java クラス(または .tag ファイル)で作成
  • 現代の Java Web は JSP よりも Thymeleaf / Spring MVC + Form Tag Library / フロント分離が主流

taglib とは

JSP(JavaServer Pages)の taglib ディレクティブは、独自または標準のタグライブラリを JSP に読み込むための宣言です。スクリプトレット(<% %>)の代わりにタグで処理を書けるため、HTML が読みやすくなります。

<%@ page contentType="text/html;charset=UTF-8" %>
<%-- JSTL Core を読み込む(Jakarta EE 9+) --%>
<%@ taglib uri="jakarta.tags.core" prefix="c" %>
<%-- Java EE 8 までは下記 --%>
<%-- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> --%>

<html>
<body>
<c:if test="${user != null}">
    こんにちは、<c:out value="${user.name}" /> さん
</c:if>
</body>
</html>

JSTL(JSP Standard Tag Library)

標準的に使われる 5 つのタグライブラリの総称。最も使うのは Core (c) です。

ライブラリprefix用途
Corec制御構造、変数、出力
Formattingfmt日付・数値・国際化
SQLsqlSQL 実行(非推奨)
XMLxXML 処理
Functionsfn文字列関数

Core タグの主要な使い方

<%@ taglib uri="jakarta.tags.core" prefix="c" %>

<%-- 変数セット --%>
<c:set var="total" value="${price * quantity}" />

<%-- 出力(HTML エスケープあり) --%>
<c:out value="${user.name}" />
<c:out value="${html}" escapeXml="false" />  <%-- エスケープ無効 --%>

<%-- if --%>
<c:if test="${age >= 20}">
    成人です
</c:if>

<%-- if-else --%>
<c:choose>
    <c:when test="${score >= 80}">優</c:when>
    <c:when test="${score >= 60}">良</c:when>
    <c:otherwise>不可</c:otherwise>
</c:choose>

<%-- ループ --%>
<c:forEach var="item" items="${list}" varStatus="status">
    ${status.index}. ${item.name}<br />
</c:forEach>

<%-- 数値ループ --%>
<c:forEach var="i" begin="1" end="10" step="1">
    ${i}
</c:forEach>

<%-- URL 生成 --%>
<c:url var="userUrl" value="/users/${user.id}">
    <c:param name="tab" value="profile" />
</c:url>
<a href="${userUrl}">プロフィール</a>

<%-- リダイレクト --%>
<c:redirect url="/login" />

<%-- 例外処理 --%>
<c:catch var="err">
    <%-- 危険な処理 --%>
</c:catch>
<c:if test="${err != null}">
    エラー: ${err.message}
</c:if>

Formatting タグ(fmt)

<%@ taglib uri="jakarta.tags.fmt" prefix="fmt" %>

<%-- 日付フォーマット --%>
<fmt:formatDate value="${order.createdAt}" pattern="yyyy/MM/dd HH:mm" />

<%-- 数値フォーマット --%>
<fmt:formatNumber value="${product.price}" type="currency" />
<fmt:formatNumber value="${rate}" pattern="#0.00%" />

<%-- 国際化(i18n) --%>
<fmt:setLocale value="ja_JP" />
<fmt:setBundle basename="messages" />
<fmt:message key="welcome.title" />
<fmt:message key="welcome.greeting">
    <fmt:param value="${user.name}" />
</fmt:message>

Functions タグ(fn)— 文字列関数

<%@ taglib uri="jakarta.tags.functions" prefix="fn" %>

文字数: ${fn:length(user.name)}
小文字: ${fn:toLowerCase(email)}
含む: <c:if test="${fn:contains(text, 'NG')}">NG ワードあり</c:if>
置換: ${fn:replace(text, '\n', '<br />')}
分割: <c:forEach var="t" items="${fn:split(tags, ',')}">${t}</c:forEach>

独自タグの作成: TLD ファイル

JSTL に無い処理は自分でタグを作れます。Java クラス + TLD(Tag Library Descriptor)ファイルで定義:

// src/main/java/com/example/tags/HelloTag.java
package com.example.tags;

import jakarta.servlet.jsp.JspException;
import jakarta.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

public class HelloTag extends SimpleTagSupport {
    private String name;

    public void setName(String name) { this.name = name; }

    @Override
    public void doTag() throws JspException, IOException {
        getJspContext().getOut().write("Hello, " + name + "!");
    }
}
<!-- src/main/webapp/WEB-INF/mytags.tld -->
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="https://jakarta.ee/xml/ns/jakartaee"
        version="3.0">
    <tlib-version>1.0</tlib-version>
    <short-name>my</short-name>
    <uri>http://example.com/mytags</uri>

    <tag>
        <name>hello</name>
        <tag-class>com.example.tags.HelloTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>
<%-- 使う側 --%>
<%@ taglib uri="http://example.com/mytags" prefix="my" %>

<my:hello name="${user.name}" />
<%-- 出力: Hello, 山田! --%>

.tag ファイル(Java を書かないタグ)

Java クラスを書かず、JSP 風のテンプレートでタグを定義する方法もあります:

<%-- WEB-INF/tags/userCard.tag --%>
<%@ tag pageEncoding="UTF-8" %>
<%@ attribute name="user" required="true" type="com.example.User" %>

<div class="user-card">
    <img src="${user.avatar}" />
    <p>${user.name}</p>
</div>
<%-- 使う側(tagdir で読み込み) --%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="t" %>

<t:userCard user="${currentUser}" />

Spring MVC の form タグ

Spring MVC では専用の spring-form.tld でフォームバインディングが書けます:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

<form:form modelAttribute="user" method="POST" action="/users">
    <form:label path="name">氏名</form:label>
    <form:input path="name" />
    <form:errors path="name" cssClass="error" />

    <form:select path="role">
        <form:options items="${roles}" itemValue="id" itemLabel="name" />
    </form:select>

    <form:checkbox path="agreed" />

    <button type="submit">登録</button>
</form:form>

JSP / JSTL の限界 → Thymeleaf へ

2026 年現在、新規 Java Web プロジェクトは Thymeleaf や React/Vue + REST が主流。JSP は保守案件で見かけるレベルです。

項目JSP + JSTLThymeleaf
HTML として開ける×(JSP タグが混ざる)○(純粋な HTML5)
属性ベース×(タグ要素)○(th:if 等)
Spring Boot 標準×
学習コスト普通低い
<!-- Thymeleaf 例(純粋な HTML として開ける) -->
<div th:if="${user != null}">
    こんにちは、<span th:text="${user.name}">山田</span> さん
</div>
<ul>
    <li th:each="item : ${items}" th:text="${item.name}">サンプル</li>
</ul>

JSF (JavaServer Faces) との違い

項目JSPJSF
テンプレートHTML 混在の .jspXHTML(Facelets)
状態管理セッションに自前で持つマネージドビーン
イベントPOST + パラメータ自前サーバーサイドイベント
使用シーンシンプルな表示業務系の大規模 UI

FAQ

Q: Jakarta EE 9 で uri が変わった?
A: はい。javax.*jakarta.* 移行に伴い http://java.sun.com/jsp/jstl/corejakarta.tags.core へ。Tomcat 10+ で必須。

Q: JSTL の jar はどこから取る?
A: Maven Central から jakarta.servlet.jsp.jstl-api + jakarta.servlet.jsp.jstl。Jakarta EE 9+ では jakarta.* 系を必ず選択。

Q: スクリプトレット(<% %>)は使うべき?
A: 非推奨です。ロジックはサーブレット / コントローラ側に書き、JSP は JSTL + EL のみで構成するのが現代的なベストプラクティス。