JSPライフサイクル:フェーズと図の説明
⚡ スマートサマリー
JSPライフサイクルとは、コンテナがページをサーブレットに変換し、コンパイルし、クラスをロードし、インスタンスを作成し、初期化し、生成されたサービスメソッドを介してすべてのリクエストを処理し、最後に破棄するプロセスを説明するものです。

JSPライフサイクルとは何ですか?
JSPのライフサイクル JSPページをサーブレットに変換するプロセスと定義されます。なぜなら、JSPページはサービスリクエストを処理する前にサーブレットに変換される必要があるからです。ライフサイクルはJSPの作成から始まり、そこから生成されたサーブレットインスタンスの破棄で終了します。
生成されたクラスは通常のサーブレットであるため、サーブレットについて既に知っていることはすべてtract は依然として適用されます。 Java コンテナが書き出すコードが実際に実行されるものであり、JSPファイルはあなたが管理するソースコードにすぎません。
JSP ライフサイクルのさまざまなフェーズ
ブラウザがJSPを要求すると、JSPエンジンはまずページをコンパイルする必要があるかどうかを確認します。JSPが一度もコンパイルされていない場合、または前回のコンパイル以降に変更されている場合は、JSPエンジンはページをコンパイルします。
JSPページのコンパイルプロセスは、次の3つのステップで構成されます。
- JSPの解析
- JSP をサーブレットに変換する
- サーブレットのコンパイル
JSP ライフサイクル図
JSPライフサイクルは、以下の図に示されています。 tracソースファイルからコンテナが実行するクラスまでの単一のページです。
次の手順は、JSP のライフ サイクルを説明しています。
- JSPページの翻訳
- JSPページのコンパイル(JSPページを_jsp.javaにコンパイル)
- クラスローディング(_jsp.java はクラスファイル _jsp.class に変換されます)
- インスタンス化(生成されたサーブレットのオブジェクトが作成される)
- 初期化(コンテナによってjspInit()メソッドが呼び出されます)
- リクエスト処理(コンテナによって_jspService()メソッドが呼び出されます)
- 破棄(jspDestroy() メソッドはコンテナによって呼び出されます)
JSPライフサイクルの各段階の説明
それでは、上記の各点についてさらに詳しく見ていきましょう。
1) JSPページの翻訳:
A Java サーブレットファイルはJSPソースファイルから生成されます。これはJSPライフサイクルの最初のステップです。変換フェーズでは、コンテナがJSPページとタグファイルの構文の正しさを検証します。
- JSPコンテナは、標準ディレクティブとアクション、およびタグライブラリを参照するカスタムアクションを解釈します(これらはすべてJSPページの一部であり、 JSP要素 この JSP ページで使用されているチュートリアル)
- 上記の図解説明では、最初のステップで demo.jsp が demo_jsp.java に変換されます。
以下に示す「demo.jsp」を例にとってみましょう。
デモ.jsp
<html>
<head>
<title>Demo JSP</title>
</head>
<%
int demvar=0;%>
<body>
Count is:
<% Out.println(demovar++); %>
<body>
</html>
上記のリストに関する注記: これは、後述の生成済みサーブレットのスクリーンショットと一致するように、公開されたとおりに正確に再現されています。ただし、2つのスペルミスは、そのままコピーするとコンパイルされません。変数は次のように宣言されています。 demvar しかし印刷された demovar暗黙の出力オブジェクトは out 小文字で、 Outページを自分で実行する前に、両方とも修正してください。
Code Demo.jspの説明
Code 1行目:HTML開始タグ
Code 2行目:ヘッドタグ
Code 3行目~4行目:タイトルタグ(例:デモJSP)、および閉じタグ(headタグ)
Code 5行目~6行目:変数demoが初期化されるスクリプトレットタグ
Code 7行目~8行目:本文タグ内に、出力に表示されるテキスト(カウントは:)
Code 9行目:変数demovarをインクリメントした値で出力しようとするスクリプトレットタグ
Code 10行目~11行目:bodyタグとHTMLタグを閉じる
デモJSPページは、以下のコードに示すdemo_jspサーブレットに変換されます。
Code Demo_jsp.javaの説明
Code 1行目:サーブレットクラスdemo_jspは親クラスHttpServletを継承しています
Code 2行目~3行目:JSPのサービスメソッド、つまりHttpServletRequestオブジェクトとHttpServletResponseオブジェクトをパラメータとして持つ_jspServiceをオーバーライドします。
Code 4行目:開始方法
Code 5行目:getメソッドを呼び出すWriterレスポンスオブジェクトの()を使用してPrintを取得しますWriter オブジェクト(オブジェクトの書式設定された表現をテキスト出力ストリームに出力します)
Code 6行目:レスポンスオブジェクトのsetContentTypeメソッドを呼び出してコンテンツタイプを設定します。
Code 7行目:Printのwrite()メソッドを使用するWriter HTMLを解析するオブジェクト
Code 8行目:demovar変数を0に初期化します
Code 9行目:Printのwrite()メソッドを呼び出すWriter テキストを解析するオブジェクト
Code 10行目:Printクラスのprint()メソッドを呼び出すWriter オブジェクトは変数 demovar を 0 + 1 = 1 からインクリメントします。したがって、出力は 1 になります。
Code 11行目:Printのwrite()メソッドを使用するWriter HTMLを解析するオブジェクト
出力:
するとブラウザはカウンターを表示します。下のスクリーンショットをご覧ください。
- スクリーンショットを見ると、出力が1になっていることがわかります。これは、demvarが0に初期化され、その後0 + 1 = 1にインクリメントされるためです。
上記の例では、
- demo.jspは、1つの変数が初期化され、インクリメントされるJSPファイルです。このJSPファイルはサーブレット(demo_jsp.class)に変換され、JSPエンジンがJSPページを読み込み、サーブレットコンテンツに変換します。
- 変換が行われると、すべてのテンプレート テキストが println() ステートメントに変換され、すべての JSP 要素が Java コード。
これは、単純な JSP ページがサーブレット クラスに変換される方法です。
2) JSPページのコンパイル
- 生成された Java サーブレットファイルはコンパイルされて Java サーブレットクラス
- 翻訳 Java ソースページから実装クラスへの変換は、JSPページがコンテナにデプロイされてからJSPページが処理されるまでの間のいつでも発生する可能性があります。
- 上記の図解では、demo_jsp.java は demo_jsp.class というクラスファイルにコンパイルされます。
- Apache Tomcatでは、両方のアーティファクトはサーバーの作業ディレクトリに書き込まれます。
work/Catalina/localhost/<app>/org/apache/jsp翻訳エラーを診断する際に最初に確認すべき箇所は、
3) クラスローディング
- JSPソースから生成されたサーブレットクラスがコンテナにロードされました。
4) インスタンス化
- このステップでは、オブジェクト、つまりクラスのインスタンスが生成されます。
- コンテナは、リクエストやその他のイベントに応じて、このクラスのインスタンスを1つ以上管理します。通常、JSPコンテナはサーブレットコンテナを使用して構築されます。JSPコンテナはサーブレットコンテナの拡張機能であり、どちらのコンテナもJSPとサーブレットをサポートしています。
- コンテナによって提供される JspPage インターフェースは、jspInit() メソッドと jspDestroy() メソッドを宣言しています。
- HTTPリクエストを処理するHttpJspPageインターフェースがあり、その中にサービスメソッドが含まれています。そのシグネチャはプロトコルに依存するため、ページ作成者に宣言を求めるのではなく、コンテナがそのメソッドを生成します。
5) 初期化
public void jspInit() { //initializing the code }
- jspInit() メソッドは、JSP から生成されたサーブレットインスタンスを初期化し、このフェーズでコンテナによって呼び出されます。
- インスタンスが作成されると、その直後にinitメソッドが呼び出されます。
- これはJSPライフサイクル中に一度だけ呼び出され、初期化メソッドは上記のように宣言されます。
6) リクエスト処理
void _jspservice(HttpServletRequest request HttpServletResponse response) { //handling all request and responses }
- _jspService() メソッドは、JSP ページがそのライフサイクル中に発生させたすべてのリクエストに対してコンテナによって呼び出されます。
- この段階では、ページは上記のすべての段階を経る必要があり、その後初めてサービスメソッドを呼び出すことができます。
- リクエストオブジェクトとレスポンスオブジェクトを渡します
- このメソッドは、コンテナが変換時に書き込むため、オーバーライドできません。
- 上記のメソッドは、GET、POST、その他すべてのHTTPメソッドを処理する役割を担っています。
7) 破壊する
public void _jspdestroy() { //all clean up code }
- jspDestroy() メソッドはコンテナによっても呼び出されます
- このメソッドは、コンテナがリクエストを処理するためにサーブレットインスタンスを必要としなくなったと判断したときに呼び出されます。
- destroy メソッドが呼び出されると、サーブレットはガベージコレクションの準備が整います。
- これがライフサイクルの終わりです。
- データベース接続の解放や開いているファイルのクローズなど、クリーンアップ処理を行う際には、jspDestroy() メソッドをオーバーライドすることができます。
覚えておくべき命名上の注意点が1つあります。ジャカルタEE 9以降、これらのタイプは jakarta.servlet.jsp パッケージではなく javax.servlet.jspそのため、アプリケーションを最新のサーバーに移行する際には、古いインポートを更新する必要があります。



