ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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 | 用途 |
|---|---|---|
| Core | c | 制御構造、変数、出力 |
| Formatting | fmt | 日付・数値・国際化 |
| SQL | sql | SQL 実行(非推奨) |
| XML | x | XML 処理 |
| Functions | fn | 文字列関数 |
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 + JSTL | Thymeleaf |
|---|---|---|
| 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) との違い
| 項目 | JSP | JSF |
|---|---|---|
| テンプレート | HTML 混在の .jsp | XHTML(Facelets) |
| 状態管理 | セッションに自前で持つ | マネージドビーン |
| イベント | POST + パラメータ自前 | サーバーサイドイベント |
| 使用シーン | シンプルな表示 | 業務系の大規模 UI |
FAQ
Q: Jakarta EE 9 で uri が変わった?
A: はい。javax.* → jakarta.* 移行に伴い http://java.sun.com/jsp/jstl/core → jakarta.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 のみで構成するのが現代的なベストプラクティス。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- include
- taglib
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?