1.

JSP タグ一覧と使い方完全ガイド — スクリプトレット / ディレクティブ / アクション / JSTL / EL

編集
この記事の要点
  • JSP のタグは大別して スクリプトレット / ディレクティブ / アクション / JSTL / EL の 5 種類
  • スクリプトレット <% %> はメンテ性が低いためJSTL + EL の併用が現代の標準
  • ディレクティブ <%@ page %> / <%@ include %> / <%@ taglib %> でページ全体の設定を行う
  • アクション <jsp:include>動的インクルード、ディレクティブの include は静的インクルード
  • JSTL <c:if> <c:forEach> <c:url> と EL ${user.name} を使えばロジックレスに書ける

JSP タグの全体像

JSP には大きく 5 種類のタグ・記述方法があります:

種類記法用途
スクリプトレット<% Java コード %>Java 文を直接実行
<%= 式 %>出力
宣言<%! メンバー %>クラスメンバーの定義
ディレクティブ<%@ page %> などページ全体の設定
アクション<jsp:include /> など標準動作の呼び出し
JSTL<c:if> など共通ロジックタグ
EL${user.name}式言語による出力

1. スクリプトレット系

<%@ page contentType="text/html; charset=UTF-8" %>

<%-- JSP コメント (出力されない) --%>

<%! // 宣言: クラスメンバ・メソッド
    private int counter = 0;
    public String hello() { return "Hi"; }
%>

<% // スクリプトレット: 直接 Java 文を書く
    String user = (String) request.getAttribute("user");
    int n = 10;
    for (int i = 0; i < n; i++) {
%>
    <p>行 <%= i %></p>
<%
    }
%>

<%-- 式: 出力 (System.out ではなく out に書き出す) --%>
<p>こんにちは <%= user %> さん</p>

注意: スクリプトレットはメンテ性が低くテンプレートとロジックが混ざるため、現代の JSP ではJSTL + EL に置き換えるのが定石です。

2. ディレクティブ

<%-- page ディレクティブ: ページ全体の設定 --%>
<%@ page contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"
         language="java"
         session="true"
         errorPage="/error.jsp"
         import="java.util.*, com.example.User" %>

<%-- include ディレクティブ: 静的インクルード (コンパイル時に展開) --%>
<%@ include file="/WEB-INF/jsp/header.jsp" %>

<%-- taglib ディレクティブ: タグライブラリの読み込み --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
ディレクティブ用途主な属性
<%@ page %>ページ設定contentType, pageEncoding, import, session, errorPage
<%@ include %>静的インクルードfile
<%@ taglib %>タグライブラリuri, prefix

3. 標準アクションタグ

<%-- 動的インクルード (リクエスト時に挿入) --%>
<jsp:include page="/WEB-INF/jsp/parts/menu.jsp">
    <jsp:param name="active" value="home" />
</jsp:include>

<%-- フォワード (制御を別ページへ) --%>
<jsp:forward page="/error.jsp">
    <jsp:param name="reason" value="auth" />
</jsp:forward>

<%-- JavaBean の利用 --%>
<jsp:useBean id="user" class="com.example.User" scope="session" />
<jsp:setProperty name="user" property="name" value="Taro" />
<jsp:setProperty name="user" property="*" />  <%-- リクエスト全パラメータをセット --%>
<jsp:getProperty name="user" property="name" />

静的 include と動的 include の違い:

<%@ include %><jsp:include>
タイミングコンパイル時リクエスト時
変数の共有共有される独立
動的な内容変更不可 (再コンパイル必要)可能
パフォーマンス速いやや遅い

4. JSTL (JSP Standard Tag Library)

JSTL は条件分岐・ループ・国際化等を提供する標準タグライブラリです。主に c: (core)、 fmt: (i18n)、 fn: (関数)、 x: (XML)、 sql: の 5 つ。

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

<%-- 変数 --%>
<c:set var="userName" value="Taro" scope="session" />
<c:remove var="oldValue" />

<%-- 出力 (XSS 安全な escape つき) --%>
<c:out value="${user.name}" default="ゲスト" escapeXml="true" />

<%-- 条件分岐 --%>
<c:if test="${user.role == 'admin'}">
    <p>管理者メニュー</p>
</c:if>

<c:choose>
    <c:when test="${score >= 80}">A</c:when>
    <c:when test="${score >= 60}">B</c:when>
    <c:otherwise>C</c:otherwise>
</c:choose>

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

<c:forEach var="i" begin="1" end="5" step="1">
    <span>${i}</span>
</c:forEach>

<%-- URL --%>
<a href="<c:url value='/users/${user.id}' />">プロフィール</a>

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

<%-- 国際化・フォーマット --%>
<fmt:formatDate value="${now}" pattern="yyyy/MM/dd" />
<fmt:formatNumber value="${price}" type="currency" />

<%-- 文字列関数 --%>
<c:if test="${fn:length(name) > 0}">
    ${fn:toUpperCase(name)}
</c:if>

5. EL (Expression Language)

JSP 2.0 から導入された式言語。Java を書かずに値を取り出せます。

<%-- 単純な取り出し (リクエスト/セッション/アプリスコープを自動探索) --%>
${user.name}                <%-- user.getName() を呼ぶ --%>
${list[0]}                  <%-- インデックスアクセス --%>
${map['key']}               <%-- マップ --%>

<%-- 算術・比較 --%>
${a + b}
${age >= 20}
${empty list}               <%-- null / 空文字 / 空配列 が true --%>

<%-- 暗黙オブジェクト --%>
${pageContext.request.contextPath}
${param.id}                 <%-- request.getParameter("id") --%>
${header['User-Agent']}
${cookie.JSESSIONID.value}

<%-- 関数呼び出し (taglib functions) --%>
${fn:length(items)}
${fn:contains(name, 'taro')}

JSP を JSTL + EL ベースに書き換える例

<%-- ❌ 古いスクリプトレット混在 --%>
<%
    List<User> users = (List<User>) request.getAttribute("users");
    for (User u : users) {
        if (u.isActive()) {
%>
            <p><%= u.getName() %></p>
<%
        }
    }
%>

<%-- ✅ JSTL + EL でロジックレスに --%>
<c:forEach var="u" items="${users}">
    <c:if test="${u.active}">
        <p><c:out value="${u.name}" /></p>
    </c:if>
</c:forEach>

FAQ

Q: JSP はもう古い?
A: 新規プロジェクトでは ThymeleafAPI + SPA (React/Vue) が主流。ただし JSP は Jakarta EE 標準であり、業務システムでは今も現役です。

Q: スクリプトレットを使わない方が良い理由は?
A: テストしにくい・XSS リスク・テンプレートとロジックが混在しメンテ困難。JSTL + EL を徹底するか、Servlet で値を組み立てて JSP は表示のみに専念させます。

Q: JSTL の uri は java.sun.com のままで良い?
A: Jakarta EE 9 以降は jakarta.tags.core に変わっています。Tomcat 10+ では新 URI を使ってください。

編集
Post Share
子ページ
  1. include
  2. taglib
同階層のページ
  1. タグ一覧
  2. コンテキストパスの取得

最近更新/作成されたページ