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
オーバライド例を以下に示します。
// 基底クラスで生成された 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>
MAP | PageMixer ドキュメント > チュートリアル > Servlet 環境における利用 > 「ConsumerContext」の生成 | << | >> |