Servlet

サーブレットメモ

  • JSPも1つのサーブレット(実行時にサーブレットに変換される)

ライフサイクル

  • サーブレットは「シングルインスタンス・マルチスレッド」モデル
    • web.xmlに<servlet>で登録された単位でインスタンスが生成される
 <web-app (略)>
  (中略)
   <servlet>
     <servlet-name>AAAServlet</servlet-name>
     <servlet-class>xxxx.AAAServlet</servlet-class>
   </servlet>
   <servlet>
     <servlet-name>BBBServlet</servlet-name>
     <servlet-class>xxxx.BBBServlet</servlet-class>
   </servlet>
※上記の場合、AAAServletのインスタンスが1つ、BBBServletのインスタンスが1つ生成される

 <web-app (略)>
  (中略)
   <servlet>
     <servlet-name>AAAServlet</servlet-name>
     <servlet-class>xxxx.AAAServlet</servlet-class>
   </servlet>
   <servlet>
     <servlet-name>BBBServlet</servlet-name>
     <servlet-class>xxxx.AAAServlet</servlet-class>
   </servlet>
※上記の場合も、AAAServletのインスタンスが1つ、BBBServletのインスタンスが1つ生成される。ただし、実体は同じクラスのインスタンスが別名で2つ存在することになる。

  • サーブレット内にdoメソッドと同列に宣言された変数(インスタンス変数)に設定された値は、複数リクエストで共有される
    • インスタンス変数は原則として読み取り専用のデータ以外を扱うべきでない
    • 複数のリクエスト間でインスタンス変数以外で情報を共有したい場合は、セッション属性やアプリケーション属性を利用すべき。


お約束

  • 下記のクラスをimportする
    • java.io.IOException
    • javax.servlet.ServletException
    • javax.servlet.http.HttpServlet
    • javax.servlet.http.HttpServletRequest
    • javax.servlet.http.HttpServletResponse
  • HttpServletを継承する
  • サーブレットの起点は下記のメソッド
    • doDelete
    • doGet
    • doHead
    • doOptions
    • doPost
    • doPut
    • doTrace

暗黙オブジェクト

暗黙オブジェクト 元となるクラス/インタフェース名 作成方法
application javax.servlet.ServletContext ServletContext application = this.getServletContext();
config javax.servlet.ServletConfig SevletConfig config = this.getServletConfig();
exception java.lang.Throwable -
out javax.servlet.jsp.JspWriter PrintWriter out = response.getWriter();
session javax.servlet.http.HttpSession HttpSession session = request.getSession();
request javax.servlet.ServletRequest(javax.servlet.HttpServletRequest) doメソッドの引数として引き渡される
response navax.servlet.ServletResponse(javax.servlet.HttpServletResponse) doメソッドの引数として引き渡される

JSPの動作手順

  1. JSPを作成する
  2. アプリケーションルート配下の任意のフォルダに配置する(/WEB-INF, /META-INFを除く)
  3. ブラウザからパスを指定して呼び出す

サーブレットの動作手順

  1. サーブレットクラスを作成する(.javaファイル)
  2. コンパイルする
  3. .classファイルをパッケージ構造に従った形で/WEB-INF/classes配下に配置する
  4. /WEB-INF/web.xml にサーブレットを登録する
※web.xmlを変更した場合、必ずTomcatを再起動する

サーブレットとJSPの連携

処理転送(forward)

  • リダイレクト処理
    • 一旦レスポンスをクライアントに返し、自動的にサーバにリクエストを発生させる仕組み
    • クライアントとサーバ間で2回やりとりが発生する
  • forward処理
    • サーバ内で処理を転送する
    • クライアントとサーバ間のやりとりは1回だけ
    • リクエスト属性を引き継ぐことができる

インクルード処理(include)

  1. サーブレット1によって処理される
  2. インクルードされたサーブレットBに渡される
  3. インクルードされたサーブレットBの処理が完了した後に元のサーブレットAに返される

データのスコープ

  • アプリケーション属性
    • アプリケーション内の全ファイルで共有(ユーザ間で共有)
  • セッション属性
    • アプリケーション内の全ファイルで共有(同一ユーザ)
  • リクエスト属性
    • 1つのリクエスト処理内で共有
    • forwardによりデータ引継ぎ可能
  • ページ属性
    • 同じページ内のみ(1サーブレット/1JSP内のみ)


■サーブレットクラスの挙動
1. サーブレットクラスのロード
2. initメソッド実行(初期化処理)
 ⇒サーブレットの初回起動時、アンロード(更新)時に実行される
3. serviceメソッドの振り分け
4. doメソッドの実行(実処理)
5. destroyメソッド実行(終了処理)
 ⇒サーブレットの初回起動時、アンロード(更新)時、コンテナ終了時に実行される

※リクエストのたびに実行されるのは、3と4。
※サーブレットの更新時は、5 → 2の流れ。
※デフォルトでは、initメソッドは、コンテナ起動時ではなく、サーブレットクラスが初めて呼び出されたタイミングで実行される。
 ⇒コンテナ起動時にinitを実行するためには、web.xmlの<servlet>内に<load-on-startup>を指定する

■Webアプリでのサーブレットクラスの役割
  • MVCのC(Controller)であること。
  • 処理呼び出しの流れを知っている。
  • JavaBeansクラスを次々と呼び出す。

■JavaBeansのお約束

JavaBeansとは「クラスをより汎用的に部品化できるように、ちょっとしたルールづけをしたもの」

  • 引数の無いコンストラクタを持つこと
  • プロパティを参照/更新するためのアクセサメソッド(set/getメソッド)を定義すること
 ⇒外部から直接アクセスできるフィールドを持たないこと
 ⇒プロパティに対する読み書きが制御できる
 ⇒値の参照/更新時に任意の処理を記述できる
  • Serializableインタフェースを実装すること
 ⇒そのままではデータベースやファイル、ネットワーク上でやり取りすることのできないオブジェクト形式のデータを、中性的なバイト列に変換/復元させる機能。
 ⇒データ共有を目的としたJavaBeansでは必要な機能

■フロントコントローラ
  • サーブレットとURLが 1:n の関係にあるサーブレット

   <servlet>
     <servlet-name>PathServlet</servlet-name>
     <servlet-class>xxxx.PathServlet</servlet-class>
   </servlet>
   (中略)
   <servlet-mapping>
     <servlet-name>PathServlet</servlet-name>
     <url-pattern>xxxx.PathServlet/*</url-pattern>
   </servlet-mapping>

[呼び出しURL]
 1. ~/xxxx/PathServlet/Book
 2. ~/xxxx/PathServlet/News
 3. ~/xxxx/PathServlet/Info
[処理の流れ]
 1. PathServletが呼び出される
 2. request.getPathInfoで残りのパスを取得する
 3. パスの中身を見て、Bookクラス、Newsクラス、Infoクラスを呼び分ける
 ※/Book/history などと、スラッシュ区切りで情報を増やしてもかまわない
  ⇒その場合はgetPathInfoをした後、手動で解析する必要がある。

タグ:

+ タグ編集
  • タグ:
最終更新:2010年03月03日 20:11