码迷,mamicode.com
首页 > 其他好文 > 详细

Struts2表单数据验证

时间:2015-12-23 02:03:36      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:

 

 (一)  编程式验证

 

  •   对所有方法进行验证

 

    (1) 创建一个类继承ActionSupport

  

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

      技术分享

  查看validateable接口,

      技术分享

   发现ActionSupport对该方法做了空实现

      技术分享     

      

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

      

public class UserAction2 extends ActionSupport implements ModelDriven<User> {
    private User user;
    public void validate(){
        if(user.getUsername()==null || "".equals(user.getUsername())){
            super.addFieldError("username", "账户不能为空");
        }
        if(user.getPassword()==null || "".equals(user.getPassword())){
            super.addFieldError("password", "密码不能为空");
        }
        System.out.println("进行了验证");
    }
    
    public String login(){
        System.out.println("方法进行了验证");
        return SUCCESS;
    }
    
    public String add(){
        System.out.println("你执行了增加操作");
        return SUCCESS;
    }
...
}

    (3) 在strus.xml配置结果集      

    Struts在进行数据效验失败以后,会返回"Action.INPUT"字符串。去结果集寻找对应的页面

    这样子不管是调用login动作方法还是add动作方法,都会执行验证方法(对Action中的所有方法都进行验证)

 

 

 

  •   对指定方法进行验证 

    

  方式一:使用@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动作的时候,执行验证方法

 


 

 

  ( 二 ) 声明式验证(XML验证)

 

  • 对所有方法进行验证

 

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

  (1)创建配置文件

     规则:

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

      b.配置文件名字:Action-validation.xml【注意:这里的Action名字是struts.xml中配置的name】

      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",并转发到相应的页面

  

  •  验证指定的方法

 

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

    Action名字+需要拦截器的方法名+"-validation".xml  如:LoginAction-login-validation.xml

 


 

 

   Struts2提供的拦截器

 

  ( 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 配置文件

  技术分享

 

  配置文件书写规则:

    

                                         field-validator:param(可选)和message

                               field元素:多个field-validator元素  

根元素:validators(其中有多个field和validator元素)   

                        validator元素:param(可选)和messag元素  

                                         message

 

   ( 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定义的拦截器,通过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配置文件,命名随意

<?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>

 

Struts2表单数据验证

标签:

原文地址:http://www.cnblogs.com/xingdongpai/p/5064674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!