11.2. DynaActionFormの継承
DynaActionFormをそのまま使用するだけでは、パラメータのチェック機能を利用する事ができません。パラメータのチェック機能を利用するためには、DynaActionFormを継承したクラスを作成する必要があります。以下にDynaActionFormを継承したクラスの例を示します。
package sample; import javax.servlet.http.*; import org.apache.struts.action.*; public class ProductForm extends DynaActionForm{ // プロパティの初期化 public void initialize(ActionMapping mapping){ super.initialize(mapping); set("shops", 0, "Tokyo"); set("shops", 1, "Osaka"); } public void reset(ActionMapping mapping, HttpServletRequest request){ // プロパティ値を初期状態に戻す initialize(mapping); } // パラメータのチェック public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){ ActionErrors errors=new ActionErrors(); if("".equals(get("name")) ){ errors.add("", new ActionError("name.invalidate")); } ... return(errors); } }
プロパティの初期化はコンストラクタではなく、「initialize」メソッドで行われています。もし初期化をクラス内で行いたい場合には、initializeメソッドをオーバーライドするようにして下さい。例では始めに上位クラスのinitializeメソッドを呼び出しています。APIドキュメントによると、DynaActionFormのinitializeメソッドでStruts設定ファイルに記された初期値を設定しているとあります。しかし実際はこのメソッド以外の箇所でも初期値の設定を行っているので、特に上位クラスのinitializeメソッドを呼び出さなければならない理由はありません。
続いて「set」メソッドで、プロパティ値の設定を行っています。setメソッドは以下の3種類あり、プロパティが配列またはListの場合は2つ目を、Mapの場合は3つ目を、それ以外の場合は1つ目を使用します。いずれも最後の引数で、設定する値を指定します。
void set(String name, Object value) void set(String name, int index, Object value) void set(String name, String key, Object value)
「reset」メソッド、「validate」メソッドの役割は、ActionFormと同じです。それぞれプロパティ値を初期状態に戻すとき、パラメータのチェックをするときに使用してください。もしresetメソッド内で、Struts設定ファイルに記された初期値に戻したい場合には、上位クラスのinitializeメソッドを呼び出すと良いでしょう。
(実習課題2)
実習課題1のWebアプリケーションを改良しなさい。
- パラメータのチェック機能を復活させること。