
JSPの基本 – ServletからJSPへのステップアップ
2025-08-04JSPとは何か
JavaServer Pages (JSP) は、Javaベースの動的なWebページを作成するための技術です。Servlet技術を拡張したもので、HTMLの中にJavaコードを埋め込むことができる特徴があります。ServletがJavaコードの中にHTMLを記述するのに対し、JSPはその逆のアプローチを取ります。
JSPの主な特徴:
- HTMLライクな構文で記述できる
- プレゼンテーション層に特化
- Servletに自動変換される
- タグライブラリを使用してロジックと表示を分離可能
Servletを既に学習した方にとって、JSPはより効率的なWebアプリケーション開発を実現するための次のステップと言えます。
JSPの基本構文
JSPの基本構造
JSPファイルは通常.jsp
という拡張子を持ち、HTMLテンプレートの中に動的な要素を埋め込む形で記述します。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>基本的なJSP</title>
</head>
<body>
<h1>ようこそ、<%= request.getParameter("name") %>さん!</h1>
<p>現在の日時: <%= new java.util.Date() %></p>
</body>
</html>
JSPの構成要素
- ディレクティブ (
<%@ ... %>
)
- ページ全体の設定や動作を指定
- 例:
<%@ page import="java.util.*" %>
- スクリプトレット (
<% ... %>
)
- Javaコードを記述するブロック
- 例:
jsp <% String message = "Hello World"; out.println(message); %>
- 式 (
<%= ... %>
)
- 評価結果を出力する簡易構文
- 例:
<%= new java.util.Date() %>
- 宣言 (
<%! ... %>
)
- JSPがServletに変換されたときのクラスレベルの宣言
- 例:
jsp <%! private int counter = 0; public void increment() { counter++; } %>
JSPのライフサイクル
JSPはサーバ上でServletに変換され、実行されます。そのライフサイクルは以下の通りです:
- 変換フェーズ: JSPファイルがServletのJavaソースコードに変換される
- コンパイルフェーズ: 生成されたJavaソースがクラスファイルにコンパイルされる
- ロードフェーズ: コンパイルされたクラスがメモリにロードされる
- 実行フェーズ: Servletの
service()
メソッドが呼び出され、リクエストを処理する
このプロセスは通常、初回アクセス時に行われますが、最近のコンテナではアプリケーション起動時にプリコンパイルする場合もあります。
JSPとServletの連携
Servletで処理したデータをJSPで表示するという「Model 2」アーキテクチャが一般的です。
Servlet側のコード例
@WebServlet("/user")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User("田中太郎", "tanaka@example.com");
request.setAttribute("user", user);
RequestDispatcher dispatcher
= request.getRequestDispatcher("/WEB-INF/views/user.jsp");
dispatcher.forward(request, response);
}
}
JSP側のコード例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ユーザー情報</title>
</head>
<body>
<h1>ユーザー情報</h1>
<p>名前: ${user.name}</p>
<p>メール: ${user.email}</p>
</body>
</html>
JSPの暗黙オブジェクト
JSPでは、Servlet APIの主要なオブジェクトがあらかじめ定義されており、スクリプトレットや式の中で直接使用できます。
主な暗黙オブジェクト:
request
–HttpServletRequest
オブジェクトresponse
–HttpServletResponse
オブジェクトout
–JspWriter
オブジェクト(出力用)session
–HttpSession
オブジェクトapplication
–ServletContext
オブジェクトpageContext
–PageContext
オブジェクト(他のオブジェクトへのアクセスを提供)config
–ServletConfig
オブジェクトpage
– 現在のページのServletインスタンス
使用例:
<%
String username = request.getParameter("username");
session.setAttribute("currentUser", username);
out.println("ようこそ、" + username + "さん");
%>
JSPのスコープオブジェクト
JSPには4つのスコープがあります。Servletとの連携時に重要な概念です。
- ページスコープ (
pageContext
)
- 現在のJSPページ内でのみ有効
- リクエストスコープ (
request
)
- 同じリクエスト内で有効(forward/include含む)
- セッションスコープ (
session
)
- 同一ユーザーのセッション中に有効
- アプリケーションスコープ (
application
)
- アプリケーション全体で共有
属性の設定と取得:
<%
// リクエストスコープに設定
request.setAttribute("message", "Hello JSP");
// セッションスコープから取得
String user = (String)session.getAttribute("currentUser");
%>
JSPのエラーハンドリング
JSPでエラーが発生した場合の処理方法には以下のようなものがあります。
エラーページの指定
web.xml
での設定:
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
またはJSPディレクティブで指定:
<%@ page errorPage="error.jsp" %>
エラーページの作成
エラーページではisErrorPage="true"
を指定します。
<%@ page isErrorPage="true" contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>エラーページ</title>
</head>
<body>
<h1>エラーが発生しました</h1>
<p>エラーメッセージ: <%= exception.getMessage() %></p>
</body>
</html>
JSPのベストプラクティス
- ビジネスロジックをJSPに書かない
- JSPは表示に特化し、処理はServletやJavaクラスに任せる
- スクリプトレットの代わりにJSTLやELを使用する
- 次の記事で詳しく扱いますが、可読性と保守性が向上します
- 適切なスコープを選択する
- 必要最小限のスコープを使用し、無駄なメモリ消費を避ける
- 共通部分はインクルードで再利用
- ヘッダーやフッターなどは別ファイルにしてインクルード
<%@ include file="/WEB-INF/includes/header.jsp" %>
<%@ include file="/WEB-INF/includes/footer.jsp" %>
- コメントを適切に使用
- HTMLコメントとJSPコメントを使い分け
<!-- これはHTMLコメントで、クライアント側に見えます -->
<%-- これはJSPコメントで、サーバ側で処理されません --%>
JSPのデバッグ方法
JSPのデバッグにはいくつかの方法があります。
- ログ出力
<%
application.log("デバッグメッセージ: " + variable);
%>
- コンソール出力
<%
System.out.println("デバッグメッセージ: " + variable);
%>
- ページに直接出力
<pre>
<%
out.println("変数値: " + variable);
%>
</pre>
- 生成されたServletを確認
- コンテナの作業ディレクトリから生成されたServletソースを確認可能
JSPのパフォーマンスチューニング
- バッファリングの活用
<%@ page buffer="16kb" %>
- スレッドセーフな設計
<%@ page isThreadSafe="false" %>
- セッションの無効化(不要な場合)
<%@ page session="false" %>
- インポートの効率化
<%@ page import="java.util.List,java.util.ArrayList" %>
まとめ
JSPはServlet技術を基盤とした強力なWebアプリケーション開発技術です。HTMLライクな構文で動的なコンテンツを生成できるため、プレゼンテーション層の開発効率が大幅に向上します。Servletでビジネスロジックを処理し、JSPで表示を行うという分業が可能になることで、より保守性の高いアプリケーションを構築できます。
次のステップとして、JSTL(Coreタグライブラリ)やEL式(Expression Language)を学ぶことで、JSP内のJavaコードをさらに減らし、より洗練されたJSP開発が可能になります。また、カスタムタグを学ぶことで、独自のタグライブラリを作成し、複雑なロジックをカプセル化することもできます。
JSPの基本をマスターしたことで、より効率的でメンテナンス性の高いWebアプリケーション開発への道が開けました。実際のプロジェクトでこれらの知識を活用し、実践的なスキルを磨いていきましょう。