• 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>
  • 相关阅读:
    python增量爬虫pyspider
    python进程池:multiprocessing.pool
    1. 装饰器入门
    python绘图:matplotlib和pandas的应用
    高效使用 Python 可视化工具 Matplotlib
    python制作爬虫爬取京东商品评论教程
    python 爬取天猫美的评论数据
    mysql view
    mysql alter使用
    export和export default
  • 原文地址:https://www.cnblogs.com/xingdongpai/p/5064674.html
Copyright © 2020-2023  润新知