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

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

GETリクエスト/POSTリクエスト
  ・クライアントからのHTTPリクエストは、GETリクエストとPOSTリクエストがある。
  ・URLに直接アクセス場合のHTTPリクエストは、GETリクエスト
  ・サーブレットでは、リクエスト種別に対応したメソッドが呼び出される。
  ・メソッドの実行が終わると、クライアントにレスポンスが返る。
  ・作成されたサーブレット「SampleServlet.java

レスポンスの生成
  ・クライアントへのレスポンスは、HttpServletResponseオブジェクトと表される。
  ・このオブジェクトはWebコンテナで生成され、メソッドの引数として渡される。
  ・作成されたサーブレットを書き換える。
protected void doGET(HttpServletRequest reqest, HttpServletResponse response) throws ServletException IOException { //レスポンスのコンテンツタイプ、エンコーディング方式 response.setContentType("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/WebApp_sample/sample
Hello Servlet

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

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

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

フォームによるデータ送信
  ・作成するプロジェクト(WebApp_servlet_form)のEclipse ProjectExplorer
  ・作成するHTML apply-form.html
  ・form要素
method属性:リクエスト種別(GET/POST)を指定
action属性:データの送信先を指定
  ・input要素
name属性:リクエストパラメータの「パラメータ名」を指定
value属性:リクエストパラメータの「値」を指定
  ・作成するサーブレット ApplyFormServlet.java

リクエストパラメータの取り出し
  ・クライアントからのリクエストは、HttpServletRequestオブジェクトと表される。
  ・このオブジェクトはWebコンテナで生成され、メソッドの引数として渡される。
  ・getParameterメソッドやgetParameterValuesメソッドの引数としてパラメータ名を指定
  ・WebAPの利用者側から見た画面遷移(図) 「依頼フォーム」→「依頼受付完了」
  ・URL http://localhost:8080/WebApp_servlet_form/apply-form.html

リクエストの転送(フォワード)
  ・作成するプロジェクト(WebApp_servlet_transfer)のEclipse ProjectExplorer
  ・使用するHTML apply-form.html
  ・作成する(変更する)サーブレット ApplyFormServlet.java(変更後)
  ・作成するサーブレット ForwardingServlet.java web.xml
  ・サーブレットでは、クライアントのリクエストを他のリソースに転送できる。
  ・クライアントへのレスポンスなどは、転送先のリソースが行える。
  ・転送は、RequestDispatcherオブジェクトのforwardメソッドを使う。
  ・このオブジェクトは、requestオブジェクトのgetRequestDispatcherを使い取得
  ・getRequestDispatcherメソッドの呼び出し時に、転送先のリソースのパスを指定
  ・forwardメソッドの引数として、リクエストオブジェクトとレスポンスオブジェクトを指定

スコープ
  ・JavaWebアプリケーションで、オブジェクトの存続期間を決める。
  ・スコープには任意のデータを保持できる。
  ・3種類のスコープに対応するインターフェースは、あらかじめ定められている。
アプリケーションスコープ
セッションスコープ:ステートフル通信(複数のリクエスト間でステート(情報)を共有)
リクエストスコープ:ステートレス通信(1リクエスト単位で情報が管理される)
  ・スコープへのデータの設定や取得の操作
対応するインターフェースを実装したクラスのオブジェクトに対して行う。

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

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

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