MAP | PageMixer ドキュメント > チュートリアル > Servlet 環境における利用 > ページ情報の確定 | << | >> |
本節では、
PageServlet
を使用する際の
ページ情報(リソースロケーション、コンテントタイプ、 ....)
確定のカスタマイズ方法を説明します。
本節におけるクラス図を以下に示します。
色づけされているのが本節で定義するクラスで、 それ以外は PageMixer において定義済みです。
本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。
記述 | 完全名 |
---|---|
DefaultPage | jp.ne.dti.lares.foozy.pagemixer.page.DefaultPage |
DefaultPageFactory | jp.ne.dti.lares.foozy.pagemixer.servlet.DefaultPageFactory |
I18NDefaultPage | jp.ne.dti.lares.foozy.pagemixer.page.I18NDefaultPage |
I18NDefaultPageFactory | jp.ne.dti.lares.foozy.pagemixer.servlet.I18NDefaultPageFactory |
LocalePage | jp.ne.dti.lares.foozy.pagemixer.page.LocalePage |
LocalePageFactory | jp.ne.dti.lares.foozy.pagemixer.servlet.LocalePageFactory |
MonoPage | jp.ne.dti.lares.foozy.pagemixer.page.MonoPage |
MonoPageFactory | jp.ne.dti.lares.foozy.pagemixer.servlet.MonoPageFactory |
Page | jp.ne.dti.lares.foozy.pagemixer.page.Page |
PageFactory | jp.ne.dti.lares.foozy.pagemixer.servlet.PageFactory |
PageServlet | jp.ne.dti.lares.foozy.pagemixer.servlet.PageServlet |
本節での説明では、チュートリアル固有クラスは登場しません。
「ページ」情報管理に関する詳細は、 "ロケールに応じた描画" 節を参照してください。
PageFactory
実装の選択「ページ」情報確定のカスタマイズのために、
PageMixer は
"PageFactory
" を提供しています。
これに加えて、
PageMixer は
MonoPage
、
LocalePage
ないし DefaultPage
(実のところ、以下で述べる I18NDefaultPage
も)
を用いて具象化した
PageFactory
派生クラスを提供しています。
それらの PageFactory
具象化クラスのクラス名は、
対応する Page
実装クラスの名前を含んでいるため、
容易に見つけ出すことが出来るでしょう。
ほとんど全てのケースにおいて、
既定義済みのクラスで十分だと思われますが、
PageFactory
のカスタマイズを行う際の詳細は、
API ドキュメントおよびこれらのソースファイルを参照してください。
I18NDefaultPage
実のところ、
最初は以下のような設定によって、
複数のロケールに対する DefaultPage
マッピングが出来るものと思っていました。
<servlet-mapping> <servlet-name>en.DefaultPage</servlet-name> <url-pattern>*.en.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ja.DefaultPage</servlet-name> <url-pattern>*.ja.html</url-pattern> </servlet-mapping>
上記例での "ja.DefaultPage
" は、
"text/html; charset=Windows-31J" コンテントタイプと
"Windows-31J" エンコーディングによって設定された
DefaultPage
を使用する
Servlet です("en.DefaultPage" も同様です)。
ja.DefaultPage
が
"*.ja.html" にマッチする要求に対して、
en.DefaultPage
が
"*.en.html" にマッチする要求に対して起動されることを期待していました。
しかし、Servlet 仕様書(2.3 版)では以下のように記述されています。
the servlet container will try to match a servlet that handles requests for the extension. An extension is defined as the part of the last segment after the last "." character.chapter SRV 11.1 "Mapping Requests to Servlets"
そこで、
多ロケール DefaultPage
実現のために、
PageMixer は
"I18NDefaultPage
" を提供しています。
設定例を以下に示します (また、ここでは URI 接尾辞とコンテントタイプのマッピングに関して着目します)。
<servlet> <servlet-name>DefaultPage</servlet-name> <servlet-class> jp.ne.dti.lares.foozy.pagemixer.servlet.I18NDefaultPageServlet </servlet-class> <!-- default configuration --> <init-param> <param-name>page.contentType</param-name> <param-value>text/html; charset=iso-8859-1</param-value> </init-param> <!-- configuration for "*.ja.html" suffix --> <init-param> <param-name>page.suffix.0</param-name> <param-value>.ja.html</param-value> </init-param> <init-param> <param-name>page.contentType.0</param-name> <param-value>text/html; charset=Windows-31J</param-value> </init-param> <!-- configuration for "*.en.html" suffix --> <init-param> <param-name>page.suffix.1</param-name> <param-value>.en.html</param-value> </init-param> <init-param> <param-name>page.contentType.1</param-name> <param-value>text/html; charset=iso-8859-1</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DefaultPage</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping>
この設定では
I18NDefaultPage
に
"*.ja.html" 要求を
"text/html; charset=Windows-31J" な要求、
"*.en.html" およびそれ以外の要求を
"text/html; charset=iso-8859-1" な要求と認識させています。
複雑ですよね?私もそう思います。 しかし同時に、 この設定方式は、 単純さとカスタマイズ性の間でバランスが取れているとも思います。
PageFactory
自身はパラメータを必要としませんが、
派生クラスは幾つかのパラメータが必要/受理可能です。
MonoPageFactory
向けMonoPageFactory
は以下に示す
Servlet 初期化パラメータを受理可能(ないし必要としています)で、
これら全ては MonoPage
の生成に使用されます。
名前 | 説明 |
---|---|
page.location |
リソースロケーション(省略可能) |
page.contentType |
HTTP 応答のコンテントタイプ |
page.encoding |
リソースのエンコーディング(省略可能) |
LocalePageFactory
向けLocalePageFactory
は以下に示す
Servlet 初期化パラメータを受理可能(ないし必要としています)で、
これら全ては LocalePage
の生成に使用されます。
名前 | 説明 |
---|---|
page.location |
ロケールに応じて情報を読み込むための
ResourceBundle のベース名 |
DefaultPageFactory
向けDefaultPageFactory
は以下に示す
Servlet 初期化パラメータを受理可能(ないし必要としています)で、
これら全ては DefaultPage
の生成に使用されます。
名前 | 説明 |
---|---|
page.contentType |
HTTP 応答のコンテントタイプ |
page.encoding |
リソースのエンコーディング(省略可能) |
I18NDefaultPageFactory
向けI18NDefaultPageFactory
は
DefaultPageFactory
の受理可能(ないし必要としている)もの以外に、
以下に示す
Servlet 初期化パラメータを受理可能(ないし必要としています)で、
これらは全て I18NDefaultPage
の生成に使用されます。
名前 | 説明 |
---|---|
page.suffix. N |
当該 I18N マッピング項目の接尾辞。 "N" は 0 オリジンの整数です。 |
page.contentType. N |
対応する接尾辞の場合における HTTP 応答のコンテントタイプ |
page.encoding. N |
対応する接尾辞の場合におけるリソースのエンコーディング(省略可能) |
(1)いずれかの既定義クラス
(MonoPageServlet
、
LocalePageServlet
、
DefaultPageServlet
ないし
I18NDefaultPageServlet
)か、その派生クラスを使用する場合や、
(2) 基底クラスのコンストラクタ起動時に非 null の
PageFactory
オブジェクトを指定するクラスを使用する場合は、
PageFactory
具象クラス名を指定する必要はありません。
それ以外の場合は、
PageFactory
設定が「デフォルト実装」を決定できないので、
配備記述子において、
Servlet の init-param として
"servlet.pageFactory
"
を以下のように指定しなければなりません。
<init-param> <param-name> servlet.pageFactory </param-name> <param-value> jp.ne.dti.lares.foozy.pagemixer.servlet.MonoPageFactory </param-value> </init-param>
MAP | PageMixer ドキュメント > チュートリアル > Servlet 環境における利用 > ページ情報の確定 | << | >> |