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

Token へのデータはめ込み

本節では、 PageMixer における HTML タグ要素に対するデータのはめ込み方に関して説明します。 それを通して、はめ込む "自身のデータ" 入手に関して習得することになります。 説明には、 HTML ページの "input" タグにおける "value" 属性の値としてユーザ名文字列をはめ込むフィルタを用います。


<input name="Auth.UserName" value="">

処理前

<input name="Auth.UserName" value="foozy">

処理後

概要

クラス図

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

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

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

オブジェクト図

本節におけるオブジェクト図を以下に示します。

オブジェクト図
オブジェクト図 (クリックで拡大表示)

シーケンス図

本節におけるシーケンス図を以下に示します。

シーケンス図
シーケンス図 (クリックで拡大表示)

クラス名

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

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

表記完全名
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
HashMapConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.HashMapConsumerContext
HTMLSymbolSet jp.ne.dti.lares.foozy.pagemixer.HTMLSymbolSet
ServletConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ServletConsumerContext
Symbol jp.ne.dti.lares.foozy.pagemixer.Symbol
Token jp.ne.dti.lares.foozy.pagemixer.Token
TokenDataInsetFilter jp.ne.dti.lares.foozy.pagemixer.mixer.TokenDataInsetFilter
TokenWatcher jp.ne.dti.lares.foozy.pagemixer.mixer.TokenWatcher

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

表記完全名
Bootstrap.Default pagemixer.filter.Bootstrap.Default
UsernameAttrInsetFilter pagemixer.filter.UsernameAttrInsetFilter

TokenWatcher の生成

前述のように、 本節では HTML ページの "input" タグにおける "value" 属性の値として、 ユーザ名文字列をはめ込むフィルタを作成します。 しかし、 実際のサービスを想像してみればわかるように、 与えられた HTML ページの全ての "input" タグにはめ込むのは、 得策ではありません。

そこで、対象となる Token に以下の条件を定めます。

このような場合、 TokenWatcher としては "TokenWatcher.NameAttr" が利用されます。 これは "名前と属性とで監視する Token 監視クラス" のことです。


new TokenWatcher.NameAttr(HTMLSymbolSet.SET.INPUT,
                          HTMLSymbolSet.SET.NAME,
                          "Auth.UserName")

"input" に値をはめ込むための TokenWatcher

埋め込み値の識別子の定義

本チュートリアルでは一度、 "Consumer Context" が、 値の設定/設定取り消し/取得の機能を提供することを説明しました。

しかし、これらの機能を利用するためには、 値を識別するための識別子オブジェクトを定義する必要があります。 Token にはめ込むユーザ名文字列の、 設定/取得を行うための識別子オブジェクト(=鍵)は、 例えば以下のように定義されます。


Object key = "Auth.UserName";

ユーザ名文字列識別用の識別子

実際のプロジェクトでは、 フィルタクラス群とデータ提供(ないし設定)クラス群の、 両方から見えるクラス(ないしインタフェース)において、 キー(群)を定義しておくのが便利です。

TokenDataInsetFilter の具象化

PageMixer フレームワークは、 コンストラクタに与えられた TokenWatcher によって認識された Token にデータをはめ込むための、 テンプレートとなるユーティリティクラスとして、 TokenDataInsetFilter およびその派生クラスを提供しています。

本節における状況の場合、 以下の理由から、 "HTML-Safe" な属性値としてデータをはめ込む必要があります。

この場合、 "TokenDataInsetFilter.HTMLSafeAttr" を利用するのが良いでしょう。


public class UsernameAttrInsetFilter
    extends TokenDataInsetFilter.HTMLSafeAttr
{
    final static
    private HTMLSymbolSet SET = HTMLSymbolSet.SET;

    final static
    private String ATTR_VALUE = "Auth.UserName";

    ////////////////////////////////////////

    public UsernameAttrInsetFilter(Object keyUsername){
        super(new TokenWatcher.NameAttr(SET.INPUT, 
                                        SET.NAME,
                                        ATTR_VALUE),
              keyUsername,
              SET.VALUE);
    }

    ////////////////////////////////////////
    // class HTMLSafeAttr の具象化

    protected String getValue(Object data){
        return (null != data ? data.toString() : "");
    }

}

TokenDataInsetFilter.HTMLSafeAttr の具象化

TokenDataInsetFilter.HTMLSafeAttr は、 3つの引数を必要とします。

最初の TokenWatcher 型引数に関しては説明は不要でしょう (または前節を再読ください)。 次の Object 型引数は、 ConsumerContext に格納された値を識別する識別子(鍵)として使用されます。 最後の Symbol 型引数は、 フィルタが値をはめ込む "はめ込み先属性" の名前として使用されます。

備考: Servlet API に依存したクラス群は、 PageMixer 3.0 版から他のクラス群から('servlet' パッケージへ)分離されました。 この分離により、 デモのソースファイル群も、 PageMixer の一般的な概念/原理を説明するものと、 Servlet 環境でのサービス構築方法を説明するものとに分割されました。

この分離によって、 いくつかのクラスが例えばキーの特定といった点で、 効率に定義されていないように見えるでしょう。

繋いで混ぜる

以上で必要なものが全て揃いました。 実行コードは以下のようになります (詳細は UsernameAttrInsetFilter を参照してください)。

try{
    // ユーザ名設定/取得用のキー
    final Object key = "Auth.UserName";
    // ユーザ名
    final String name = "foozy";

    Bootstrap bootstrap =
    new Bootstrap.Default(filename)
    {
        protected void prepare(ConsumerContext context)
        {
            // ユーザ名をコンテキストに設定
            context.setValue(key, name);
        }
    };

    // フィルタの適用
    bootstrap.execute(new UsernameAttrInsetFilter(key));
}
catch(Exception e){
    e.printStackTrace(System.err);
}
繋いで混ぜる

入力用のサンプル HTML ファイルは、 配布物中の "src/demo/servlet/war/WEB-INF/page/demosite" 配下の "auth.ja.html" (あるいは "index.ja.html" でも可) です。

Bootstrap.Default クラスは、 "prepare(ConsumerContext)" メソッドのオーバライドによって、 与えられたフィルタによる混ぜ合わせの前に、 "bootstrap" オブジェクトに上記処理を実行時に起動させることが出来ます。


次節「シーケンスの刈り込み」へ