| MAP | PageMixer ドキュメント > チュートリアル > Struts 環境における利用 > エラー情報の取り扱い | << | >> |
本節では、
表題に "エラー" という言い回しを含んではいますが、
"ActionMessages" により保持される
Struts のメッセージ情報の取り扱い方法を説明します。
本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。
| Notation | Full 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 |
| Notation | Full name |
|---|---|
| Bootstrap | pagemixer.filter.Bootstrap |
| DummySetup | pagemixer.filter.DummySetup |
本節では、 HTML ソース例が PageMixer/Struts 連携におけるメッセージ取り扱いフィルタクラスの習得を助けると思われますので、 フィルタクラスに関する生成の説明の前に、 HTML ページ生成に関して説明します。
Struts 用 JSP におけるエラー埋め込みタグの例を以下に示します。
<html:errors/>
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 例における"ブロック"群に関する説明は以下の通りです。
このブロックは、
メッセージ埋め込みの対象となる部分シーケンスです。
(この例ではエラーのための)ActionMessages
が見つからないか、あるいは空だった場合、
このブロック全体が刈り込まれます。
このブロックは、上記例のように、 "「iteration」ブロック" および "「message」ブロック" を含んでいる必要があります。
"「messages」ブロック" の開始と "「iteration」ブロック" の開始の間を、 このブロックとみなすことが出来ます。
このブロックは、
"html:messages"(あるいは "html:errors")TagLib において、
"header" 属性値
(あるいは "errors.header" )をキーとして
ResourceBundle から取得された値に相当しますので、
空でも構いません。
このブロックは、
対象となる "ActionMessages" により格納されている
"ActionMessage" ごとに繰り返されます。
このブロックは、 "「message」ブロック" を含んでいる (あるいは、それと一致している)必要があります。
このブロック全体が
"「iteration」ブロック" 反復ごとの
"MessageResources"
から得られたメッセージ文により置き換えられます。
"「iteration」ブロック" と本ブロックの違いは、
"html:errors" TagLib において
"errors.prefix"/"errors.suffix"
をキーとして ResourceBundle から得られる値に相当します。
"「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);
FilterMessagesInsetFilter の
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 ページにおけるエラー情報部位全体を刈り込むことも出来ます。
| MAP | PageMixer ドキュメント > チュートリアル > Struts 環境における利用 > エラー情報の刈り込み | << | >> |