目次へ

5. パラメータ値のチェックとHTMLタグライブラリ

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つにまとめると以下のようになります。

  1. action要素にname属性が指定されている場合には、該当するActionForm Beanが呼ばれてHTTPパラメータがセットされる。
  2. ActionForm Beanのvalidateメソッドが呼ばれ、セットされた値が検証される。
  3. 値に問題があった(ActionErrosにActionErrorが格納された)場合には、input属性で指定されたJSP(サーブレット)が表示される。
  4. 問題が無かった場合には、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つが入力されなかった場合には、再度入力ページを表示すること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp