2007 年 3 月 27 日 18 時 45 分

エラー表示と ActionForm の関係


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


エラーメッセージや、フィールドハイライトは
どのようにして行われているのだろうか。
今日はその仕組みを追いかけてみよう。

まず、エラーメッセージが最初に生成されるのは、
validate メソッドを実装した ActionForm である。

ActionForm で発生した検証エラーは、
ActionErrors インスタンスにカプセル化され、
validate メソッドの戻り値として Struts に渡される。

Struts は、この ActionErrors インスタンスを、
「org.apache.struts.action.ERROR」という名前の
リクエスト属性に格納することで、
後続の Servlet から読み出せるようにしているのだ。

検証エラーが発生した後に転送される JSP では、
Struts の HTML タグライブラリをを利用しているが、
<html:messages> や <html:text> をはじめとして、
フォーム系のタグは、上記 ActionErrors を参照している。

さて、ActionErrors の構造について再掲しておこう。

ActionErrors には、エラーメッセージである、
ActionMessage のインスタンスを複数格納している。

これら ActionMessage インスタンスは、
ActionErrors の内部において、
幾つかのグループに分けて管理されている。

例えば、ユーザ名とパスワードを空にして送信した場合、
LoginForm#validate で以下のエラーが生成される。

ActionErrors インスタンス
    + グループ: user
        + ActionMessage: ユーザ名を入力してください。
    + グループ: password
        + ActionMessage: パスワードを入力してください。

この場合、ActionErrors には 2 つのグループがあり、
それぞれに ActionMessage が 1 つ登録されている。

さて、このグループ名は自由に指定ができるのだが、
LoginForm の検証では、エラーが発生した原因である
プロパティ名をグループ名として利用していたはずだ。

実は、これがハイライト機能に利用されている。

html:text や html:password 等の入力系タグは、
property 属性を持っているのだが、
この属性の値は、現在のフォームから
プロパティの現在値を取り出すためだけでなく、
エラーが発生したかどうかを調べるためにも使われている。

ActionErrors 内に、property 属性で指定した名前の
グループが存在した場合、エラーが発生しているとみなし、
自動的に errorStyle 属性が有効になるのである。

つまり、上記の場合、property 属性が、
user と password の入力項目があれば、
それら項目がハイライトされるというわけである。

そして <html:messages> タグだが、
このタグは、ActionErrors の中身を列挙する機能を持つ。

既定では全てのグループを順番に調べ、
全ての ActionMessage が列挙されるようになっているが、
property 属性にグループ名を指定してやると、
特定のグループのみの列挙が可能となる。

これを利用すると、エラーメッセージを、
入力項目のすぐ横に表示するような画面を作ることもできる。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.