struts2 检验 字段型校验器&非字段型校验器

来源:互联网 发布:程序员喜欢用的浏览器 编辑:程序博客网 时间:2024/05/06 08:22

数据校验规则文件

 

1.数据校验规则文件规则:

 

1.此文件中规定了参数的一些校验条件;

2.可以包括字段型校验器和非字段型校验器;

3.命名规则:ActionName-validation.xml,其中ActionName是Action类的名字;

4.每个Action都有一个validation文件,规则文件放在和Action同目录下;

5.在前面我们讲到的配置逻辑action中,如果需要对某个逻辑Action配置数据校验文件,则命名规则为:ActionName-LogicActionName-validation.xml;

6.注意:当需要对逻辑action进行校验时,如果存在一般形式的ActionName-validaton.xml文件,则也会对此逻辑Action进行校验;

7.输入校验失败后,和类型转换一样,会将错误封装成fieldError,并放入Action Context中,因此在JSP中添加<s:fielderror/>可显示错误,此内容也是我们在数据校验文件中配置的;

8.当输入校验失败后,和类型转换一样,返回逻辑视图为input,因此在struts.xml中必须配<result name="input"></input>

9.输入校验失败后,struts表单标签也会自动输出错误提示;

 

字段型校验器&非字段型校验器

 

字段型校验器:以每个Action属性为一个单位进行编写,即以如下风格编写:

属性1

        规则1

        规则2

属性2

        规则1

        规则2

 

 

非字段型校验器:以规则为一个单位,以如下风格编写:

规则1

        属性

规则2

        属性

规则3

        属性

 


2.数据校验文件内容

 

1.数据校验文件以<validators>为根元素;

2.字段型校验器是以属性为单位的,内容模板:

 

[html] view plaincopy
  1. <validators>  
  2.     <field name="">  
  3.         <field-validator type="">  
  4.             <param name=""></param>  
  5.             <message></message>  
  6.         </field-validator>  
  7.     </field>  
  8.   
  9. </validators>  

 


3.非字段型校验器是以校验器为单位的,内容模板:

 

[html] view plaincopy
  1. <validator type="">  
  2.         <param name="fieldName"></param>  
  3.         <param name=""></param>  
  4.         <message></message>  
  5. </validator>  

 

 

代码示例:

 

此段代码中分别对字符串、日期、整型、email进行数据校验;

Validation01Action.java

 

[java] view plaincopy
  1. package org.validation.action;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import com.opensymphony.xwork2.ActionSupport;  
  6.   
  7. public class Validation01Action extends ActionSupport {  
  8.     private String name;  
  9.     private String email;  
  10.     private int age;  
  11.     private Date date;  
  12.     public String execute()throws Exception{  
  13.         return SUCCESS;  
  14.     }  
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     public String getEmail() {  
  22.         return email;  
  23.     }  
  24.     public void setEmail(String email) {  
  25.         this.email = email;  
  26.     }  
  27.     public int getAge() {  
  28.         return age;  
  29.     }  
  30.     public void setAge(int age) {  
  31.         this.age = age;  
  32.     }  
  33.     public Date getDate() {  
  34.         return date;  
  35.     }  
  36.     public void setDate(Date date) {  
  37.         this.date = date;  
  38.     }  
  39.       
  40. }  


1.jsp

[html] view plaincopy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@taglib prefix="s" uri="/struts-tags" %>  
  3.   
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  5. <html>  
  6.   <head>  
  7.   
  8.     <title>My JSP '1.jsp' starting page</title>  
  9.       
  10.     <meta http-equiv="pragma" content="no-cache">  
  11.     <meta http-equiv="cache-control" content="no-cache">  
  12.     <meta http-equiv="expires" content="0">      
  13.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  14.     <meta http-equiv="description" content="This is my page">  
  15.     <!-- 
  16.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  17.     -->  
  18.   
  19.   </head>  
  20.     
  21.   <body>  
  22.     <s:fielderror></s:fielderror>  
  23.     <s:form action="validator01">  
  24.         <s:textfield name="name" label="姓名"></s:textfield>  
  25.         <s:textfield name="email" label="邮箱"></s:textfield>  
  26.         <s:textfield name="age" label="年龄"></s:textfield>  
  27.         <s:textfield name="date" label="日期"></s:textfield>  
  28.         <s:submit value="提交"></s:submit>  
  29.     </s:form>  
  30.   </body>  
  31. </html>  


 

如果是以字段型校验器配置,则参考以下:

Validation01Action-validation.xml

(1)<field name="">为一个属性,name为Action属性名称;

(2)<field-validator type="">为配置一个校验器,type为校验器的类型;

(3)<param>为配置参数,比如最小值、最大值;

