サーブレット
 サーブレット作成
 リクエスト
 レスポンス生成
 サーブレット実行
 マルチスレッド
 ライフサイクル
 リクエストパラメータ
 フォームデータ送信
 パラメータの取出し
 リクエストの転送
 スコープ
 リクエストスコープ
 セッション管理
 セッションスコープ

 サーブレット
 ・Webコンテナ上で動作するJavaアプリケーション
 ・クライアントのリクエストに応じたレスポンスを生成できる。
 ・Webコンテナにより、リクエストのURL対応するサーブレットが実行される。
 ・クライアントのリクエスト種別に対応したメソッドが呼び出される。
 ・動作
サーブレットに初回リクエスト→クラスロード→インスタンス生成
2回目以降のリクエストは、メモリにロード済のインスタンスがレスポンス

 サーブレットの作成(Eclipse)
 ・サーブレットを作成するプロジェクトを右クリック、新規→サーブレット選択
 ・サーブレットは、javax.servlet.http.HttpServletクラスを継承
HTTPプロトコルに特化したサーブレットを作成するための抽象クラス
JavaEEのAPIに定義
ソース・フォルダー:\WebAppSample\src\main\java
Java パッケージ:servlet
クラス名:SampleServlet
スーパークラス:javax.servlet.http.HttpServlet
 ・URLマッピングの指定
このサーブレットに対応付けるURLの文字列を指定
URLマッピング:/SampleServlet を編集 →/sample へ
http://localhost:8080/WebAppSample/sample
サーブレットのソースコードではアノテーションとして記述
@WebServlet("/コンテキストルートからのパス")
@WebServlet("/sample")
class SampleServlet extends HttpServlet{
(web.xml にURLマッピングの情報を登録してもよい。)
 ・オーバーライドするメソッドの指定
スーパークラスから継承されたメソッドのうち、オーバーライドするものを指定
doGet
doPost
 ・サーブレットが格納されるディレクトリ(プロジェクト・エクスプローラー)
   WebAppSample
     デプロイメント記述子:WebAppSample
     JAX-WS Web サービス
     .settings
     build
     src
         main
             java
                 servlet
                     SampleServlet.java
             webapp
                 META-INF
                 WEB-INF
                 index.html
         .classpath
         .project

