1.

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

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

JSP タグの全体像

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

種類記法用途
スクリプトレット<% Java コード %>Java 文を直接実行
<%= 式 %>出力
宣言<%! メンバー %>クラスメンバーの定義
ディレクティブ<%@ page %> などページ全体の設定
アクション など標準動作の呼び出し
JSTL など共通ロジックタグ
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++) {
%>
    

行 <%= i %>

<% } %> <%-- 式: 出力 (System.out ではなく out に書き出す) --%>

こんにちは <%= user %> さん

注意: スクリプトレットはメンテ性が低くテンプレートとロジックが混ざるため、現代の 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. 標準アクションタグ

<%-- 動的インクルード (リクエスト時に挿入) --%>

    


<%-- フォワード (制御を別ページへ) --%>

    


<%-- JavaBean の利用 --%>


  <%-- リクエスト全パラメータをセット --%>

静的 include と動的 include の違い:

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

<%-- 変数 --%>



<%-- 出力 (XSS 安全な escape つき) --%>


<%-- 条件分岐 --%>

    

管理者メニュー

A B C <%-- ループ --%>

${st.index}: ${item.name}

${i} <%-- URL --%> プロフィール <%-- リダイレクト --%> <%-- 国際化・フォーマット --%> <%-- 文字列関数 --%> ${fn:toUpperCase(name)}

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 users = (List) request.getAttribute("users");
    for (User u : users) {
        if (u.isActive()) {
%>
            

<%= u.getName() %>

<% } } %> <%-- ✅ JSTL + EL でロジックレスに --%>

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. コンテキストパスの取得