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

ページ情報の確定

本節では、 PageServlet を使用する際の ページ情報(リソースロケーション、コンテントタイプ、 ....) 確定のカスタマイズ方法を説明します。

概要

クラス図

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

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

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

クラス名

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

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 は MonoPageLocalePage ないし 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>

Tomcat によって無視される設定

上記例での "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 の設定

この設定では 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 向け

I18NDefaultPageFactoryDefaultPageFactory の受理可能(ないし必要としている)もの以外に、 以下に示す Servlet 初期化パラメータを受理可能(ないし必要としています)で、 これらは全て I18NDefaultPage の生成に使用されます。

名前 説明
page.suffix.N 当該 I18N マッピング項目の接尾辞。 "N" は 0 オリジンの整数です。
page.contentType.N 対応する接尾辞の場合における HTTP 応答のコンテントタイプ
page.encoding.N 対応する接尾辞の場合におけるリソースのエンコーディング(省略可能)

選択したクラスを使用するためのパラメータ

(1)いずれかの既定義クラス (MonoPageServletLocalePageServletDefaultPageServlet ないし 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>

PageFactory の指定

次節「'InputStream'の取得」へ