 GETリクエスト/POSTリクエスト
 ・クライアントからのHTTPリクエストは、GETリクエストとPOSTリクエストがある。
 ・URLに直接アクセス場合のHTTPリクエストは、GETリクエスト
 ・サーブレットでは、リクエスト種別に対応したメソッドが呼び出される。
 ・メソッドの実行が終わると、クライアントにレスポンスが返る。 @WebServlet("/sample") class SampleServlet extends HttpServlet { ・・・ protected void doGET(・・・) throws ・・・ { ・・・ } protected void doPOST(・・・) throws ・・・ { ・・・ } }
 レスポンスの生成
 ・クライアントへのレスポンスは、HttpServletResponseオブジェクトと表される。
 ・このオブジェクトはWebコンテナで生成され、メソッドの引数として渡される。 protected void doGET(HttpServletRequest reqest, HttpServletResponse response) throws ServletException IOException { //レスポンスのコンテンツタイプ、エンコーディング方式 response.seType("text/html; charset=UTF-8"); //レスポンス書き出し用オブジェクトの取得 PrintWriter pw = response.getWriter(); //レスポンス書き出し pw.println("<!DOGTYPE html><html>"); pw.println("<head><title>Hello Servlet</title></head>"); pw.println("<body>Hello Servlet</body>"); pw.println("</html>"); } }
 サーブレットの実行
 ・localhost:8080/WebAppSample/sample
Hello Servlet

 マルチスレッド処理
 ・Webコンテナがメモリ上にロードされたサーブレットのメソッドを複数同時に実行
 ・スレッドセーフになるように作る。
 ・変数の面でのスレッドセーフ
ヒープ領域:クラス変数、インスタンス変数(他のスレッドで壊される可能性あり。)
スタック領域:ローカル変数(安全な変数)

 ライフサイクル
 ・あらかじめ用意されたメソッドをWebコンテナがライフサイクルに従って呼び出す。
コールバック方式(コンテナがユーザのプログラムを順次呼び出す方式)
 ・サーブレットの処理の進行
サーブレットのロード:インスタンス化
初期化処理:initメソッド
サービス処理:serviceメソッド(処理が終わると実行待ちになる。)
消滅処理:destroyメソッド
消滅

 リクエストパラメータ
 ・HTTPリクエストと同時に、クライアントからWebサーバに送られるデータ
パラメータ名と値のペアデータとして送られる。
 ・GETリクエストによるパラメータ送信
クエリ文字列としてURLの末尾に付加される。
送信可能な文字数に制限がある。
 ・POSTリクエストによるパラメータ送信
HTTPリクエストのメッセージボディ部に記述される。
送信可能な文字数に制限はない。

 フォームによるデータ送信
 ・form要素
method属性:リクエスト種別(GET/POST)を指定
action属性:データの送信先を指定
 ・input要素
name属性:リクエストパラメータの「パラメータ名」を指定
value属性:リクエストパラメータの「値」を指定

 リクエストパラメータの取り出し
 ・クライアントからのリクエストは、HttpServletRequestオブジェクトと表される。
 ・このオブジェクトはWebコンテナで生成され、メソッドの引数として渡される。
 ・getParameterメソッドやgetParameterValuesメソッドの引数としてパラメータ名を指定

 リクエストの転送(フォワード)
 ・サーブレットでは、クライアントのリクエストを他のリソースに転送できる。
 ・クライアントへのレスポンスは、転送先のリソースが行われる。
 ・転送は、RequestDispatcherオブジェクトのforwardメソッドを使う。
 ・このオブジェクトは、requestオブジェクトのgetRequestDispatcherを使い取得
 ・getRequestDispatcherメソッドの呼び出し時に、転送先のリソースのパスを指定
 ・forwardメソッドの引数として、リクエストオブジェクトとレスポンスオブジェクトを指定 protected void doPOST(HttpServletRequest reqest, HttpServletResponse response) throws ServletException IOException { //転送先のパスを指定して転送処理用のオブジェクトを取得 RequestDispatcher rd = request.getRequestDispatcher("transfer"); //リクエストの転送 rd.forward(request,response); }
 スコープ
 ・JavaWebアプリケーションで、オブジェクトの存続期間を決める。
 ・スコープには任意のデータを保持できる。
 ・3種類のスコープに対応するインターフェースは、あらかじめ定められている。
アプリケーションスコープ
セッションスコープ:ステートフル通信(複数のリクエスト間でステート(情報)を共有)
リクエストスコープ:ステートレス通信(1リクエスト単位で情報が管理される)
 ・スコープへのデータの設定や取得の操作
対応するインターフェースを実装したクラスのオブジェクトに対して行う。

 リクエストスコープ
 ・一つのリクエストに対してレスポンスを返すまで
主にリクエストの転送(フォワード)と共に使用する。
 ・スコープに保持できるデータは、「属性名(String型)」と「属性値(Object型)」のペア
 ・設定されたデータは、レスポンスをし終えると消滅
 ・リクエストスコープの利用
リクエストスコープに対応するのは、HttpServletRequestのオブジェクト
スコープへ値を設定する場合は、setAttributeメソッドを使う。
スコープへ設定した値を取得する場合は、getAttributeメソッドを使う。
取得した属性値は、適切な型にキャストする。

 セッション管理
 ・クライアント毎の情報をサーバ側で継続的に維持管理する仕組み
 ・一般的に、セッションIDを利用したセッション管理を行う。
 ・HTTP上でステートフルなWebサービスを実現
サーバはリクエストに対し、レスポンスとセッションIDを返す。
クライアントはリクエストとセッションIDを送る。(サーバはセッションIDでクライアントを認識)

 セッションスコープ
 ・セッションスコープは、セッション毎に生成
 ・スコープに保持できるデータは、「属性名(String型)」と「属性値(Object型)」のペア
 ・セッションスコープの利用
セッションスコープに対応するのは、HttpSessionのオブジェクト
スコープへ値を設定する場合は、setAttributeメソッドを使う。
スコープへ設定した値を取得する場合は、getAttributeメソッドを使う。
removeAttributeで不要になった属性を削除できる。
invalidateメソッドで不要になったセッションを無効にできる。
 ・セッションオブジェクトはWebコンテナで管理される。
セッションIDが発行されたタイミングで生成
セッションのタイムアウトや明示的な無効化消滅(Webコンテナで制御)