(4)<message>为错误信息,如果需要对错误提示信息进行国际化,则可以在全局国际化资源文件中配置,在校验规则文件中编写如下形式:<message key="key"/>,key为国际化资源文件的key即可;

 

 

[html] view plaincopy
  1. <!DOCTYPE validators PUBLIC  
  2.         "-//Apache Struts//XWork Validator 1.0.2//EN"  
  3.         "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">  
  4.   
  5. <validators>  
  6.     <field name="name">  
  7.         <field-validator type="requiredstring">  
  8.             <param name="trim">true</param>  
  9.             <message>姓名不能为空</message>  
  10.         </field-validator>  
  11.         <field-validator type="regex">  
  12.   
  13.             <param name="expression"><![CDATA[(\w{4,10})]]></param>  
  14.             <message>姓名要在4-10位之间</message>  
  15.         </field-validator>  
  16.     </field>  
  17.     <field name="age">  
  18.         <field-validator type="requiredstring">  
  19.             <param name="trim">true</param>  
  20.             <message>年龄不能为空</message>  
  21.         </field-validator>  
  22.         <field-validator type="int">  
  23.             <param name="min">0</param>  
  24.             <param name="max">200</param>  
  25.             <message>年龄范围在0-200之间</message>  
  26.         </field-validator>  
  27.     </field>  
  28.     <field name="email">  
  29.         <field-validator type="requiredstring">  
  30.             <param name="trim">true</param>  
  31.             <message>邮箱不能为空</message>  
  32.         </field-validator>  
  33.         <field-validator type="email">  
  34.   
  35.             <message>邮箱格式不正确</message>  
  36.         </field-validator>  
  37.     </field>  
  38.     <field name="date">  
  39.         <field-validator type="requiredstring">  
  40.             <param name="trim">true</param>  
  41.             <message>日期不能为空</message>  
  42.         </field-validator>  
  43.         <field-validator type="date">  
  44.             <param name="min">2010-01-01</param>  
  45.             <param name="max">2010-12-31</param>  
  46.             <message>日期在2010-01-01到2010-12-31之间</message>  
  47.         </field-validator>  
  48.     </field>  
  49.   
  50. </validators>  

而如果采用非字段校验器,则

(1)<validator type="">表示一个校验器,type属性表示校验器的类型;

(2)<param name="fieldName"></param> 此元素是必要的,指定Action属性的名称;

(3)<message>表示错误信息;

[html] view plaincopy
  1. <!DOCTYPE validators PUBLIC  
  2.         "-//Apache Struts//XWork Validator 1.0.2//EN"  
  3.         "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">  
  4.   
  5. <validators>  
  6.     <validator type="requiredstring" short-circuit="true">  
  7.         <param name="fieldName">name</param>  
  8.         <param name="trim">true</param>  
  9.         <message key="aa"></message>  
  10.     </validator>  
  11.     <validator type="requiredstring" short-circuit="true">  
  12.         <param name="fieldName">age</param>  
  13.         <param name="trim">true</param>  
  14.         <message>年龄不能为空</message>  
  15.     </validator>  
  16.     <validator type="requiredstring" short-circuit="true">  
  17.         <param name="fieldName">email</param>  
  18.         <param name="trim">true</param>  
  19.         <message>邮箱不能为空</message>  
  20.     </validator>  
  21.     <validator type="requiredstring" short-circuit="true">  
  22.         <param name="fieldName">date</param>  
  23.         <param name="trim">true</param>  
  24.         <message>日期不能为空</message>  
  25.     </validator>  
  26.     <validator type="regex">  
  27.         <param name="fieldName">name</param>  
  28.         <param name="expression"><![CDATA[(\w{4,10})]]></param>  
  29.         <message>姓名要在4-10位之间</message>  
  30.     </validator>  
  31.     <validator type="int">  
  32.         <param name="fieldName">age</param>  
  33.         <param name="min">0</param>  
  34.         <param name="max">200</param>  
  35.         <message>年龄范围在0-200之间</message>  
  36.     </validator>  
  37.     <validator type="email">  
  38.         <param name="fieldName">email</param>  
  39.         <message>邮箱格式不正确</message>  
  40.     </validator>  
  41.     <validator type="date">  
  42.         <param name="fieldName">date</param>  
  43.         <param name="min">2010-01-01</param>  
  44.         <param name="max">2010-12-31</param>  
  45.         <message>日期在2010-01-01到2010-12-31之间</message>  
  46.     </validator>  
  47. </validators>  

两者的区别:组织校验规则的方式不同:一种是字段优先,称为字段校验器风格;一种是校验器优先,称为非字段校验器风格。

使用字段校验器配置风格时,每个字段校验规则大致遵守如下形式:

