【勉強メモ】JSP
恥ずかしながら、性能検証をしている時にJSPのコンパイル周りが怪しく、
今さらながら、JSPのコンパイルの仕組みを知りたいと思い、ネットで調べてみたことをメモしておく。
(だいぶ殴り書きなので汚いです)
■JSPとは
HTMLにJavaコードを埋め込み、動的ページを生成する機能のこと。
※<%と%>記号で囲まれたスクリプトレットとよばれるコードを埋め込み、サーバーサイドで動作させる。
・JSPとJavaServeletの違い
機能面だけを考えると、Java ServletでできることとJSPでできることには、ほとんど違いがない。
だが形式面では異なる
JSP:HTMLの中に、Javaコードを記述する。
Servlet:Javaクラスのコード内に、HTMLを記述する
■JSPのライフサイクル
【大きな流れ】
リクエスト
Webサーバが受信したリクエストのURLを解析し、
.jspというファイルが指定されていた場合は、Webサーバ自身は処理を行わず、
その処理を、JSPプロセッサに依頼する
↓
JSPプロセッサが、指定されたJSPファイルを解析して実行し、結果をクライアントに送信する
■JSPプロセッサ上の処理の流れ
※下記がすべてJSPコンテナ(JSPエンジン)によって実行される
JSPファイルを解析し、対応するサーブレット(Javaファイル)へ変換される
↓
サーブレットがクラスファイルに変換(コンパイル)される
↓
コンパイルされたクラスファイルがメモリ上にロードし、
サーブレットのインスタンスを作成する ★
↓
ijspInit()というメソッドを呼び出し、サーブレットプログラムの初期化を行う ★
※実行されるのは一度だけ
↓
リクエストがある度に、_jspService()というメソッドで処理を実行する
※2回目以降は同じインスタンスが共有して利用される。
インスタンスを作成する時間がかからない
↓
jspDestory()メソッドでリソースを解放する(=インスタンスの破棄)
※コンテナが終了したり、一定時間アクセスがなかった場合に実行される
JSPはServletに変換されて実行される
2回目以降のリクエストでは生成済みのクラスファイルを利用する
====
で、そもそも知りたいこと・・
■JSPコンパイル
・誰が(OS?Tomcat?JDK?)
サーブレットコンテナ
・何を対象に?
→呼ばれたJSPを対象に
※JSPがコンパイルされる場所はxmlファイルに指定することが可能。
Tomcat5.5.9では、 %TOMCAT_HOME%\conf\server.xml
参考:http://www.confrage.com/tomcat/jsp/jsp_compile/jsp_compile.html
・何をしている(プログラムが)
→サーブレットソースに変換し、サーブレットクラスに変換している。
・リソースにどう影響するのか(SYSが上がる?USRが上がる?)
→USRでは・・??
■Javaサーブレット(通称:サーブレット)
・概要
サーバ上で動作するJavaプログラム。
・役割/特徴
・最初の起動は必要だが、一回起動するとその後はメモリ上に常駐するため、
2回目以降の処理は高速に処理させることが可能。
※CGIではリクエストのたびに毎回ロードされる
※サーブレットを起動するサーバー上でひとつのスレッドとして動く。
・マルチスレッド
1プロセス上で複数リクエストを処理するため、使用メモリサイズが少なくてすむ。
(CGIでは10のリクエストがあれば10のプログラムがロードされる)
・セッション管理
同一クライアントとの一連の処理の間、データを保持する仕組み(セッション管理)がある。
参考:http://jp.fujitsu.com/solutions/sdas/technology/web-apl/02-servlet.html
■サーブレットコンテナ(サーブレットエンジン)
・概要
Javaサーブレットを動作させるソフトウェアのこと。
Webサーバと連携して動作する。
・例
Apache Tomcat、JBOSS、Jettyなど
・Servletのライフサイクル
参考:http://thinkit.co.jp/cert/article/0708/2/1/3.htm
?init()メソッド:サーブレットのロードと初期化
↓
?service()メソッド:サーブレットの実行
サーブレットの初期化以降はリクエストがある度にservice()メソッドを呼び出す。
このメソッドではHTTPリクエストを解析し、GET,POSTというメソッドごとに
doGet()、doPost()といったメソッドに渡す
この処理が終了しても、サーブレットはコンテナに常駐し、リクエストが来る度に処理を繰り返す。
↓
?destroy()メソッド:サーブレットの破棄
init()で取得したリソースを解放する。これ以後、service()メソッドが呼ばれることはない
参考:http://jp.fujitsu.com/solutions/sdas/technology/j2ee/02-servlet.html
初期化・破棄を一度しか行わないことで、複数のリクエストに対しても必要な処理だけを繰り返し実行させることができるため、パフォーマンス向上がはかられている。