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

エラー情報の取り扱い

本節では、 表題に "エラー" という言い回しを含んではいますが、 "ActionMessages" により保持される Struts のメッセージ情報の取り扱い方法を説明します。

概要

クラス名

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

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

NotationFull name
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
Filter jp.ne.dti.lares.foozy.pagemixer.mixer.Filter
HTMLSymbolSet jp.ne.dti.lares.foozy.pagemixer.HTMLSymbolSet
HashMapConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.HashMapConsumerContext
MessagesInsetFilter jp.ne.dti.lares.foozy.pagemixer.struts.MessagesInsetFilter
SequenceWatcher jp.ne.dti.lares.foozy.pagemixer.mixer.SequenceWatcher
StrutsConsumerContext jp.ne.dti.lares.foozy.pagemixer.struts.StrutsConsumerContext

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

NotationFull name
Bootstrap pagemixer.filter.Bootstrap
DummySetup pagemixer.filter.DummySetup

JSP を元にした HTML ページの生成

本節では、 HTML ソース例が PageMixer/Struts 連携におけるメッセージ取り扱いフィルタクラスの習得を助けると思われますので、 フィルタクラスに関する生成の説明の前に、 HTML ページ生成に関して説明します。

Struts 用 JSP におけるエラー埋め込みタグの例を以下に示します。


<html:errors/>

Struts の struts-mailreader における logon.jsp(部分)

PageMixer フレームワークを利用する場合、 以下に示すような HTML ページを生成する必要があります。


<!-- 「messages」ブロックの開始 -->
<span class="Struts-errors">

  <!-- 「header」ブロックの開始 -->
  <h3><font color="red">Validation Error</font></h3>
  <p>以下のエラーを解消してください:</p>
  <ul>
  <!-- 「header」ブロックの終了 -->

  <!-- 「iteration」ブロックの開始 -->
  <li class="Struts-error-iterate">

    <!-- 「message」ブロックの開始 -->
    <span class="Struts-error">
    リソースバンドルから得たエラーメッセージが此処に配置されます
    </span>
    <!-- 「message」ブロックの終了 -->

  </li>
  <!-- 「iteration」ブロックの終了 -->

  <!-- 「footer」ブロックの開始 -->
  </ul>
  <hr>
  <!-- 「footer」ブロックの終了 -->

</span>
<!-- 「messages」ブロックの終了 -->

logon.jsp に対応する "logon.en.html"(部分)

上記 HTML 例における"ブロック"群に関する説明は以下の通りです。

messages ブロック:

このブロックは、 メッセージ埋め込みの対象となる部分シーケンスです。 (この例ではエラーのための)ActionMessages が見つからないか、あるいは空だった場合、 このブロック全体が刈り込まれます。

このブロックは、上記例のように、 "「iteration」ブロック" および "「message」ブロック" を含んでいる必要があります。

「header」ブロック:

"「messages」ブロック" の開始と "「iteration」ブロック" の開始の間を、 このブロックとみなすことが出来ます。

このブロックは、 "html:messages"(あるいは "html:errors")TagLib において、 "header" 属性値 (あるいは "errors.header" )をキーとして ResourceBundle から取得された値に相当しますので、 空でも構いません。

「iteration」ブロック:

このブロックは、 対象となる "ActionMessages" により格納されている "ActionMessage" ごとに繰り返されます。

このブロックは、 "「message」ブロック" を含んでいる (あるいは、それと一致している)必要があります。

「message」ブロック:

このブロック全体が "「iteration」ブロック" 反復ごとの "MessageResources" から得られたメッセージ文により置き換えられます。

"「iteration」ブロック" と本ブロックの違いは、 "html:errors" TagLib において "errors.prefix"/"errors.suffix" をキーとして ResourceBundle から得られる値に相当します。

「footer」ブロック:

"「iteration」ブロック" の終了と "「messages」ブロック" の終了の間を、 このブロックとみなすことが出来ます。

このブロックは、 "html:messages"(あるいは "html:errors")TagLib において、 "footer" 属性値 (あるいは "errors.footer" )をキーとして ResourceBundle から取得された値に相当しますので、 空でも構いません。

一見すると、 必要とする HTML ソースが Struts TagLib と比較して複雑に思えるかもしれません。 しかし、この HTML ソースが、 Web アプリケーションを Servlet コンテナで実行することなく、 HTML ソースの描画結果を検証することを可能にします。

メッセージの埋め込み

PageMixer は HTML ページにメッセージを埋め込むために、 "MessagesInsetFilter" を提供しています。

Servlet 要求の Global.ERROR_KEY 属性として格納されている Struts のエラー情報のための MessagesInsetFilter 生成例を以下に示します。


// "「messages」ブロック" 検知用
SequenceWatcher messagesWatcher =
new SequenceWatcher.Attr(SET.CLASS,
                         "Struts-errors");
// "「iteration」ブロック" 検知用
SequenceWatcher iterationWatcher =
new SequenceWatcher.Attr(SET.CLASS,
                         "Struts-error-iterate");
// "「message」ブロック" 検知用
SequenceWatcher messageWatcher =
new SequenceWatcher.Attr(SET.CLASS,
                         "Struts-error");

MessagesInsetFilter filter =
MessagesInsetFilter.forError(messagesWatcher,
                             iterationWatcher,
                             messageWatcher);

エラー情報埋め込み用 Filter

MessagesInsetFilter の forMessage() メソッドにより、 Servlet 要求の Global.MESSAGE_KEY 属性として格納されている Struts のメッセージ情報のための MessagesInsetFilter も生成することが出来ます。

これ以外の メッセージ情報埋め込みに関する MessagesInsetFilter の特徴 (例: ActionMessages の "property" の指定)は、 API ドキュメントを参照してください。

擬似設定

前述のように、 セーブされた ActionErrors に格納される ActionError は ErrorKey で識別されます。

StrutsConsumerContext を用いる場合、 特に明示的な準備をせずとも ErrorKey は正しく機能します。 しかし、 "HashMapConsumerContext" や他の ConsumerContext 実装を用いる場合、 対応する ActionError を明示的に格納する必要があります。

"DummySetup" クラスは、 指定された ConsumerContext への ActionError の格納を助けます。

DummySetup クラスの "setup(ConsumerContext context, String[] args, int offset)" メソッドは、 (1)"args.length <= offset" あるいは (2)"args[offset]" が "-" で「ない」場合、 ActionError の格納を行いません。 他の場合、 "offset"(それ自体は含まず)から "args.length" あるいは 配列要素が "-" 文字列を持つ添え字(それ自体は含まず)まで、 "args" の要素値をエラーキーとして作成した ActionError を格納します。

繋いで混ぜる

以上で必要なものが全て揃いました。 実行コードは以下のようになります。


Bootstrap bootstrap =
new Bootstrap.Default(args[0]){
    protected void prepare(ConsumerContext context)
    {
        DummySetup.setup(context, args, 1);
    }
};

MessagesInsetFilter filter =
MessagesInsetFilter.forError(messagesWatcher,
                             iterateWatcher,
                             messageWatcher);
bootstrap.execute(filter);

繋いで混ぜる

コマンドラインは以下のようになります。


% java ClassName InputFile \
    - error.fromAddress.format - OtherParameter ...

コマンドライン例

上記のコマンドラインは、 HTML ページにおけるエラー情報部位において、 "error.fromAddress.format" に関するエラーメッセージのみを表示します。

"-" で挟まれた引数を省略することで、 個別のエラーメッセージだけでなく、 HTML ページにおけるエラー情報部位全体を刈り込むことも出来ます。


次節「Bean のはめ込み」へ