ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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: 新規プロジェクトでは Thymeleaf や API + 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 を使ってください。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
同階層のページ
- タグ一覧
- コンテキストパスの取得
人気ページ
- 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
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 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
- 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
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・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
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?