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は主に既存システムの保守で使用される。
関連項目
- Apache Tomcat - Tomcatの概要
- Catalina - サーブレットコンテナ
- Coyote - HTTPコネクタ