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

制御の転送

本節では、 PageServlet を使用する際の制御転送のカスタマイズ方法を説明します。

他のページへの制御転送に興味が無い場合は、 本節を読み飛ばしても構いません。

概要

クラス図

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

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

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

クラス名

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

PageMixer フレームワークのクラス

記述完全名
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
ForwardCondition jp.ne.dti.lares.foozy.pagemixer.servlet.ForwardCondition
ForwardStrategy jp.ne.dti.lares.foozy.pagemixer.servlet.ForwardStrategy
PageServlet jp.ne.dti.lares.foozy.pagemixer.servlet.PageServlet
RequestKey jp.ne.dti.lares.foozy.pagemixer.servlet.RequestKey
SessionKey jp.ne.dti.lares.foozy.pagemixer.servlet.SessionKey

チュートリアルの固有クラス

本節での説明では、チュートリアル固有クラスは登場しません。

カスタマイズの目的

場合によっては、 ある Servlet から他の Servlet に制御を転送したい場合があるかもしれません。 例えば、 会員限定ページからログインページへと制御を転送したい場合もあるでしょう。

HTTP 応答の描画処理と制御転送ロジックを分離することで、 以下のことが可能になります。

ForwardCondition の具象化

制御転送のカスタマイズのために PageMixer は "ForwardStrategy" を提供しています。

しかし実のところ、 ForwardStrategy におけるデフォルト実装は、 他の Servlet へ制御を転送すべきか否かを確定しません。 ForwardStrategy は、 自身に登録された "ForwardCondition" に対して問い合わせを行うのです。

ForwardCondition は、 制御転送を行うか否か、 転送する場合はどこへ転送するかの問い合わせを受け付けるメソッドを持っています。


public String forwards(ConsumerContext context)

forwards() メソッドのシグネチャ

このメソッドは、 制御を転送する場合には非 null 値を転送先として返却し、 それ以外の場合は null を返却します。 実装例を以下に示します。


if(null == context.getValue(KEY_LOGIN)){
    context.setValue(KEY_LOGIN_REQUIRED, KEY_LOGIN_REQUIRED);
    return authPage_;
}

return null;

転送確定の具象化

この例では、 KEY_LOGIN および KEY_LOGIN_REQUIRED はそれぞれ、 ユーザがログインしている場合にセットされる値を識別する SessionKey のインスタンスと、 ユーザが会員限定ページにアクセス使用としているか否かを示す RequestKey のインスタンスです。

コンパイル時ではなく、 設定時に転送先を確定したい場合もあるでしょう。 この例では、転送先は authPage_ に保持されています。

ForwardCondition は、 派生クラスの初期化のために setup メソッドを提供しており、 そのデフォルト実装は「何もしない」実装です。 オーバライド例を以下に示します。


public void setup(HttpServlet servlet)
    throws ServletException //
{
    super.setup(servlet);

    ServletContext context = servlet.getServletContext();
    authPage_ = context.getInitParameter(INIT_PAGE_AUTH);
    if(null == authPage_){
        throw new ServletException(INIT_PAGE_AUTH);
    }
}

setup のオーバライド

INIT_PAGE_AUTH は、 ログイン(=認証) ページのパスを取得するコンテキストパラメータ名を保持しています。 ですので、 カスタマイズした ForwardConditionauthPage_ 値を返却することで、 制御をログインページに遷移させることが出来ます。

ForwardCondition の具象化や、 ForwardStrategy のオーバライドを行うための詳細は、 API ドキュメントを参照してください。

設定

基底クラスのパラメータ

ForwardStrategy は以下に示す Servlet 初期化パラメータを受理可能です。

名前 説明
forward.condition.N ForwardCondition 実装クラスの名前。 "N" は 0 オリジンの数値です。 複数の ForwardCondition を指定可能です。

カスタムクラスを使用するためのパラメータ

カスタマイズした ForwardStrategy クラスを使用する場合、 Servlet の init-param として "servlet.filterFactory" "servlet.forwardStrategy" を以下のように指定する必要があります。


<init-param>
  <param-name>
    servlet.forwardStrategy
  </param-name>
  <param-value>
    name of your custom ForwardStrategy
  </param-value>
</init-param>

カスタム ForwardStrategy の指定

次節「'Filter'の生成」へ