2.

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

編集
この記事の要点
  • JSP の taglib は HTML 内に Java ロジック(<%= ... %>)を直接書かず、タグで表現するための仕組み
  • JSTL (JSP Standard Tag Library) が事実上の標準。<%@ taglib uri="jakarta.tags.core" prefix="c" %>
  • 主要タグ: / / / /
  • 独自タグは 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" %> --%>




    こんにちは、 さん


JSTL(JSP Standard Tag Library)

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

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

Core タグの主要な使い方

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

<%-- 変数セット --%>


<%-- 出力(HTML エスケープあり) --%>

  <%-- エスケープ無効 --%>

<%-- if --%>

    成人です


<%-- if-else --%>

    
    
    不可


<%-- ループ --%>

    ${status.index}. ${item.name}
<%-- 数値ループ --%> ${i} <%-- URL 生成 --%> プロフィール <%-- リダイレクト --%> <%-- 例外処理 --%> <%-- 危険な処理 --%> エラー: ${err.message}

Formatting タグ(fmt)

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

<%-- 日付フォーマット --%>


<%-- 数値フォーマット --%>



<%-- 国際化(i18n) --%>




    

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

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

文字数: ${fn:length(user.name)}
小文字: ${fn:toLowerCase(email)}
含む: NG ワードあり
置換: ${fn:replace(text, '\n', '
')} 分割: ${t}

独自タグの作成: 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 + "!");
    }
}



    1.0
    my
    http://example.com/mytags

    
        hello
        com.example.tags.HelloTag
        empty
        
            name
            true
            true
        
    
<%-- 使う側 --%>
<%@ taglib uri="http://example.com/mytags" prefix="my" %>


<%-- 出力: Hello, 山田! --%>

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

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

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

${user.name}

<%-- 使う側(tagdir で読み込み) --%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="t" %>

Spring MVC の form タグ

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

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


    氏名
    
    

    
        
    

    

    

JSP / JSTL の限界 → Thymeleaf へ

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

項目JSP + JSTLThymeleaf
HTML として開ける×(JSP タグが混ざる)○(純粋な HTML5)
属性ベース×(タグ要素)○(th:if 等)
Spring Boot 標準×
学習コスト普通低い

こんにちは、山田 さん
  • サンプル

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 のみで構成するのが現代的なベストプラクティス。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. include
  2. taglib