JSPの基本 – ServletからJSPへのステップアップ

2025-08-04

JSPとは何か

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の構成要素

  1. ディレクティブ (<%@ ... %>)
  • ページ全体の設定や動作を指定
  • 例: <%@ page import="java.util.*" %>
  1. スクリプトレット (<% ... %>)
  • Javaコードを記述するブロック
  • 例:
    jsp <% String message = "Hello World"; out.println(message); %>
  1. (<%= ... %>)
  • 評価結果を出力する簡易構文
  • 例: <%= new java.util.Date() %>
  1. 宣言 (<%! ... %>)
  • JSPがServletに変換されたときのクラスレベルの宣言
  • 例:
    jsp <%! private int counter = 0; public void increment() { counter++; } %>

JSPのライフサイクル

JSPはサーバ上でServletに変換され、実行されます。そのライフサイクルは以下の通りです:

  1. 変換フェーズ: JSPファイルがServletのJavaソースコードに変換される
  2. コンパイルフェーズ: 生成されたJavaソースがクラスファイルにコンパイルされる
  3. ロードフェーズ: コンパイルされたクラスがメモリにロードされる
  4. 実行フェーズ: 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の主要なオブジェクトがあらかじめ定義されており、スクリプトレットや式の中で直接使用できます。

主な暗黙オブジェクト:

  • requestHttpServletRequestオブジェクト
  • responseHttpServletResponseオブジェクト
  • outJspWriterオブジェクト(出力用)
  • sessionHttpSessionオブジェクト
  • applicationServletContextオブジェクト
  • pageContextPageContextオブジェクト(他のオブジェクトへのアクセスを提供)
  • configServletConfigオブジェクト
  • page – 現在のページのServletインスタンス

使用例:

<%
    String username = request.getParameter("username");
    session.setAttribute("currentUser", username);
    out.println("ようこそ、" + username + "さん");
%>

JSPのスコープオブジェクト

JSPには4つのスコープがあります。Servletとの連携時に重要な概念です。

  1. ページスコープ (pageContext)
  • 現在のJSPページ内でのみ有効
  1. リクエストスコープ (request)
  • 同じリクエスト内で有効(forward/include含む)
  1. セッションスコープ (session)
  • 同一ユーザーのセッション中に有効
  1. アプリケーションスコープ (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のベストプラクティス

  1. ビジネスロジックをJSPに書かない
  • JSPは表示に特化し、処理はServletやJavaクラスに任せる
  1. スクリプトレットの代わりにJSTLやELを使用する
  • 次の記事で詳しく扱いますが、可読性と保守性が向上します
  1. 適切なスコープを選択する
  • 必要最小限のスコープを使用し、無駄なメモリ消費を避ける
  1. 共通部分はインクルードで再利用
  • ヘッダーやフッターなどは別ファイルにしてインクルード
<%@ include file="/WEB-INF/includes/header.jsp" %>

<%@ include file="/WEB-INF/includes/footer.jsp" %>
  1. コメントを適切に使用
  • HTMLコメントとJSPコメントを使い分け
<!-- これはHTMLコメントで、クライアント側に見えます -->
<%-- これはJSPコメントで、サーバ側で処理されません --%>

JSPのデバッグ方法

JSPのデバッグにはいくつかの方法があります。

  1. ログ出力
   <%
       application.log("デバッグメッセージ: " + variable);
   %>
  1. コンソール出力
   <%
       System.out.println("デバッグメッセージ: " + variable);
   %>
  1. ページに直接出力

<pre>
<%
    out.println("変数値: " + variable);
%>
</pre>
  1. 生成されたServletを確認
  • コンテナの作業ディレクトリから生成されたServletソースを確認可能

JSPのパフォーマンスチューニング

  1. バッファリングの活用
   <%@ page buffer="16kb" %>
  1. スレッドセーフな設計
   <%@ page isThreadSafe="false" %>
  1. セッションの無効化(不要な場合)
   <%@ page session="false" %>
  1. インポートの効率化
   <%@ page import="java.util.List,java.util.ArrayList" %>

まとめ

JSPはServlet技術を基盤とした強力なWebアプリケーション開発技術です。HTMLライクな構文で動的なコンテンツを生成できるため、プレゼンテーション層の開発効率が大幅に向上します。Servletでビジネスロジックを処理し、JSPで表示を行うという分業が可能になることで、より保守性の高いアプリケーションを構築できます。

次のステップとして、JSTL(Coreタグライブラリ)やEL式(Expression Language)を学ぶことで、JSP内のJavaコードをさらに減らし、より洗練されたJSP開発が可能になります。また、カスタムタグを学ぶことで、独自のタグライブラリを作成し、複雑なロジックをカプセル化することもできます。

JSPの基本をマスターしたことで、より効率的でメンテナンス性の高いWebアプリケーション開発への道が開けました。実際のプロジェクトでこれらの知識を活用し、実践的なスキルを磨いていきましょう。