Jasper(Tomcat JSPエンジン)

作成日:
Java Tomcat JSP

概要

Jasperは、Apache Tomcat のJSP(JavaServer Pages)エンジン。JSPファイルをJavaサーブレットにコンパイルし、Catalina で実行可能な形式に変換する。

名前の由来

「Jasper」は宝石のジャスパー(碧玉)から。Tomcat(トム猫)のテーマとは直接関係ないが、Catalinaと同様に、開発チームによって選ばれた名前。

役割

  • JSPのコンパイル: JSPファイルをJavaサーブレットソースに変換
  • Javaコードの生成: 変換されたJavaソースをコンパイル
  • 自動再コンパイル: JSPファイルの変更を検出して再コンパイル
  • EL(Expression Language)の処理: JSP内の式言語を評価

JSPの処理フロー

1. クライアントが .jsp をリクエスト

2. Jasperが JSP → Java サーブレットに変換

3. Java コンパイラで .class にコンパイル

4. Catalinaがサーブレットを実行

5. HTMLレスポンスをクライアントに返す

初回アクセス時

hello.jsp
    ↓ [Jasper: 変換]
hello_jsp.java
    ↓ [コンパイル]
hello_jsp.class
    ↓ [Catalina: 実行]
HTMLレスポンス

2回目以降

hello.jsp (変更なし)
    ↓ [キャッシュされた .class を使用]
hello_jsp.class
    ↓ [Catalina: 実行]
HTMLレスポンス

生成されるファイルの場所

$CATALINA_HOME/work/Catalina/<host>/<context>/
└── org/apache/jsp/
    ├── hello_jsp.java    # 変換されたJavaソース
    └── hello_jsp.class   # コンパイル済みクラス

例:

# localhost の ROOT アプリケーションの場合
$CATALINA_HOME/work/Catalina/localhost/ROOT/org/apache/jsp/

# myapp アプリケーションの場合
$CATALINA_HOME/work/Catalina/localhost/myapp/org/apache/jsp/

JSP → サーブレット 変換例

元のJSP(hello.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello JSP</title>
</head>
<body>
    <h1>Hello, <%= request.getParameter("name") %>!</h1>
    <p>現在時刻: <%= new java.util.Date() %></p>
</body>
</html>

生成されるサーブレット(hello_jsp.java)- 簡略化

public final class hello_jsp extends HttpJspBase {
    
    public void _jspService(HttpServletRequest request, 
                           HttpServletResponse response) 
            throws IOException, ServletException {
        
        response.setContentType("text/html;charset=UTF-8");
        JspWriter out = response.getWriter();
        
        out.write("<html>\n");
        out.write("<head>\n");
        out.write("    <title>Hello JSP</title>\n");
        out.write("</head>\n");
        out.write("<body>\n");
        out.write("    <h1>Hello, ");
        out.print(request.getParameter("name"));
        out.write("!</h1>\n");
        out.write("    <p>現在時刻: ");
        out.print(new java.util.Date());
        out.write("</p>\n");
        out.write("</body>\n");
        out.write("</html>\n");
    }
}

web.xml での設定

Jasper サーブレット設定

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>development</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

主要な設定パラメータ

開発関連

パラメータ説明デフォルト
development開発モード(変更検出有効)true
checkInterval変更チェック間隔(秒)0(毎回チェック)
modificationTestInterval変更テスト間隔(秒)4
recompileOnFailコンパイル失敗時の再試行false

コンパイル関連

パラメータ説明デフォルト
compiler使用するコンパイラJDTコンパイラ
compilerSourceVMソースのJavaバージョンJVMのバージョン
compilerTargetVMターゲットのJavaバージョンJVMのバージョン
fork別プロセスでコンパイルfalse

パフォーマンス関連

パラメータ説明デフォルト
trimSpaces空白文字を削除false
genStringAsCharArray文字列をchar配列として生成false
keepgenerated生成されたJavaソースを保持true

本番環境向け設定

推奨設定

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>development</param-name>
        <param-value>false</param-value>  <!-- 変更検出を無効化 -->
    </init-param>
    <init-param>
        <param-name>trimSpaces</param-name>
        <param-value>true</param-value>   <!-- 空白削除で出力サイズ削減 -->
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

プリコンパイル

本番環境では、デプロイ前にJSPをプリコンパイルすることを推奨:

# Ant タスクを使用したプリコンパイル
ant -f build.xml jspc

# または JspC を直接実行
java -cp ... org.apache.jasper.JspC -webapp /path/to/webapp -d /path/to/output

トラブルシューティング

よくあるエラー

エラー原因対処
JSPコンパイルエラーJSP構文エラーJSPファイルの構文確認
ClassNotFoundExceptionクラスパスの問題lib/へのJAR配置確認
初回アクセスが遅いコンパイル処理プリコンパイルを検討

ワークディレクトリのクリア

JSPの変更が反映されない場合:

# workディレクトリをクリア
rm -rf $CATALINA_HOME/work/Catalina/localhost/<app_name>/

# Tomcatを再起動
$CATALINA_HOME/bin/shutdown.sh
$CATALINA_HOME/bin/startup.sh

生成されたソースの確認

デバッグ時に、生成されたJavaソースを確認:

# 生成されたJavaソースを表示
cat $CATALINA_HOME/work/Catalina/localhost/ROOT/org/apache/jsp/hello_jsp.java

JSP vs 現代のフレームワーク

特徴JSP現代のフレームワーク
学習コスト低い中〜高
パフォーマンス良好同等以上
開発効率中程度高い
保守性低め高い
使用状況レガシー/既存システム新規開発

Note: 新規プロジェクトでは、Spring Boot + Thymeleaf、React、Vue.jsなどの現代的な選択肢が推奨される。JSPは主に既存システムの保守で使用される。

関連項目