2007 年 3 月 22 日 0 時 9 分

Struts による検証の流れ


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


ActionForm の validate メソッドを利用する場合、
これのフォームを使っている <action> の設定を修正し、
必ず input 属性を指定する必要がある。

    <action path="/login" name="loginForm"
            input="/WEB-INF/pages/login.jsp"
            type="jp.loafer.test.actions.LoginAction">

input 属性は、フォームの内容にエラーがあった場合、
その転送先となるパスを指定する。

一般的に、入力エラーがあった場合は、
入力されたフォームをもう一度表示して、
再入力を求めることが多い。
input という名前は、「入力画面」を意味している。

少しややこしくなってきたので、
validate メソッドを使う場合、
Struts でどのような処理の流れになるか整理してみよう。

1. 利用者が、/login.do にデータを送信し、
    それが Struts の ActionServlet に渡される。
2. 設定ファイルより、/login の <action> を検索する。
3. name 属性に従い、フォームのインスタンスを準備する。
    フォームのインスタンスは、フォームの名前である、
    「loginForm」というセッション属性に登録するが、
    もし既存のものがあればそれを再利用し、
    なければ新しい LoginForm インスタンスを作成して、
    「loginForm」セッション属性に登録する。
4. フォームを初期化するため reset メソッドを呼び出す。
5. リクエストパラメータとフォームの型に従い、
    各パラメータに対してデータ型変換を行った後、
    対応するフォームの setter を呼び出して値を設定する。
6. フォームを検証するため validate メソッドを呼び出す。
7-a. 中身のある ActionErrors が返ってきた場合、
    ActionErrors を特別なリクエスト属性に登録した上で、
    <action> の input 属性のパスに転送する。
7-b. null か空の ActionErrors が返ってきた場合、
    アクションの execute メソッドを呼び出す。
8. execute の戻り値が null 以外ならそこに転送する。

これを見れば、input 属性が必要な理由が分かると思う。
検証に失敗するとアクション自体が実行されず、
input で指定したパスに転送されるのである。

今までは検証作業をアクションでやっており、
失敗した場合は定義済みの failure 転送先に飛ばしたが、
フォームの専用メソッドに任せた場合は、
input で指定した転送先を使うことになる。

まあ、ここまでは大丈夫だ。
問題は次のステップである。

検証結果が格納された ActionErrors は、
特別な名前のリクエスト属性に設定されるので、
転送先の JSP ではこれを参照することができる。

ActionErrors は Struts 独自のものなので、
そのメッセージを画面に出力するためには、
JSP の助けはもちろんだが、
Struts の持つ JSP 拡張機能も併用することになる。



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