JSP概要
JSP(JavaServer Pages)は、Javaベースの動的ウェブページ開発技術です。HTMLコードの中にJavaコードを埋め込むことができます。
- サーブレットベースの技術
- MVCアーキテクチャと相性が良い
- 再利用可能なコンポーネントの作成が可能
- ビジネスロジックとプレゼンテーションの分離
JSPファイルは最終的にサーブレットにコンパイルされて実行されます。
JSP基本構文
JSPページはHTMLとJavaの組み合わせで構成されます。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>はじめてのJSP</title>
</head>
<body>
<h1>こんにちは、JSP!</h1>
<%-- JSPコメント --%>
<% // Javaコード(スクリプトレット) %>
<%= new java.util.Date() %> <!-- 式 -->
</body>
</html>
スクリプティング要素
JSPには3種類のスクリプティング要素があります:
要素 |
構文 |
式 |
<%= 式 %> |
スクリプトレット |
<% Javaコード %> |
宣言 |
<%! 宣言 %> |
スクリプトレットの多用は避け、JSPタグやELを使いましょう。
JSPディレクティブ
ディレクティブはJSPページの全体設定を制御します。
- page: ページの属性設定
- include: 静的インクルード
- taglib: タグライブラリの定義
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %>
<%@ include file="header.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
暗黙オブジェクト
JSPでは自動的に利用できる組み込みオブジェクトがあります:
- request: HTTPリクエスト
- response: HTTPレスポンス
- session: HTTPセッション
- application: サーブレットコンテキスト
- out: JspWriter(出力)
- pageContext: ページコンテキスト
<% String userName = request.getParameter("name"); %>
<% session.setAttribute("user", userName); %>
JSPアクション
JSPアクションはXML構文で、実行時の動作を制御します。
- jsp:include: 動的インクルード
- jsp:forward: 転送
- jsp:useBean: JavaBeanの使用
- jsp:setProperty: プロパティ設定
- jsp:getProperty: プロパティ取得
<jsp:include page="header.jsp" />
<jsp:useBean id="user" class="com.example.User" scope="session" />
<jsp:setProperty name="user" property="name" value="田中太郎" />
式言語 (EL)
Expression Languageは、JSPでデータにアクセスするための簡潔な構文です。
${expression}
ユーザー名: ${user.name}
リクエストパラメータ: ${param.id}
セッション属性: ${sessionScope.cart.items}
配列/リスト: ${users[0].name}
演算子もサポートしています:
${a + b}, ${a * b}, ${a / b}
${a == b}, ${a != b}, ${a < b}
${empty list}, ${not empty list}
${a > 0 ? "正" : "負または0"}
JSTL (JSP標準タグライブラリ)
JSTLは、JSPで一般的なタスクを実行するためのタグを提供します。
- Core: if, forEach, set, out, catch
- Formatting: formatDate, formatNumber
- SQL: データベース操作
- XML: XML処理
- Functions: 文字列操作関数
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty user}">
ようこそ、<c:out value="${user.name}" />さん
</c:if>
<c:forEach var="item" items="${items}">
${item.name}: ${item.price}円
</c:forEach>
ベストプラクティス
- MVCパターンを適用する
- スクリプトレットは最小限に抑える
- ELとJSTLを積極的に活用する
- JSPでのビジネスロジック実装を避ける
- エラーページを設定する
- セッション管理に注意する
- キャッシュ戦略を実装する
- セキュリティ対策を実施する
JSPはビューレイヤーとして使用し、ロジックはサーブレットやJavaクラスに配置しましょう。
トラブルシューティング
よくある問題と解決策:
- 文字化け: pageEncodingとcharsetを確認
- 404エラー: ファイルパスと配置を確認
- 500エラー: サーバーログを確認、構文エラーを修正
- NullPointerException: 値の存在確認をする
- コンパイルエラー: Javaコードの構文を確認
<%@ page errorPage="error.jsp" %>
<c:catch var="exception">
// 例外が発生する可能性があるコード
</c:catch>
<c:if test="${not empty exception}">
エラーが発生しました: ${exception.message}
</c:if>
JSPセキュリティ
JSP開発で注意すべきセキュリティ対策:
- XSS対策:
<c:out>
タグを使用してエスケープ
- SQLインジェクション: PreparedStatementを使用
- CSRF対策: トークンの実装
- セッション固定攻撃の防止
- 適切なエラーハンドリング
<!-- 安全な出力 -->
<c:out value="${param.name}" />
<!-- 危険な出力 -->
${param.name} <!-- XSS脆弱性あり! -->
JSPとフレームワーク
JSPは様々なJavaフレームワークと統合できます:
- Spring MVC: ViewResolverでJSPを使用
- Struts: アクションとJSPの連携
- JSF: Faceletとの関係
現代のwebアプリケーション開発では、JSPの代わりにThymeleafやJSF、モダンなJavaScriptフレームワークと組み合わせたRESTful APIアプローチも人気があります。
新規プロジェクトではJSP以外の選択肢も検討しましょう。レガシーシステムのメンテナンスにはJSP知識が役立ちます。