Home of: [工房 "藤車"] > [SourceForge.net における PageMixer]

PageServlet 概要

本節では、 PageMixer が提供する PageServlet の概要を説明します。

概要

クラス名

本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。

PageMixer フレームワークのクラス

記述完全名
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
Filter jp.ne.dti.lares.foozy.pagemixer.mixer.Filter
PageEntry jp.ne.dti.lares.foozy.pagemixer.page.PageEntry
PageServlet jp.ne.dti.lares.foozy.pagemixer.servlet.PageServlet
Producer jp.ne.dti.lares.foozy.pagemixer.mixer.Producer
Renderer jp.ne.dti.lares.foozy.pagemixer.mixer.Renderer
Token jp.ne.dti.lares.foozy.pagemixer.Token

チュートリアルの固有クラス

本節での説明では、チュートリアル固有クラスは登場しません。

描画手続き

PageMixer は HttpServlet 派生クラスである "PageServlet" を提供しており、 PageServlet における応答描画手続きは以下のようになっています。 本クラスの利用者は、 アプリケーション固有の実装に注力出来る様になります。

  1. ConsumerContext を生成
  2. HttpServletRequest から Servlet パスを取得
  3. 当該時点の要求における Locale を確定
  4. パスとロケールを元に PageEntry を確定
    1. パスとロケールを元に「ページ」情報を確定
    2. 「リソースロケーション」を使用して InputStream を取得
    3. InputStream から Producer を生成
  5. PageEntry からエンコーディングを取得
  6. 必要であれば他のページへ制御遷移(および処理を終了)
  7. ページの Token 列を処理する Filter を生成
  8. ページの Token 列を生成するために ProducerPageEntry から取得
  9. PageEntry から得たコンテントタイプを当該応答オブジェクトに設定
  10. 当該時点での応答オブジェクトから Writer を取得 (エンコーディングは上記コンテントタイプにより設定)
  11. 上記 Wirter から Renderer を生成
  12. RendererFilter を接続
  13. Producer により Token 列を Filter に提供することで応答を描画

設定

前述のように、 PageServlet はいくつかのカスタマイズポイントを持っていますが、 "テンプレートメソッド" パターンを用いる設計にはなっていません。 個々ののカスタマイズ実装を個別に再利用(ないし組み合わせ)出来るようにし、 それによって PageServlet 派生クラスの数を低減出来るように、 PageServlet は "ストラテジ" パターンにより実装されています。

PageServlet は、 それぞれのカスタマイズポイントにおいてどのクラスを使用するかを、 以下の手順で決定します。

(1) 配備記述子に指定されたクラスを使用:

PageServlet は配備記述子中の Servlet 向け init-param で指定されたクラス(のインスタンス)を使用します。 各カスタマイズポイントの init-param 名は以降の節で説明します。

(2) コンストラクタ引数で指定されたものを使用:

PageServlet は コンストラクタ引数で指定された非 null のオブジェクトを使用します。 言い換えるなら、 PageServlet のコンストラクタは、 全てのカスタマイズポイントに対応する引数を持ちます。

PageServlet 派生クラスを定義し、 基底クラスのコンストラクタにおいて固有ストラテジオブジェクトを用いた super() 起動を行うことで、 この方法によるカスタマイズが可能です。 このカスタマイズ方法は、 ほとんど全てのページが同一の設定を共有する場合に、 配備記述子の記述コストを低減します。

(3) 基底クラスを使用:

配備識別子でも、コンストラクタでも実装クラスの指定が無かった場合、 PageServlet は各カスタマイズポイントにおいて、 基底クラス(= デフォルト実装)を使用します。

但し、デフォルト実装を持たない(= デフォルト実装を決められない) ものもありますので注意してください。

上記の決定手順は各カスタマイズポイントごとに個別に実施されるので、 あるカスタマイズポイントは (1)、別のものは (2)、それ以外は (3) の方法で指定する、といったことも可能です。


次節「'ConsumerContext'の生成」へ