Home of: [Atelier "FUJIGURUMA"] >> [PageMixer hosted by SourceForge.net]

SEE "For Readers of English Version",
or Japanese version of this page

Determine page information

This section explains how to customize determining page information (resource location, content type, ....) with PageServlet.

Overview

Class diagram

Class diagram in this section is shown below:

Class diagram
Class diagram (click for large figure)

Classes which you must define are colored, and other are already defined.

Class names

In this tutorial, abbreviated class names are used. Complete names are shown below.

Classes of PageMixer framework

NotationFull name
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

Tutorial specific classes

No tutorial specific class is explained in this section.

Purpose of customization

Please see "Render locale sensitively" section for detail about 'page' information management.

Choose PageFactory implementation

PageMixer provides "PageFactory" for customization of determining 'page' information. In addition to it, PageMixer almost provides concrete classes derived from PageFactory, which use one of MonoPage, LocalePage or DefaultPage (also I18NDefaultPage described below, in fact).

You will find classes corresponded to them out easily, because they PageFactory classes contains the name of corresponded Page implementation in their own name.

Please see API document and source code of them about detail to define custom concrete PageFactory, even though you may satisfy your needs by pre-defined classes in almost all cases.

I18NDefaultPage for real locale sensitivity

In fact, I think that I can map DefaultPage for multiple locales by configuration shown below, at first.


  <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>

mapping ignored by Tomcat

In above example, "ja.DefaultPage" is Servlet using DefaultPage which is configured with "text/html; charset=Windows-31J" content type and "Windows-31J" encoding ("en.DefaultPage" is as same).

I expected ja.DefaultPage to be invoked for "*.ja.html" request, and en.DefaultPage to be invoked for "*.en.html" request. But Servlet specification(version 2.3) says that:

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"

So, PageMixer provides "I18NDefaultPage" for multi-locale DefaultPage.

Configuration example is shown below (and this only focuses on mapping between URI suffix and content type).


  <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 configuration

This configuration makes I18NDefaultPage to recognize "*.ja.html" requests as one requiring "text/html; charset=Windows-31J", "*.en.html" and the other as one requiring "text/html; charset=iso-8859-1".

Is this complex, is not it? Yes, I think so too. But I also think that this configuration style balances well between simpleness and customizability.

Configuration

Parameters for base class

PageFactory itself does not require any parameters, but derived classes require/accept some parameters.

for MonoPageFactory

MonoPageFactory accepts(or requires) below parameters, and all of these are used to construct MonoPage.

name description
page.location location of resource.(optional)
page.contentType content type of HTTP response.
page.encoding encoding of resource.(optional)

for LocalePageFactory

LocalePageFactory accepts(or requires) below parameters, and all of these are used to construct LocalePage.

name description
page.location base name of ResourceBundle to read locale sensitive information in.

for DefaultPageFactory

DefaultPageFactory accepts(or requires) below parameters, and all of these are used to construct DefaultPage.

name description
page.contentType content type of HTTP response
page.encoding encoding of resources.(optional)

for I18NDefaultPageFactory

I18NDefaultPageFactory also accepts(or requires) below parameters other than ones for DefaultPageFactory, and all of these are used to construct I18NDefaultPage.

name description
page.suffix.N suffix of this I18N mapping entry. "N" is 0 origin number.
page.contentType.N content type of HTTP response for corresponded suffix.
page.encoding.N encoding of resources for corresponded suffix(optional).

Parameter to use choosen class

You should not (and can not) specify name of concrete PageFactory class which you choose, when you use (1)one of pre-defined classes (MonoPageServlet, LocalePageServlet, DefaultPageServlet or I18NDefaultPageServlet) or classes derived from them, or (2)class which specifies non-null concrete PageFactory object at invocation of base class constuctor.

Otherwise, because PageFactory configuration can not decide "default implementation", you should specify "servlet.pageFactory" Servlet init-param in deployment descriptor as shown below.


<init-param>
  <param-name>
    servlet.pageFactory
  </param-name>
  <param-value>
    jp.ne.dti.lares.foozy.pagemixer.servlet.MonoPageFactory
  </param-value>
</init-param>

Specify PageFactory

To next section "Get 'InputStream'"