zoukankan      html  css  js  c++  java
  • 第三讲 struts验证框架

    程序中的验证机制(可分为js客户端验证技术、struts2框架的服务器端验证):

    1.js:运行在客户端的浏览器,用户体验高,性能高,但是安全性较低(客户端可以禁止js);

    2.服务器端验证:运行在服务器(例如:Tomcat),安全行非常高,交互性较差,消耗大量的服务器资源(性能变低);

    一般在程序中的验证两种都必须使用

    注意:防止用户重复提交无效数据,使用验证码验证。

     

    1. 手动完成验证操作。

    步骤:

    a) 创建一个Action,继承自ActionSupport类。

    b) 重写验证方法:validate();

    c) 如何判断验证是否通过?(系统判断是否调用addFieldError()方法)

    d) 如果验证通过,调用action中的指定方法;否则跳转到<result name=”input”></result>所在页。

    e) Jsp页面需要显示错误信息:<s:fieldError />

    注意:validate()方法,默认情况下,验证当前Action中所有方法。

      如果需要验证指定方法:规则validateXxx();

    //如果需要验证基本数据类型,必须将set方法中的数据类型设置为Object类型
    public void setAge(Object age) {
            
        String data[] = (String[])age;
            
        if(data[0].matches("[0-9]+")==false){
            super.addFieldError("age", "年龄必须是数字!");
        }
        else{
            this.age = Integer.parseInt(data[0]);
        }
    }
    通用类型转换:请使用全局类型转换器

    2. 使用struts内置的验证框架。

    步骤:

    a) 创建一个Action,继承自ActionSupport类。

    b) 创建验证的xml配置文件。

    命名规则:Action类名-validation.xml

    <validators>
         <field name="csdn.resName">
             <field-validator type="requiredstring">
                 <param name="doTrim">true</param>
                 <message>资源名不能为空</message>
             </field-validator>
             <field-validator type="regex">
                 <param name="expression">^[\u4e00-\u9fa5]{5,50}$</param>
                 <message>不小于5个汉字</message>
             </field-validator>
         </field>
         </field>
     </validators>

    c) 配置文件中的内容到xwork.*.*.jar中找到default.xml文件(将提示消息变为中文)。


    创建验证的xml文件详细:

      Action配置中一定要设置input返回页面

      1.验证Action中全部方法

     

    在Action同包下,创建:Action类名-validation.xml
    如:ValidateAction创建ValidateAction-validation.xml 

     

      2.验证Action单个方法

     

    <!-- 每个方法单独配置一个Action --> 
    <!-- 在Action同包下,创建:Action类名-action方法配置名称-validation.xml -->
    <action name="validateAdd" class="com.struts2.validator.ValidateAction" method="add">
    <!-- 要创建ValidateAction-validateAdd-validation.xml --> 
    <!-- 使用通配符配置 -->
    <!-- 在Action同包下,创建:Action类名-action方法对应的名称-validation.xml -->
    <action name="validate_*" class="com.struts2.validator.ValidateAction" method="{1}">
    <!-- 要创建ValidateAction-validate_add-validation.xml,validate_add为访问这个action方法的路径 -->

     

    特别注意:

    1.要验证的方法不能叫input. 
    2.这样配置在form表单中要在<s:form action="validate_add">中action写好名称, 不能写action="validate_",然后<s:submit value="提交"method="add" />  这样会找不到对应的配置文件,跳过验证. 
    3.如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口, 然后prepare()方法里初始化添加页面需要的值. 
    4.如果使用Preparable接口,必须在action配置中添加<interceptor-ref name="paramsPrepareParamsStack" />.这样prepare()才能得到form提交的参数.

      3.验证文件*.xml内容

    <!DOCTYPE validators PUBLIC  "-//OpenSymphony Group//XWork Validator 1.0.2//EN"  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
    <validators>          
    <!-- 要验证的字段名称 -->        
     <!-- 要验证Action中UserBean的id字段,name="userBean.id"(userBean为Action中的变量名) -->     
    <field name="mail">         
    <!-- type要验证的类型,short-circuit(默认false),true含义,如果当前验证失败了,下面的验证就不执行了.如requiredstring失败了,email就不验证了. -->        
     <!-- field-validator下面可以有多个param元素,但是最多只能有一个message -->         
    <field-validator type="requiredstring">             
    <param name="trim">true</param>             
    <message>Please enter a mail</message>         
    </field-validator>         
    <field-validator type="email">                 
    <message>                         
    Invalid MAIL                 
    </message>         
    </field-validator>     
    </field> 
    </validators>

    4.Struts内建验证程序(type的值)

    a)required:保证字段的值不是空值null.空字符串不是空值null. 

    <field name="userName">     
    <field-validator type="required">        
     <message>Please enter a user name</message>     
    </field-validator> 
    </field>

    b)requiredstring:保证字段不是空值null,也不是空白(empty).param:trim(boolean) ->true->去除前后空格 

    <field name="userName">    
    <field-validator type="requiredstring">         
    <param name="trim">true</param>        
     <message>Please enter a user name</message>     
    </field-validator> 
    </field> 

    c)int:验证字段值是否可以转换为一个整数.param: min(int);max(int) 

     <field name="yeaar">         
        <field-validator type="int">             
            <param name="min">1999</param>              
            <param name="max">2010</param>                         
         <message>year:1999-2010</message> </field-validator> </field>

    d)date:验证给定日期字段的值是否在一个给定的范围内.param:max(date);min(date) 

    <field name="borthday">         
      <field-validator type="int">
        <!-- 格式取决于当前地理时区 -->
        <param name="min">1999-01-01</param>
        <param name="max">2010-01-01</param>
      <message>birthday:1999-2010</message>
    </field-validator>
    </field>

    e)email:给定的String值是否是一个电子邮件地址 

    <field name="email">    
    <field-validator type="email">
    <message>Invalid email</message>
    </field-validator>
    </field>

    f)url:给定的String值是否是一个合法的URL(要有前缀) 

    <field name="url">   
    <field-validator type="url">
    <message>Invalid URL</message>
    </field-validator>
    </field>

    g)expression,fieldexpression:

    验证给定字段是否满足一个OGNL表达式.
    区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调用<s:actionerror/>才显示出错信息)
    fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证)
    param:expression(String)OGNL表达式 

    expression:

    public class ExpressionTestAction {        
       //属性生成get,set    
       private int min;    
       private int max; 
    }
    <validator type="expression"> <param name="expression"> max > min </param> <message> Maximum temperature must be greater than Minimum temperature </message> </validator> <!-- jsp --> <s:actionerror/>

    fieldexpression:

    public class FieldExpressionTestAction {      
     //属性生成get,set
      private int min;
     private int max;
    } <!-- 对字段验证 -->
    <field name="max">
    <field-validator type="fieldexpression">
     <param name="expression">
        max > min
      </param>
      <message>
      Maximum temperature must be greater than Minimum temperature
    </message>
    </field-validator>
    </field>

    h)visitor:把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用) 

    //UserBean public class UserBean {       
    //属性get,set
      private String name;
      private int age;
    }
    //UserBean-validation.xml(和UserBean放在同一个包中)
    <field name="name">
    <field-validator type="requiredstring">
    <message>用户名必须</message>
    </field-validator>
    </field>
    <field name="age">
    <field-validator type="int">
    <param name="min">18</param>
    <param name="max">99</param>
    <message>Age must be between 18 and 99</message>
    </field-validator>
    </field>
    //Action的validation.xml <!-- userBean变量名 -->
    <field name="userBean">
    <field-validator type="visitor">
    <!-- message会和UserBean验证中的message一起显示 -->
    <message>用户: </message>
    </field-validator>
    </field>

    3.在action中验证

    利用Validateable接口实现验证,实现void validate()方法.
    ActionSupport类已经实现了这个接口 

    //继承ActionSupport 
    public class User extends ActionSupport {     
    //属性get,set     
    private String userName;     
    private String password;     
    private static List<String> userNames = new ArrayList<String>();     static {         
      userNames.add("harry");         
      userNames.add("sally");     
    }     
    //验证方法     
    public void validate() {         
      if (userNames.contains(userName)) {     
    //添加出错信息     addFieldError("userName", "'" + userName + "' has been taken."); }   } }

     

     

     

  • 相关阅读:
    快速熟悉项目代码
    Hello World
    【java】随机生成6位的数字
    解决字段名与实体类属性名不相同的冲突
    通过eclipse mybatis generater代码生成插件自动生成代码
    自有账户体系对接百度云推送必须要弄懂的问题
    使用jquery获取url及url参数的方法
    Delphi 不使用自带模板创建服务
    Delphi在Listview中加入Edit控件
    动态加载和动态注册类技术的深入探索
  • 原文地址:https://www.cnblogs.com/lljj/p/Struts03.html
Copyright © 2011-2022 走看看