English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP 生命周期

JSPの下層機能を理解する鍵は、それらがどのようにライフサイクルを守っているかを理解することです

JSPライフサイクルは、作成から削除までの全体プロセスであり、servletライフサイクルに似ていますが、JSPライフサイクルにはJSPファイルをservletにコンパイルするプロセスが含まれます

以下はJSPライフサイクルで通過するいくつかのフェーズです:

  • コンパイルフェーズ:

    servletコンテナがservletソースファイルをコンパイルし、servletクラスを生成します

  • 初期化フェーズ:

    JSPに対応するservletクラスをロードし、そのサンプルを作成し、その初期化メソッドを呼び出します

  • 実行フェーズ:

    JSPに対応するservletサンプルのサービスメソッドを呼び出します

  • 削除フェーズ:

    JSPに対応するservletサンプルの削除メソッドを呼び出し、そのservletサンプルを削除します

明らかに、JSPのライフサイクルの主要な四つの段階はservletのライフサイクルと非常に似ており、以下に図を示します:

JSPのコンパイル

ブラウザがJSPページをリクエストした場合、JSPエンジンはまずそのファイルがコンパイルされているかどうかを確認します。このファイルがまだコンパイルされていないか、前回のコンパイルから変更されていれば、このJSPファイルをコンパイルします。

コンパイルプロセスは以下の三つのステップで構成されています:

  • JSPファイルを解析します。

  • JSPファイルをservletに変換します。

  • servletをコンパイルします。

JSPの初期化

コンテナがJSPファイルをロードした後、リクエストにサービスを提供する前にjspInit()メソッドを呼び出します。カスタムのJSP初期化タスクを実行する必要がある場合は、jspInit()メソッドをオーバーライドします。以下のようになります:

public void jspInit(){
  // 初期化コード
}

一般的にはプログラムは一度だけ初期化されますが、servletも同様です。通常、jspInit()メソッドでデータベース接続の初期化、ファイルの開き、クエリテーブルの作成を行うことができます。

JSPの実行

この段階は、JSPのライフサイクルにおいて破棄されるまでのすべてのリクエストに関連するインタラクションを説明しています。

JSPページが初期化が完了した後、JSPエンジンは_jspService()メソッドを呼び出します。

_jspService()メソッドはHttpServletRequestオブジェクトとHttpServletResponseオブジェクトを引数として必要とし、以下のようになります:

void _jspService(HttpServletRequest request,
                 HttpServletResponse response)
{
   // サーバーサイドの処理コード
}

_jspService()メソッドはそれぞれのrequestで一度呼び出され、対応するresponseを生成し、それに加えてすべての7HTTPメソッドの応答、例えばGET、POST、DELETEなどです。

JSPのクリーンアップ

JSPのライフサイクルの破棄段階は、JSPページがコンテナから削除される際に発生するすべてのことを説明しています。

jspDestroy()メソッドはJSPにおいてservletの破棄メソッドと等価です。jspDestroy()メソッドをオーバーライドすることで、データベース接続の解放やディレクトリの閉じるなどのクリーンアップ作業を実行できます。

jspDestroy()メソッドの形式は以下の通りです:

public void jspDestroy()
{
   // クリーンアップコード
}

オンラインサンプル

JSPのライフサイクルコードの例を以下に示します:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>"
<html>
<head>
<title>life.jsp</title>
</head>
<body>
<%! 
  private int initVar=0;
  private int serviceVar=0;
  private int destroyVar=0;
%>
  
<%!
  public void jspInit(){
    initVar++;
    System.out.println("jspInit(): JSPが初期化されました"+initVar+"回");
  }
  public void jspDestroy(){
    destroyVar++;
    System.out.println("jspDestroy(): JSPが破壊されました"+destroyVar+"回");
  }
%>
<%
  serviceVar++;
  System.out.println("_jspService(): JSPは合計で"+serviceVar+"回リクエスト");
  String content1="初期化回数 : "+initVar;
  String content2="応答クライアントリクエスト回数 : "+serviceVar;
  String content3="破壊回数 : "+destroyVar;
%>
<h1>基礎教程(oldtoolbag.com) JSP テスト例</h1>
<p><%=content1 %></p>
<p><%=content2 %></p>
<p><%=content3 %></p>
</body>
</html>

ブラウザでこのページを開き、出力結果が: