独習Javaサーバサイド編第2版 第6章まとめ

サーブレットの必要性

アプリケーションを構築する場合、ただ動けば良いのではなく、長期的に修正したり改造したりすることを考慮し、メンテナンスしやすいコードを書く必要がある
そのキーとなるのがサーブレットである

●暗黙オブジェクト

JSPによって自動的にインスタンス化されたオブジェクト

サーブレットの骨格

java.io,javax.servlet,javax.servlet.httpパッケージは必須

javax.servletおよびjavax.servlet.httpパッケージに属する4つのクラスはJSPでは自動的にインポートされるがサーブレットでは明示的にする必要がある

HttpServletクラスを継承すること

サーブレットがクライアントと通信を行うための最低限の手続きを定めた基本クラス

サーブレットの起点はdoXxxxxメソッド

サーブレットのエントリポイントとなるメソッド
エントリポイント とはクラスが呼び出されたタイミングで最初に実行されるメソッド
一般的によく使うのはdoGetかdoPostメソッド

doXxxxxメソッド
protected void doXxxxx(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
request:リクエスト情報
response:レスポンス情報
リクエストの実処理を定義する
XxxxxはGet,Post,Delete,Head,Options,Put,Traceのいずれか
@WebServletアノテーションを宣言する

サーブレットを呼び出すためのパス(URL)を宣言する
引数には呼び出しのパスを、アプリケーションルートからの絶対パスで指定

サーブレットをフォームから起動する

直接URLを指定してページを要求するとき、クライアントはサーバに対してGETという要求メソッドを送信している
その場合呼び出されたサーブレットはまずdoGetというメソッドを実行する

からページを要求する場合、クライアントはサーバに対してPOSTという要求メッセージを送信する
その場合呼び出されたサーブレットはdoPostメソッドを実行する
どのような場合にクライアントがGET要求あるいはPOST要求を発行するか

・doGetメソッドが呼び出されるケース
ブラウザから直接URLで指定した場合
ページ内のリンクから呼び出された場合
HTMLフォームの

タグでGET形式でページを要求した場合(
またはmethodオプションが無指定)
・doPostメソッドが呼び出されるケース
HTMLフォームの
タグでPOST形式でページを要求した場合(
)

JSP固有の要素に代わるもの

コンテンツタイプを指定する

@pageディレクティブのcontentType属性に相当する部分

response.setContentType("text/html;charset=UTF-8");

JSPページからでも呼び出せるが、コンテンツタイプが正しく認識されるためにはoutオブジェクトが生成される前にsetContentTypeメソッドをコールしなければならないので正しく認識されなくなる

暗黙オブジェクトを取得する

任意の文字列を出力するにはPrintWriterオブジェクトのprintメソッドまたはprintlnメソッドを呼びだす必要がある
暗黙オブジェクトに相当するが、サーブレットではそのまま使用することはできないので明示的にオブジェクトを生成する

スクリプトレットと宣言部

インスタンス変数:初めてサーブレットが呼び出されたとき初期化され、コンテナ起動間ずっと有効な変数
ローカル変数:処理の都度破棄される変数

シングルインスタンス・マルチスレッド

サーブレットの世界では、リソースの節約という観点からいったんインスタンス化したサーブレットクラスをそのままメモリ上に常駐し、同じサーブレットに対するリクエストは同じインスタンスで処理される(ひとつのインスタンスで複数のリクエストを処理する)

サーブレットのライフサイクル

initメソッドとdestroyメソッド

サーブレットの初回起動時、アンロード/更新時にだけ実行される
すべてのリクエストで共通して利用するようなリソースはinitメソッドで初期化しておくことでリソース読み込みのオーバーヘッドを軽減できる
初期化処理を必要になるまで行わないことを 遅延初期化 という

初期化パラメータを取得する

設定ファイルで定義可能な変数で、使用する環境によって変更する可能性の高い情報(パスや文字コードなど)を定義するために使用する

初期化パラメータをアノテーションで設定する
@アノテーション名(
    属性名 = 値,
    属性名 = 値,...
)
WebServletアノテーション(initParams属性)
@WebServlet(
    initParams = {
    @WebInitParam(name = "パラメータ名",value = "値"),
    @WebInitParam(name = "パラメータ名",value = "値"),...
    }
)

サーブレットのより高度な話題

ファイルのアップロード機能実装

・enctypeオプションを指定
・MultipartConfigアノテーションでアップロード設定する
・ファイルをアップロードする

getapartメソッド
Part getPart(String name)
throws OPException, IllegalStateException, ServletException
name:パラメータ名
指定されたパラメータ名に対応するファイルを取得する
Writeメソッド
void write(String fileName) throws IOException
fileName:保存先のパス
現在のファイルを指定されたパスに保存

・Partオブジェクトからファイル情報を取得する
・アップロードファイルの種類をチェック
・URLパターンのワイルドカード指定
すべてのリクエストを1つのサーブレットで受け取るサーブレットのことを フロントコントローラ という
・フロントコントローラを定義する
getPathInfoメソッドで取得できる部分を拡張パス情報とよぶ(クエリ情報に近い)
・コンテナ起動時にサーブレットを初期化する

アプリケーションフレームワーク

フレームワークとはアプリケーションを開発するときのテンプレートのようなもの
開発生産性の向上が見込める

JSP&サーブレットの連携

サーブレットの処理結果をJSPページで表示する
リクエスト属性

ひと連なりのリクエスト処理の中で保持可能な変数

setAttributeメソッド(HttpServletRequestインターフェース)
void setAttribute(String name, Object value)
name:属性名
value:変数
指定された変数をリクエスト属性に登録する
forwardメソッド(RequestDispatcherインターフェース)
void forward(ServletRequest request, HttpServletReaponse response) throws
ServletException, IOException
request:リクエスト情報
response:レスポンス情報
指定されたページにリクエスト処理を転送する
getRequestDispatcherメソッド(ServletContextインターフェース)
RequestDispatcher getRequestDispatcher(String path)
path:アプリケーションルート/で始まるパス
指定されたパスに処理を転送するためのRequestDispatcherオブジェクトを取得する

リダイレクト

いったんレスポンスをクライアントに返したうえで自動的にサーバにリクエストを発生させる仕組み
内部的にはサーバ/クライアント間で通信の行き来が2往復発生していることになる
2回目のリクエストはサーバ側で待ち行列の末尾に配置されるので遅延が発生することもある

フォワード

サーバ内で処理を異なるページ(クラス)に転送する
サーバ/クライアント間では1度しか処理が発生しない

リダイレクトとフォワード

フォワードのほうがリダイレクトより高いパフォーマンスが望める
・リクエスト情報を引き継げるのはフォワードのみ
フォワードを利用できるのはサーバ内部の転送においてのみ(http://~で表さなければならないURLにはリダイレクトを使用する必要がある)

リクエスト情報の参照(JSP)

サーブレットクラスでリクエスト属性が設定できたらJSPページから参照する

変数のスコープ

変数の有効範囲のこと

●JavaBeans

クラスをより汎用的に部品化できるようにちょっとしたルール付けをした結果できたクラスという感じ

JavaBeansが必要な理由

性質の異なるコードを一つにまとめるとコードの再利用を阻害することになる
本来のデータ処理機能とそのほかの入力データの処理、処理結果の引き渡し機能とをさらに分離する必要がある
このような設計のことを MVC(Model-View-Controller)モデル といいJSP&サーブレットアプリケーションを構築する際一般的に採用される
MVCモデルではJavaBeans具体的なビジネスモデル(Model)を記述し、JSPユーザインタフェース(View)を実装し、両者へのデータの引き継ぎ及び割り振りをサーブレットが制御する(Controller)というように役割を明確に分担する

JavaBeansクラスの条件

1.引数のないコンストラクタを持つこと
コンストラクタをはクラスがインスタンス化される際最初に呼び出される特別なメソッドでクラスと等しい名前をもつ
オブジェクトの初期化処理を記述するのが一般的
JavaBeansでは引数をもたせてならない
2.プロパティを参照/設定するためのアクセサメソッドを定義すること
JavaBeansに保持するインスタンス変数は原則的にprivate変数として定義しなければならない(外部クラスからはJB内部のインスタンス変数に直接アクセスできない)
代わりにsetXxxxx/getXxxxxという名前のメソッドを介して行えるようにしておく(アクセサメソッド)
アクセサメソッドによって外部から隠蔽(カプセル化)されたフィールドのことを プロパティ という

アクセサメソッド
public データ型 get<プロパティ名>() {
 return this.プライベート変数名;
}...参照用メソッド

public void set<プロパティ名>(データ型 引数){
 this.プライベート変数名 = 引数;
}...設定用メソッド

読み書きの制御が可能、値の参照/設定時に任意の処理を記述できるなどのメリットがある

3.Serializableインターフェースを実装すること
そのクラスがシリアル化可能であることを表す
シリアル化とは直列化という意味でオブジェクトからバイト列への変換のこと(逆を復元という)
データの共有を目的としたJavaBeansでは汎用的なデータ交換の仕組みを備えている必要がある