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

「ConsumerContext」の生成

本節では、 PageServlet を使用する際の ConsumerContext 生成のカスタマイズ方法を説明します。

ConsumerContext のカスタマイズに興味が無い場合 (多くの場合はそうです)は、 本節を読み飛ばしても構いません。

概要

クラス図

本節におけるクラス図を以下に示します。

クラス図
クラス図 (クリックで拡大表示)

色づけされているのが本節で定義するクラスで、 それ以外は PageMixer において定義済みです。

クラス名

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

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

記述完全名
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
ContextFactory jp.ne.dti.lares.foozy.pagemixer.servlet.ContextFactory
DataProvider jp.ne.dti.lares.foozy.pagemixer.mixer.DataProvider
Filter jp.ne.dti.lares.foozy.pagemixer.mixer.Filter
ListDataProvider jp.ne.dti.lares.foozy.pagemixer.mixer.ListDataProvider
PageServlet jp.ne.dti.lares.foozy.pagemixer.servlet.PageServlet
RequestKey jp.ne.dti.lares.foozy.pagemixer.servlet.RequestKey
ServletConsumerContext jp.ne.dti.lares.foozy.pagemixer.servlet.ServletConsumerContext
ServletUtil jp.ne.dti.lares.foozy.pagemixer.servlet.ServletUtil
StrutsConsumerContext jp.ne.dti.lares.foozy.pagemixer.struts.StrutsConsumerContext

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

表記完全名
CustomContextFactory pagemixer.servlet.CustomContextFactory

カスタマイズの目的

ConsumerContext 生成のカスタマイズは、 リクエストごとに以下のことを可能にします。

前者の例としては、 PageMixer - Struts 連携があげられます (この連携のデモンストレーションは PageMixer の src/bin 配布版に含まれています)。

Struts 連携のために、 PageMixer は "ServletConsumerContext" 派生クラスである "StrutsConsumerContext" および ConsumerContext 生成のカスタマイズクラスを提供しています。

後者を目的としたカスタマイズは、 事前処理により、 複雑なデータの生成コストを低減できるかもしれません。

例えば、 HTTP 要求ヘッダを元に生成した Locale リストを処理 (する Filter を使用)したいとします。 何回処理が実施されるかは HTML ページのグラフィカルデザインに依存するため、 必要になる度に Locale リストを生成するのは非効率的です。

ほとんど全てのケースが、 後者を目的としたカスタマイズであると思われます。

ContextFactory のオーバライド

PageMixer は ConsumerContext 生成をカスタマイズするための "ContextFactory" クラスを提供しています。

このクラスは、 複雑な用途のために他にもオーバライド可能なメソッドを備えていますが、 ほとんど全てのケースにおいて、 create メソッドをオーバライドすることで要求を満たすことができると思われます。 他のメソッドの詳細は API ドキュメントを参照してください。


public ConsumerContext create(HttpServlet servlet,
                              HttpServletRequest request,
                              HttpServletResponse response)
    throws IOException

create() メソッドのシグネチャ

オーバライド例を以下に示します。


// 基底クラスで生成された context の使用
ConsumerContext context = 
super.create(servlet, request, response);

// ロケールリストの生成
if(null == context.getValue(KEY_LOCALE_ENTRY_PROVIDER)){
    ListDataProvider localeProvider = new ListDataProvider();
    Enumeration locales = request.getLocales();
    while(locales.hasMoreElements()){
        Object locale = locales.nextElement();
        localeProvider.add(locale);
    }
    context.setValue(KEY_LOCALE_ENTRY_PROVIDER,
                     localeProvider);
}

// "base" タグの "href" 属性値の設定
if(null == context.getValue(KEY_BASE_HREF)){
    String baseHref =
    ServletUtil.getBaseHref(context, true, true);
    context.setValue(KEY_BASE_HREF, baseHref);
}

return context;

context 生成のカスタマイズ

上記例は、 2つの固有カスタマイズを行っています。

Locale の "DataProvider" の設定:
サンプルコードは DataProvider を生成し、 "KEY_LOCALE_ENTRY_PROVIDER" をキーにして context に格納しています。
"base" タグの "href" 属性値の設定:
サンプルコードは ServletUtil#getBaseHref() を用いて "href" 属性値を生成し、 "KEY_BASE_HREF" をキーにして context に格納しています。

設定される値の通用範囲が当該 HTTP 要求に限定されるので、 この例では KEY_LOCALE_ENTRY_PROVIDER および KEY_BASE_HREF は共に RequestKey のインスタンスです。

備考: 上記例での ServletUtil#getBaseHref() 呼び出しにおける前者の "true" は、 "可能であれば HTTP HOST ヘッダ値を使用" することを意味します。

後者の "true" は "要求された URI の代わりに Servlet コンテキストパスを使用" することを意味します。 後者の指定は、応答 HTML ページにおいて、 ローカル資源の場所を Servlet コンテキスト相対で 記述可能にします

設定

基底クラスのパラメータ

ContextFactory は特に初期化パラメータを必要としません。

カスタムクラスを使用するためのパラメータ

カスタマイズした ContextFactory クラスを使用する場合、 配備記述子において、 Servlet の init-param として "servlet.contextFactory" を以下のように指定する必要があります。


<init-param>
  <param-name>
    servlet.contextFactory
  </param-name>
  <param-value>
    pagemixer.servlet.CustomContextFactory
  </param-value>
</init-param>

カスタム ContextFactory の指定

次節「'Locale'の確定」へ