ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
JSP とは
JSP (JavaServer Pages) は、HTML テンプレート内に Java コードや専用タグを埋め込んで動的ウェブページを生成する Java EE 標準技術です。Tomcat / Jetty / WildFly などのサーブレットコンテナが、JSP ファイル (.jsp) を内部的に Servlet クラスへ変換・コンパイルし、リクエストごとに実行します。
JSP の動作原理 — Servlet への変換
次のような JSP は、
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
<h1>こんにちは, <%= request.getParameter("name") %> さん</h1>
</body>
</html>
初回アクセス時に Tomcat 内部で次のような Servlet に変換されます:
public final class hello_jsp extends HttpJspBase {
public void _jspService(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
JspWriter out = response.getWriter();
out.write("<html>\n<body>\n<h1>こんにちは, ");
out.print(request.getParameter("name"));
out.write(" さん</h1>\n</body>\n</html>");
}
}
そのため 2 回目以降は Servlet と同じ速度で動作します。Tomcat の work ディレクトリに変換結果の .java / .class が保存されます。
JSP の構文要素
| 構文 | 用途 | 例 | 推奨度 |
|---|---|---|---|
<%@ %> | ディレクティブ (ページ設定) | <%@ page contentType="..." %> | 必須 |
<% %> | スクリプトレット (Java コード) | <% int x = 1; %> | 非推奨 |
<%= %> | 式 (値の出力) | <%= user.getName() %> | 非推奨 → EL |
<%! %> | 宣言 (メソッド・フィールド) | <%! private int n; %> | 避ける |
${ } | EL (式言語) | ${user.name} | 推奨 |
<c:if> 等 | JSTL | <c:if test="${ok}"> | 推奨 |
スクリプトレットが非推奨な理由
歴史的経緯で JSP の <% %> 内に直接 Java を書くスタイルがありますが、以下の理由で新規開発では禁止するのが業界標準です。
- ビジネスロジックがビューに混入 → MVC の View 責務違反
- テストが困難 → JSP 単体テストは事実上不可能
- 例外処理が貧弱 → コンパイルエラーが発見しづらい
- デバッガが効きにくい → 行番号がずれる
- 再利用性ゼロ → 同じロジックを複数 JSP に貼り付け
悪い例 vs. 良い例
<%-- ❌ スクリプトレット (非推奨) --%>
<%
List<User> users = (List<User>) request.getAttribute("users");
for (User u : users) {
if (u.isActive()) {
%>
<li><%= u.getName() %></li>
<%
}
}
%>
<%-- ✅ JSTL + EL (推奨) --%>
<c:forEach var="u" items="${users}">
<c:if test="${u.active}">
<li>${u.name}</li>
</c:if>
</c:forEach>
EL (Expression Language)
EL は ${...} 形式で属性スコープから値を取り出す式言語です。JSP 2.0 以降の標準:
<%-- スコープから取り出し (page → request → session → application 順に探索) --%>
${user.name}
${user["name"]}
<%-- Map / List アクセス --%>
${prefs["theme"]}
${list[0]}
<%-- 演算 --%>
${price * 1.1}
${count > 0 ? "あり" : "なし"}
<%-- 関数 (functions.tld を taglib で読み込み) --%>
${fn:length(users)}
${fn:toUpperCase(name)}
<%-- 暗黙オブジェクト --%>
${param.q} <%-- request.getParameter("q") --%>
${header["User-Agent"]}
${pageContext.request.contextPath}
JSTL (JSP Standard Tag Library)
条件分岐・繰り返し・国際化などのタグライブラリ:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%-- 条件分岐 --%>
<c:if test="${user.admin}">管理者です</c:if>
<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="u" items="${users}" varStatus="st">
${st.index}: ${u.name}
</c:forEach>
<%-- セット --%>
<c:set var="now" value="<%= new java.util.Date() %>"/>
<%-- フォーマット --%>
<fmt:formatDate value="${now}" pattern="yyyy/MM/dd HH:mm"/>
<fmt:formatNumber value="${price}" type="currency" currencySymbol="¥"/>
<%-- URL エスケープ --%>
<c:out value="${dangerousInput}"/> <%-- XSS 対策で必須 --%>
Maven 依存 (Jakarta EE 10):
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
Servlet と JSP の連携 (MVC)
典型的な構成: Servlet (Controller) → Model 準備 → JSP (View) へ forward。
@WebServlet("/users")
public class UserListServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
List<User> users = userService.findAll();
req.setAttribute("users", users); // ★ JSP に渡す
req.getRequestDispatcher("/WEB-INF/views/users.jsp")
.forward(req, resp); // ★ JSP に forward
}
}
JSP は /WEB-INF/ 配下に置くと直接 URL で叩けなくなるためセキュリティ上有利です。
javax → jakarta への移行 (Jakarta EE 9)
Eclipse Foundation 移管に伴い、パッケージ名が javax.* から jakarta.* に変更されました:
| 旧 | 新 | 必要環境 |
|---|---|---|
| javax.servlet.* | jakarta.servlet.* | Tomcat 10+, Jetty 11+ |
| javax.servlet.jsp.* | jakarta.servlet.jsp.* | 同上 |
| javax.persistence.* | jakarta.persistence.* | Hibernate 6+ |
Spring Boot 3.x は jakarta 系。Tomcat 9 系 (javax) と Tomcat 10 系 (jakarta) は互換性がないので注意。
JSP の代替テンプレートエンジン
| エンジン | 特徴 | 採用例 |
|---|---|---|
| Thymeleaf | HTML として開けるナチュラルテンプレート | Spring Boot 標準 |
| FreeMarker | 強力なマクロ機能 | 古い Spring 系 |
| Mustache | ロジックレス・他言語互換 | 軽量 SaaS |
| JTE | コンパイル型・高速 | 新興、Kotlin 親和 |
| SPA + REST | サーバはテンプレ持たない | React / Vue / Angular |
新規 Spring Boot プロジェクトは Thymeleaf + Bootstrap または REST API + フロント分離が主流です。
FAQ
Q: Spring Boot で JSP を使える?
A: 使えますが JAR ではなく WAR パッケージングが必要で、内蔵 Tomcat の制約もあり推奨されません。Thymeleaf を使うのが定石。
Q: JSP のパフォーマンスは?
A: 初回コンパイルは遅いが、2 回目以降は Servlet と同じ。本番デプロイ前に precompile (jspc Maven プラグイン) しておくと初回遅延を回避できる。
Q: XSS 対策は?
A: 必ず <c:out value="${input}"/> または EL の fn:escapeXml() を使う。生の ${input} はエスケープされない。
関連項目
- Servlet — JSP のベースになる Java EE 標準
- Thymeleaf — Spring Boot 推奨のテンプレートエンジン
- Tomcat — もっとも普及している JSP/Servlet コンテナ
- Jakarta EE — Java EE の後継仕様
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- 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
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?