一番シンプルなValidator

  1. まずは、全ての入力がエラーになる単純なValidatorを作ります
  2. Validatorクラス
     public class ExampleChecks implements Serializable {
     
      public ExampleChecks() {
        super();
      }
     
      public static boolean alwaysBad(
        Object bean,
        ValidatorAction va,
        Field field,
        ActionMessages errors,
        Validator validator,
        HttpServletRequest request) {
     
        errors.add(field.getKey(), 
            Resources.getActionMessage(request, va,  field));
     
        return false;
      }
     }
    
    1. Serializableを実装しているのは、Strutsに標準で付いているValidatorがSerializableを実装しているから。何の意味があるのかは分かりません(^^;
    2. Validatorメソッド定義
      • メソッド名は任意です
      • staticメソッドとして定義し、返値型はbooleanとしてます。
      • メソッド引数は上記のように、Object, ValidatorAction?, Filed, ActionMessage?, Validator, HttpServletRequeset?にします
    3. 検証エラーを起こすには
      • Validatorメソッドの返値として false を返します。
    4. 検証エラーを通知するには
      • 引数のActionMessages?に、add() します
      • ActionMessages?へのメッセージの追加は、上記のようなコードにします
      • どのようなメッセージを出すかは、/WEB-INF/validator-rule.xml で定義します
  3. validator-rules.xml への登録
    <validator name="bad"
      classname="com.snail.ExampleChecks"
      method="alwaysBad"
      methodParams="java.lang.Object,
                    org.apache.commons.validator.ValidatorAction,
                    org.apache.commons.validator.Field,
                    org.apache.struts.action.ActionMessages,
                    org.apache.commons.validator.Validator,
                    javax.servlet.http.HttpServletRequest"
      depends=""
      msg="errors.bad"/>
  4. application.properties への登録
    errors.bad={0} is always bad.
  5. これで bad ルールを標準のValidaortと同じように使えるようになります。
    • /WEB-INF/validation.xml
      <form name="ExampleForm">
        <field
          property="value"
          depends="bad">
          <arg key="label.value"/>
        </field>
      </form>
    • 実行結果
      • どんな場合にも検証エラーになります
        alwaysBad.PNG

Formからの入力を受け取るValidator

  1. Formからの入力を受け取って検証するValidatorを作成します
  2. Validatorクラス
     public class ExampleChecks implements Serializable {
     
      public ExampleChecks() {
        super();
      }
     
      public static boolean alwaysBad(Object bean, ValidatorAction va,
          Field field, ActionMessages errors, Validator validator,
          HttpServletRequest request) {
     
        errors.add(field.getKey(), 
            Resources.getActionMessage(request, va,  field));
     
        return false;
      }
     
      public static boolean onlyOkisOk(Object bean, ValidatorAction va,
          Field field, ActionMessages errors, Validator validator,
          HttpServletRequest request) throw JSPException {
        
        // 検証対象の切り出し
        String str = null;
        if( bean instanceof String ){
          str = (String)bean;
        }else{
          try {
            str = PropertyUtils.getProperty(bean,field.getProperty()).toString();
          } catch (Exception e) {
            throw new JspException(e);
          }
        }
        
        if("Ok".equals(str)){
          return true;
        }else{
          errors.add(field.getKey(), 
              Resources.getActionMessage(request, va,  field));
     
          return false;
        }
      }
     }
    
    1. Validatorメソッド定義
      • 一つのValidatorクラスに複数のValidatorメソッドを定義することが出来ます
    2. 検証結果の切り出しについて
      • 引数のObjectから、サンプルコードのように property を切り出します
      • 切り出せないときには、JSPException を投げます
    3. 値の検証について
      • 検証に合格の場合には true を返します
      • 検証に失敗したときには 引数の ActionMessages? にメッセージを追記し、falseを返します
  3. validator-rules.xml への登録
    <validator name="OkIsOk"
      classname="com.snail.ExampleChecks"
      method="onlyOkisOk"
      methodParams="java.lang.Object,
                    org.apache.commons.validator.ValidatorAction,
                    org.apache.commons.validator.Field,
                    org.apache.struts.action.ActionMessages,
                    org.apache.commons.validator.Validator,
                    javax.servlet.http.HttpServletRequest"
      depends=""
      msg="errors.onlyOkisOk"/>
  4. application.properties への登録
    errors.onlyOkisOk={0} is only Ok is ok.
  5. これで onlyOkIsOk? ルールを標準のValidaortと同じように使えるようになります。
    • /WEB-INF/validation.xml
      <form name="ExampleForm">
        <field
          property="value"
          depends="OkIsOk">
          <arg key="label.value"/>
        </field>
      </form>
    • 実行結果
      • Okと入力すると検証に合格します
        OkIsOk.PNG
      • Goodと入力すると検証には不合格になります
        GoodIsBad.PNG

/WEB-INF/validation.xml でパラメータが設定できるValidator

  1. validation.xmlにパラメータを指定できる本格的なValidatorを作成します。ここでは、カンマ区切りで指定された候補の中に入力された文字列があるかどうかを検証します。
  2. Validatorクラス
     public class ExampleChecks implements Serializable {
     
      public static boolean onlyAnyOneisOk(Object bean, ValidatorAction va,
          Field field, ActionMessages errors, Validator validator,
          HttpServletRequest request) throws JspException {
     
        // 検証対象の切り出し
        String str = null;
        if (bean instanceof String) {
          str = (String) bean;
        } else {
          try {
            str = PropertyUtils.getProperty(bean, field.getProperty())
                .toString();
          } catch (Exception e) {
            throw new JspException(e);
          }
        }
        
        // 検証対象がnullか空文字の場合には、検証成功とする
        if( str == null || "".equals(str.trim())){
          return true;
        }
     
        // 候補の読み込み
        String candidateList = field.getVarValue("Candidate");
        String[] candidates = candidateList.split(",");
     
        for (int cnt = 0; cnt < candidates.length; cnt++) {
          if (candidates[cnt].equals(str)) {
            return true;
          }
        }
        errors.add(field.getKey(), Resources.getActionMessage(request, va,
            field));
     
        return false;
      }
     }
    
    1. 本格的なValidatorでは、検証対象がnullや空文字の場合には検証成功とします。必須項目である事を検証する場合には、validator-rules.xml の depends で、Struts標準のrequiredを指定します。
    2. validation.xml で指定されたパラメータを切り出すには、field.getVarValue?(String) を使います。
    3. Map field.getVars() もありますが、Validatorプログラムは、どんなパラメータが来るのかあらかじめ知っているはずなのであまり使い道はないかも・・・
  3. validator-rules.xml への登録
    <validator name="AnyOneIsOk"
      classname="com.snail.ExampleChecks"
      method="onlyAnyOneisOk"
      methodParams="java.lang.Object,
                    org.apache.commons.validator.ValidatorAction,
                    org.apache.commons.validator.Field,
                    org.apache.struts.action.ActionMessages,
                    org.apache.commons.validator.Validator,
                    javax.servlet.http.HttpServletRequest"
      depends=""
      msg="errors.AnyOneIsOk"/>
  4. application.properties への登録
    errors.AnyOneIsOk={0} must be one of {1}.
  5. これで AnyOneisOk? ルールを標準のValidaortと同じように使えるようになります。
    • /WEB-INF/validation.xml
      <form name="ExampleForm">
        <field
          property="value"
          depends="AnyOneIsOk">
          <arg0 key="label.value"/>
          <arg1 key="${var:Candidate}" resource="false"/>
          <var>
            <var-name>Candidate</var-name>
            <var-value>diamond,perl,ruby,crystal,gold</var-value>
          </var>	
        </field>
      </form>
    • 実行結果
      • 何も入力しないと検証に合格します(もし必須チェックをしたければ、validator-rules.xml の depends に required を加える)
        AnyIsOK1.PNG
      • rubyと入力すると検証に合格します
        AnyIsOK2.PNG
      • silverでは検証に不合格になります
        AnyIsOK3.PNG

/WEB-INF/validator-rules.xml の分割

  1. 自分で作成したValidatorに関する定義を切り出すことが出来ます。
  2. StrutsBlank? などに入っている validator-rules.xml を参考に、 myValidator-rules.xmlを作成する
    <!DOCTYPE form-validation PUBLIC
             "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
             "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
    <form-validation>
      <global>
        <validator name="bad"
          classname="com.snail.ExampleChecks"
          method="alwaysBad"
          methodParams="java.lang.Object,
                        org.apache.commons.validator.ValidatorAction,
                        org.apache.commons.validator.Field,
                        org.apache.struts.action.ActionMessages,
                        org.apache.commons.validator.Validator,
                        javax.servlet.http.HttpServletRequest"
          depends=""
          msg="errors.bad"/>
    
        <validator name="OkIsOk"
          classname="com.snail.ExampleChecks"
          method="onlyOkisOk"
          methodParams="java.lang.Object,
                        org.apache.commons.validator.ValidatorAction,
                        org.apache.commons.validator.Field,
                        org.apache.struts.action.ActionMessages,
                        org.apache.commons.validator.Validator,
                        javax.servlet.http.HttpServletRequest"
          depends=""
          msg="errors.onlyOkisOk"/>
    
        <validator name="AnyOneIsOk"
          classname="com.snail.ExampleChecks"
          method="onlyAnyOneisOk"
          methodParams="java.lang.Object,
                        org.apache.commons.validator.ValidatorAction,
                        org.apache.commons.validator.Field,
                        org.apache.struts.action.ActionMessages,
                        org.apache.commons.validator.Validator,
                        javax.servlet.http.HttpServletRequest"
          depends=""
          msg="errors.AnyOneIsOk"/>
    
      </global>
    </form-validation> 
  3. struts-config.xml の ValidatorPlugin? の設定で、myValidator-rules.xmlを登録する
     <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
       <set-property
           property="pathnames"
           value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml,/WEB-INF/myValidator-rules.xml"/>
     </plug-in>
  4. myValidator-rules.xml を定義するときには、不要なスペースを消す
    • myValidator-rules.xml に、スペースのみの行があることによってValidatorがうまく動かず、一日ムダにした。
    • 下のような感じの定義ファイルをStrutsはうまく処理できないようだ(DOMで管理しているから?)
    • 次のような置換を行えばよい (s/[ \t]+$//g = 行末からSPC/TABのみでできている部分をすべて削除)
      • □□□□□□□□□□javax.servlet.http.HttpServletRequest"←
        □□□depends=""←
        □□□msg="errors.onlyOkisOk"/>←
        ■■←
        □□<validator name="AnyOneIsOk"←
        □□□classname="com.snail.ExampleChecks"←
        □□□method="onlyAnyOneisOk"←
        □□□methodParams="java.lang.Object,←
        □□□□□□□□□□org.apache.commons.validator.ValidatorAction,←
        □□□□□□□□□□org.apache.commons.validator.Field,←
        □□□□□□□□□□org.apache.struts.action.ActionMessages,←
        □□□□□□□□□□org.apache.commons.validator.Validator,←
        □□□□□□□□□□javax.servlet.http.HttpServletRequest"←
        □□□depends=""←
        □□□msg="errors.AnyOneIsOk"/>←
        ■■←
        □</global>←                               (□■:SPC , ←:改行)
      • □□□□□□□□□□javax.servlet.http.HttpServletRequest"←
        □□□depends=""←
        □□□msg="errors.onlyOkisOk"/>←
        ←
        □□<validator name="AnyOneIsOk"←
        □□□classname="com.snail.ExampleChecks"←
        □□□method="onlyAnyOneisOk"←
        □□□methodParams="java.lang.Object,←
        □□□□□□□□□□org.apache.commons.validator.ValidatorAction,←
        □□□□□□□□□□org.apache.commons.validator.Field,←
        □□□□□□□□□□org.apache.struts.action.ActionMessages,←
        □□□□□□□□□□org.apache.commons.validator.Validator,←
        □□□□□□□□□□javax.servlet.http.HttpServletRequest"←
        □□□depends=""←
        □□□msg="errors.AnyOneIsOk"/>←
        ←
        □</global>←                              (□:SPC , ←:改行)

Java#Struts


添付ファイル: fileOkIsOk.PNG 2804件 [詳細] fileGoodIsBad.PNG 2660件 [詳細] fileAnyIsOK3.PNG 2580件 [詳細] fileAnyIsOK2.PNG 2598件 [詳細] fileAnyIsOK1.PNG 2865件 [詳細] filealwaysBad.PNG 2716件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2006-07-31 (月) 01:21:49 (6724d)
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=c8ca3f3a88
ISBN10
ISBN13
9784061426061