<field name="被校验的字段">
 <field-validator type="校验器名">
  <!--此处需要为不同校验器指定数量不等的校验参数-->
  <param name="参数名">参数值</param>
  ...
  <!--校验失败后的提示信息,其中key指定国际化信息的key-->
  <message key="I18Nkey">校验失败后的提示信息</message>
 </field-validator>
 <!--如果该字段需要满足多个规则,下面可以配置多个校验器-->
  </field>  

可以看出每个<field..../>元素制定一个Action属性必须遵守的规则,该元素的name属性指定了被校验的字段;如果该属性需要满足多个规则,则在<field... />元素下增加多个<field-validator... />元素。
每个<field-validator... />元素指定一个校验规则,该元素的type属性指定了校验器名称,该元素可以包含多个<param... />子元素,用于指定该校验器的参数;除此之外,每个<field-validator... />元素都有一个必须的<message... />元素,该元素确定校验失败后的提示信息。

总结:字段校验器:一个<field>绑定一个字段,一个<field>可以有多个<field-validator>,对一个字段可以有多个校验。      
结构清晰,方便浏览和检查。易于维护。     
非字段校验器:一个<validator>标签下面只能对一个字段进行校验,如果对一个字段进行多次校验,需要写很多个<validator>,很繁琐。而且不利于维护。   

客户端校验方法:

 

在JSP的<s:form>元素中添加属性 validate="true";添加后,在校验规则文件的规则会转变为客户端校验规则,即任何校验都不需要接触服务器;

需要注意的是:如果直接访问JSP页面,并不能体现出客户端校验,只有通过访问某个action然后跳转到JSP页面才可以让客户端校验生效;

 


短路校验器

 

一般来说,如果我们为name配置了两个校验器:第一个是“不能为空”,第二个是“长度大于4且小于10”,则如果name字段为空时,则会同时输出这两条提示,但是实际上,如果用户输入为空的情况下,只应该输出“不能为空”,这就需要短路校验器;

在<validator>或<field-validator>元素中添加short-circut="true"即可;

 

短路校验器的规则:

 

1.当非字段校验器校验失败,则其后的所有字段校验器都不会执行,而不会影响其他非字段校验器;

2.字段校验器校验失败时,其后的所有字段校验器都不会执行;

 

校验器的运行顺序

 

1.非字段校验器比字段校验器先执行;

2.从前往后执行;

 


 

三、内建校验器

 

在xwork-core-Xxx.jar的com/opensymphony/xwork2/validator/validators/default.xml中定义了内建的校验器;

以下我们开始介绍内建校验器,以下介绍根据字段型校验器介绍;非字段校验器只需要简单变换即可;

 

1.required校验器

 

此校验器要求字段必须为非空;

 

2.requiredstring校验器

 

此校验器要求检验字符串非空并且必须长度大于0,即不能是""

可选参数为:

(1)trim:如果为true,则将前后的空白去掉,类似于String的trim函数;

 

3.int校验器

 

此校验器要求整数限定在一定范围之内;

可选参数为:

(1)min:最小值;

(2)max:最大值;

 

4.date校验器

 

要求日期在一定范围之内;

可选参数:

(1)min:最小日期;

(2)max:最大日期;

 

5.fieldexpression校验器

 

要求此校验器满足指定的逻辑表达式;

可选参数:

(1)expression:逻辑表达式;格式为:<![CDATA[(逻辑表达式)]]>

 

6.email校验器

 

要求字段一定要满足电子邮箱格式;

 

7.url校验器

 

要求字段格式满足URL格式;

 

8.stringlength校验器

 

要求字段是string,并且长度在一定范围之内;

可选参数:

(1)trim:删除前后空白;

(2)minLength:最小长度;

(3)maxLength:最大长度;

 

9.regex校验器

 

要求满足给定的正则表达式;

可选参数:

(1)expression:给出正则表达式;格式如:<![CDATA[(正则表达式)]]>

(2)caseSensitive:是否区分大小写;

 

四、手动校验

 

如果内建校验器不满足要求,可以自定义校验器,方法是在Action类中重写public void validate()方法;并且如果不满足条件,调用addFieldError("name","message"),然后返回input逻辑视图;

 

当然如果一个Action类中有多个逻辑Action,则validate方法就不管用,因此需要定义validateXxx()方法;比如:

如果逻辑Action的处理方法是fun(),则定义validateFun()方法,实现和validate方法一样;

 

注意:如果逻辑Action的校验函数是validateXxx(),则validate()一样也会被调用,因为只要对此物理Action进行校验,则validate()方法总会起作用。这和前面输入校验规则文件时一样的;



0 0
原创粉丝点击