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つが入力されなかった場合には、再度入力ページを表示すること。