Struts2【表单数据验证篇】3

                服务端验证 

 (一)   编程式验证

     编程式验证分为对所有方法验证对单个方法验证,下面我们来一一叙述。

  (1.1)  对所有方法进行验证

     

    (1) 创建一个类继承ActionSupport

  原因: 因为ActionSupport类实现了Validateable接口

      

              

   (2) 在创建的Action中覆写valudate()方法

public class RegisterAction extends ActionSupport implements ModelDriven<User>{
    private User user=new User();

    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }
    @Override
    public void validate(){
        //验证不成功的情况,向一个Map中存放信息,如果Map为空,说明验证通过,否则就是验证失败
        if("".equals(user.getUsername().trim())){
            //说明没有输入用户,调用该方法往Map里增加信息
            addFieldError("user.username", "用户名不能为空");
        }
    }
        .....
}  

    在这里,addFieldError方法就是往Map里放值,那么关键点就在于这个key是什么?

      我们分为两种情况

        情况一:动作类就是模型类

          此时key为"模型类的属性",如"username"

        情况二:动作类,模型类分开 

          此时key为"模型类.模型类的属性",如”user.username“

    (3) 在strus.xml配置验证失败后,跳转到的结果集      

    Struts在进行数据效验失败以后,会返回"Action.INPUT"字符串

    建议使用struts2标签,如果没有显示,使用<s:fielderror></s:fielderror>.

  (1.2)  对指定方法进行验证

 

    方式一:使用@SkipValition注解

      也就是说在Action中,我们在不需要验证的操作方法上使用该注解

public class LoginAction extends ActionSupport implements ModelDriven<User>{
    private User user;
    
    public void validate(){
        System.out.println("执行了验证操作");
    }
    @SkipValidation
    public String login(){
        System.out.println("执行了登录操作<*>");
        return SUCCESS;
    }
    public String add(){
        System.out.println("执行了添加操作<*>");
        return SUCCESS;
    }

      结果:在依次调用了动作以后,发现在执行login方法以前,不会在执行validate方法。

    方式二:在validate方法+需要验证的方法

public class LoginAction extends ActionSupport implements ModelDriven<User>{
    private User user;
    
    public void validateAdd(){
        System.out.println("执行了验证操作");
    }
    public String login(){
        System.out.println("执行了登录操作<*>");
        return SUCCESS;
    }
    public String add(){
        System.out.println("执行了添加操作<*>");
        return SUCCESS;
    }

   结果:这样子,就只会在调用add动作的时候,执行验证方法

  【总结】

    缺点:验证规则写到了代码中,硬编码

    优点:可以控制的更加精细。(实际开发中用得比较少)

  声明验证恰恰于其相反,缺点是没有编程式验证精细,优点就是避免了硬编码

    


 

(二)  声明式验证

   (2.1)对所有方法进行验证

    在Action包中,创建一个名称为:Action类名-validation.xml的文件  

    (1)创建配置文件

       规则:

        a.配置文件位置:和需要拦截的Action在一个包中

        b.配置文件名字:Action-validation.xml(Action的类名)

        c.配置文件中field标签的name与表单中的name对应,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC 
          "-//Apache Struts//XWork Validator 1.0.2//EN"
          "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>
    <!-- 指定要验证的字段 -->
    <field name="username">
        <!-- 指定验证规则 -->
        <field-validator type="required"><!-- required:验证字段是不是null -->
            <message>必须要输入用户名</message>
        </field-validator>
    </field>
</validators>

  ( 2 ) 配置结果集

    在struts.xml中配置一个result结果集,name为input的结果集,就是当验证器验证失败以后转向的页面

  

  以上就配置完成了,每当你访问Action的时候,不论调用Action中的什么方法,都会进入验证器验证,验证成功后才会执行Action方法,否则返回一个"input",并转发到相应的页面

  

   (2.2)对指定方法进行验证

   炒鸡简单,只需要改变配置文件名字,内容不变。改为:

    Action名字+Action动作名+"-validation".xml  如:LoginAction-login-validation.xml

  【题外话-拦截器】

    验证功能是由Struts2的validation拦截器处理的

    回显错误信息是由workflow拦截器处理的

 

   (2.3)声明式验证使用的验证器

    (1) 寻找 Struts2 配置这些拦截器的配置文件

     jar包:xwork-core-2.3.24.1.jar

       包:com.opensymphony.xwork2.validator.validators

     找到了default.xml配置文件,

     

    (2) 查看配置文件的书写规则

    jar包:xwork-core-2.3.24.1.jar

    找到 xwork-validator-1.0.3.dtd 配置文件

    

   ( 3 ) 写配置文件

  在配置文件中使用验证器有两种方式,

  方式一:

<validators>
    <field name="username"> //要验证的字段
        <field-valitor type="regex">
            <param>
               <![CDATA[[a-zA-Z]{6,8}]]>
            </param>
            <message>
                 字符串由6-8字符串组成
            </message>
        </field-valitor>
    </field>
</validators>                                

  方式二:

<validators>
    <validator type="regex"> //要使用的验证器
        <param name="filedName">username</param>
        <param>
             <![CDATA[[a-zA-z]{6,8}]]>
        </param>
        <message>
             字符串由6-8位字符串组成
         <message>
    </validator>
</validators>     

(三)  自定义验证

   (1)查看下Strust2定义的拦截器,通过struts-default.xml查找随便一个拦截器的源码

    

    validate()    //进行的验证方法。

      object  //就是我们调用的Action

      fieldName  //配置文件中,配置的要监听的属性

      getFieldValue(fieldName,object)  //从Action中寻找监听的属性

    要想阅读这类源码,我们需要从上往下看,因为一个类可能有多个子类,但最后的最后,父类(父接口)只有一个

    

    fieldName:  //配置文件要监听的属性

    type:  //监听的类型

    

    

    

      由名字可知,Validate接口就是我们要找到的最终的接口,ValidatorSupport就是对接口的实现,FieldValidatorSupprort是其的子类,Struts2提供的一些验证器就是该类的子类,所以我们可以继承该类来实现我们自己的验证器

    (二)创建验证类,实现FieldValidatorSupport

    

public class StrongPasswordValidator extends FieldValidatorSupport {
    private boolean trim = true;

    @Override
    public void validate(Object obj) throws ValidationException {
        // obj当前执行的动作类
        String fieldName = getFieldName(); // 配置文件中,写的要验证的字段名
        Object value = this.getFieldValue(fieldName, obj); // 从当前动作类找到你要验证字段名的值
        if (!(value instanceof String)) {
            addFieldError(fieldName, obj);
        } else {
            String s = (String) value;
            if (trim) {
                s = s.trim();
            }
            if (!isPasswordStrong(s)) {
                addFieldError(fieldName, obj);
            }
        }
.....
}

    (三)  创建配置文件

      规则:在根目录下创建XML配置文件,命名必须为"validators.xml"。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<validators>
     <validator name="strongpassword" class="StrongPasswordValidator"/>
</validators>

   (四)  在Action包中的配置文件中使用 我们创建的验证器

<validators>
       <field name="username">
        <field-validator type="strongpassword">
            <message>强度太弱了</message>
        </field-validator>
    </field>
</validators>
原文地址:https://www.cnblogs.com/xingdongpai/p/5064674.html