| MAP | PageMixer ドキュメント > チュートリアル > Servlet 環境における利用 > 「ConsumerContext」の生成 | << | >> |
本節では、
PageServlet を使用する際の
ConsumerContext 生成のカスタマイズ方法を説明します。
ConsumerContext のカスタマイズに興味が無い場合
(多くの場合はそうです)は、
本節を読み飛ばしても構いません。
本節におけるクラス図を以下に示します。
色づけされているのが本節で定義するクラスで、 それ以外は 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 生成のカスタマイズは、
リクエストごとに以下のことを可能にします。
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;
上記例は、 2つの固有カスタマイズを行っています。
Locale の "DataProvider" の設定:DataProvider を生成し、
"KEY_LOCALE_ENTRY_PROVIDER" をキーにして
context に格納しています。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 の指定| MAP | PageMixer ドキュメント > チュートリアル > Servlet 環境における利用 > 「ConsumerContext」の生成 | << | >> |