Javaサーブレット
サーブレット(Servlet)、JSP(JavaServer Pages)、JSP STL(JavaServer Pages Standard Tag Library)は従来から使われているサーバーサイドJavaの技術です。これら3つの関係は、次のようにサーブレットが基盤となり、これを利用するかたちでJSPが存在し、さらにJSPを扱いやすくするためのJSP STLが載っかっているという関係です。
Webコンテナとは、Webサーバ上で動作するJava言語で開発されたソフトウェア部品(JavaサーブレットやJSP)の実行環境となるソフトウェア。
Webコンテナの仕様はJava EE(Java Enterprise Edition)の一部として規定されており、標準に基づいて開発されたサーブレットはどのコンテナでも同じように動作する。サーバ内部での処理を担当するEJBコンテナの機能を兼ねるものもある。
https://image.itmedia.co.jp/ait/articles/1607/01/r20_03_img09.jpg
https://image.itmedia.co.jp/ait/articles/1607/01/r20_03_img10.jpg
「クライアントのブラウザーからリクエストがあると、アプリケーションサーバー内でサーブレットが実行され、処理結果としてHTMLが出力されるという流れになります。もちろん、HTMLを出力するためのメソッドはサーブレットクラス内部で定義しますので、何らかの処理を行ったあと、このメソッドが実行されてHTMLが出力されます」
「インスタンス化は、アプリケーションサーバー(GlassFish)の内部でインスタンス化の処理が行われます。アプリケーションサーバーに搭載されているサーブレットやJSPを実行する機能のことを『JSP&サーブレットコンテナー』と呼ぶことがありますが、このコンテナーがインスタンス化を行い、内部のメソッドを呼び出すようになっています」
「さらにスルドイですね。確かにJavaのプログラムは、起動直後にまずmain()メソッドが呼ばれます。で、main()メソッドの処理もコンテナーの内部で定義されていて、そこからサーブレットのメソッドを呼び出すようになっています」
https://image.itmedia.co.jp/ait/articles/1607/01/r20_05_img03.gif
「メモリを節約するためです。クライアントからアクセスがあるたびにインスタンスを生成していると、アクセス数が増えるととたんにメモリリーク(使用可能なメモリ領域がなくなること)を起こし、処理が止まってしまいます。無限のメモリ領域を用意できればリクエストごとにインスタンスを生成すればいいのですが、そういうわけにもいきません。Web上で運用することを考えれば、クライアントごとに1つのインスタンスを与えるのではなく、生成済みのインスタンスを活用してすべてのクライアントに対応することが必要なのです」
「ポイントは『スレッドには中身がない』ってことです。あくまでインスタンスに関連付けられたメソッドを呼び出したり、フィールドを参照したりするだけの『小さなプログラム』です。で、先程『クライアントのぶんだけスレッドが生成される』といいましたが、正確には『あらかじめ用意されたスレッドを使う』のです。スレッドの生成にもそれなりのコストがかかるので、アプリケーションサーバーはあらかじめいくつかのスレッドを『スレッドプール』として用意しています」
「もちろん、スレッドを生成させるコードを書く必要はありません。サーブレットを呼び出せば、自動的にスレッドが割り当てられるのですね。で、『1つのサーブレットから生成されたスレッドはメモリ空間を共有する』ということになるのです」
https://image.itmedia.co.jp/ait/articles/1607/01/r20_05_img08.gif
「public abstract class HttpServlet extends GenericServlet」
サブクラス化する抽象クラスを提供して、Web サイトに適した HTTP サーブレットを作成します。HttpServlet のサブクラスは、少なくとも 1 つのメソッド、通常は次のいずれかをオーバーライドする必要があります。
doGet、サーブレットが HTTP GET リクエストをサポートする場合
doPost、HTTP POST リクエスト用
doPut、HTTP PUT リクエスト用
doDelete、HTTP DELETE リクエスト用
init および destroy、サーブレットの存続期間中保持されるリソースを管理する
getServletInfo、サーブレットは自身に関する情報を提供するために使用する
service メソッドをオーバーライドする理由はほとんどありません。service は、HTTP リクエストタイプごとにハンドラーメソッド(上記の doXXX メソッド)にディスパッチすることにより、標準の HTTP リクエストを処理します。
同様に、doOptions メソッドと doTrace メソッドをオーバーライドする理由はほとんどありません。
サーブレットは通常マルチスレッドサーバーで実行されるため、サーブレットは同時リクエストを処理する必要があることに注意し、共有リソースへのアクセスを同期するよう注意してください。共有リソースには、インスタンス変数やクラス変数などのメモリ内データと、ファイル、データベース接続、ネットワーク接続などの外部オブジェクトが含まれます。Java プログラムでの複数のスレッドの処理の詳細については、マルチスレッドプログラミングに関する Java チュートリアルSEを参照してください。
「public abstract class GenericServlet extends ObjectSE implements Servlet, ServletConfig, SerializableSE」
汎用の、プロトコルに依存しないサーブレットを定義します。Web で使用する HTTP サーブレットを作成するには、代わりに HttpServlet を継承します。
GenericServlet は、Servlet および ServletConfig インターフェースを実装します。GenericServlet はサーブレットによって直接拡張できますが、HttpServlet などのプロトコル固有のサブクラスを継承する方が一般的です。
GenericServlet は、サーブレットの作成を容易にします。ライフサイクルメソッド init および destroy および ServletConfig インターフェースのメソッドの単純なバージョンを提供します。GenericServlet は、ServletContext インターフェースで宣言された log メソッドも実装します。
汎用サーブレットを作成するには、抽象 service メソッドをオーバーライドするだけです。
JSP
ライフサイクル
https://www.fujitsu.com/jp/group/fap/imagesgig5/penguin22_tcm218-5619756.gif
プログラマーが書いたJSPに対して、最初のリクエストが来ると、JSPコンテナはServletソースに変換するのです。
そして次にそれをコンパイルします。 Servletではプログラマーがコンパイルしなければならなかったのに対し、JSPコンテナは自動変換の後、コンパイルも自動的にやってくれるのです。 そしてそれがメモリにロードされます。 もしjspInitメソッドが宣言されていればまずそれが実行され、次に_jspServiceメソッドが実行されます。 jspInitメソッドが宣言されていなければ、直ちに_jspServiceメソッドが実行されます。 これらの実行の結果、クライアントにレスポンスが返ります。
関連:
public interface JspPage extends Servlet
void jspInit()
jspInit() メソッドは、JSP ページが初期化されるときに呼び出されます。この時点で getServletConfig() メソッドを呼び出すと目的の値が返されるのは、JSP 実装(および、存在する場合は extends 属性で指定されたクラス)の責任です。JSP ページは、宣言要素にその定義を含めることにより、このメソッドをオーバーライドできます。JSP ページは、サーブレットから init() メソッドを再定義する必要があります。
void jspDestroy()
jspDestroy() メソッドは、JSP ページが破棄されようとしているときに呼び出されます。JSP ページは、宣言要素にその定義を含めることにより、このメソッドをオーバーライドできます。JSP ページは、サーブレットから destroy() メソッドを再定義する必要があります。
カスタムタグ
JSPでは標準で<jsp:useBean><jsp:getProperty>などのタグがサポートされていますが、その他にも独自にタグを定義する事ができます。
<(接頭辞):(カスタムタグ名) (属性1)="..." (属性2)="..." ... > ボディ部 </(接頭辞):(カスタムタグ名)>
例えば接頭辞が「mytag」で、カスタムタグ名が「date」の場合、 <myTag:date /> となります。
カスタムタグを使用するには以下のことを行う必要があります。
タグハンドラクラスの作成
タグライブラリ・ディスクリプタ(タグの設定ファイル)の作成
***.tld を 「WEB-INF/tld」や「WEB-INF」直下に置く
web.xmlへタグライブラリの設定追加(省略可能)
JSPファイルで使用するタグライブラリの設定(taglibディレクティブ)
他で提供されているカスタムタグを使用する場合には、上記の3以降を行えば良いです。