5. パラメータ値のチェックとHTMLタグライブラリ
- 5.1. ActionForm Beanのvalidateメソッド
- 5.2. エラーメッセージの表示
- 5.3. HTMLタグライブラリ
- 5.4. formタグ/submitタグ/cancelタグ/resetタグ
5.1. ActionForm Beanのvalidateメソッド
2章で解説したActionForm BeanはHTTPパラメータの値を自動的に取得するものでした。これによりHTMLフォームに入力された値の取り扱いが、非常に楽になります。しかし実際には、HTMLフォームに入力された値をそのまま処理できるとは限りません。ユーザが必須項目の入力を忘れていたり、数字で入力すべきところを漢数字で入力したり、様々な入力ミスが想定されます。ActionForm Beanのvalidateメソッドは、設定されたHTTPパラメータ値がアプリケーションとして正しいかどうか確認するメソッドです。validateメソッドはorg.apache.struts.action.ActionFormで、以下のように定義されています。
ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
ActionServletはHTTPパラメータ値をActionForm Beanに設定した後、上記のvalidateメソッドを呼び出します。ActionErrorsはorg.apache.struts.action.ActionErrorオブジェクトを格納するリストクラスですが、要素数が0(またはnull)の場合は検証に合格した事を意味し、そうでない場合には何らかのエラーがある事を意味します。例として2章のProductFormにvalidateメソッドを追加します。ここではプロパティ「name」および「maker」が空行であるかどうかをチェックします。
package sample;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
public class ProductForm extends ActionForm{
private String name="";
private String maker="";
...
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
ActionErrors errors=new ActionErrors();
if(name.equals("")){
errors.add("name",new ActionError("invalid.name"));
}
if(maker.equals("")){
errors.add("maker",new ActionError("invalid.maker"));
}
return(errors);
}
}
プロパティ値に問題がある場合には、ActionErrorオブジェクトを生成してActionErrorsオブジェクトに追加します。addメソッドの第1引数に指定される値は、エラーメッセージを種類分けするためのキーです。次節で説明するエラーメッセージの表示の際に、使用する事ができます。
addメソッドの第2引数にActionErrorオブジェクトを指定します。ActionErrorのコンストラクタには、エラーメッセージをメッセージリソースから検索するためのキーを指定します。4章2節で説明したBeanタグライブラリのmessageタグが使用するメッセージリソースから、エラーメッセージも検索されます。したがってmessageタグの場合と同じようにメッセージリソースを用意し、かつ設定を行う必要があります。またActionErrorには引数を2〜5個取るコンストラクタもありますが、それはmessageタグのarg0〜arg4と同様で、検索されたメッセージのパラメータを置き換えるためのものです。
実はActionForm Beanにvalidateメソッドを実装しただけでは、不十分です。Struts設定ファイルも書き換える必要があります。ActionForm Beanを使用する<action>要素に、input属性を定義する必要があります。例として2章の設定を書き換えます。
...
<struts-config>
...
<action-mappings>
<action path="/sample/productInput"
type="sample.ProductInputAction"
name="productForm"
scope="request"
input="/sample/productInput.jsp">
<forward name="input" path="/sample/productInput.jsp" />
</action>
</action-mappings>
</struts-config>
input属性はvalidateメソッドでエラーが検知された場合に表示されるJSP(サーブレット)を指定します。これまでの章で説明した処理を1つにまとめると以下のようになります。
- action要素にname属性が指定されている場合には、該当するActionForm Beanが呼ばれてHTTPパラメータがセットされる。
- ActionForm Beanのvalidateメソッドが呼ばれ、セットされた値が検証される。
- 値に問題があった(ActionErrosにActionErrorが格納された)場合には、input属性で指定されたJSP(サーブレット)が表示される。
- 問題が無かった場合には、type属性で指定したActionクラスのexecuteメソッドが実行される。
実は<action>要素には、validate属性というものもあります。この属性は、validateメソッドを呼び出すかどうか定義するものです。デフォルトでこの属性の値は「true」となっているため、validateメソッドは常に呼び出されます。(ActionForm Beanにvalidateメソッドを実装しなかったとしても、org.apache.struts.action.ActionFormで定義されているvalidateメソッドが呼び出されます。ただしこのメソッドは何もしません。)もしActionForm Beanにvalidateメソッドを実装したものの、このメソッドを呼び出したくない場合には、明示的にvalidate属性に「false」を設定します。
<action path="/sample/productInput"
type="sample.ProductInputAction"
name="productForm"
scope="request"
validate="false"
input="/sample/productInput.jsp">
...
</action>
(実習課題1)
2章実習課題4のWebアプリケーションを改良しなさい。
- 名前・社員番号および少なくとも住所1つが入力されなかった場合には、再度入力ページを表示すること。

