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

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

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

擬似設定

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

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 のはめ込み」へ