一、概述:

① Struts2的输入验证
–基于 XWorkValidation Framework的声明式验证:Struts2提供了一些基于
XWork Validation Framework的内建验证程序.使用这些验证程序不需要编程,
只要在一个 XML
文件里对验证程序应该如何工作作出声明就可以了.需要声明的内容包括:
  •哪些字段需要进行验证
  •使用什么验证规则
  •在验证失败时应该把什么样的出错消息发送到浏览器端
–编程验证:通过编写代码来验证用户输入

二、Struts2的声明式验证:

①  声明式验证程序可以分为两类:
–字段验证: 判断某个字段属性的输入是否有效
–非字段验证:
 不只针对某个字段,而是针对多个字段的输入值之间的逻辑关系进行校验。例如:对再次输入密码的判断。
②  使用一个声明式验证程序需要3
个步骤:
      –1. 确定哪些Action字段需要验证
      –2. 编写一个验证程序配置文件.它的文件名必须是以下两种格式之一:
            •若一个 Action类的多个action使用同样的验证规则:ActionClassName-validation.xml
            •若一个 Action类的多个action使用不同的验证规则:ActionClass-alias-validation.xml,例如
UserAction-User_create-validation.xml
      –3. 确定验证失败时的响应页面:在
struts.xml 文件中定义一个
<result name=“input”>的元素.

③ Struts2的一些内建验证规则:

      •conversion validator:转换验证器
      •date validator:日期验证器
      •double validator:浮点验证器
      •email validator:email验证器
      •expression validator:表达式验证器
      •fieldexpressionvalidator:字段表达式验证器
      •intvalidator:整型验证器
      •regexvalidator:正则表达式验证器
      •required validator:非空验证器
      •requiredstringvalidator:非空字符串验证器
      •stringlengthvalidator:字符串长度验证器
      •urlvalidator:url格式验证器
     •visitor validator:复合属性验证器

④  一个简单的字段验证声明:

<!-- 待验证字段名称为username -->
<field name="username">
<!-- 使用非空验证器 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<!-- 错误提示消息 -->
<message>必须输入用户名</message>
</field-validator>
<!-- 使用正则验证器 -->
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{6,20})]]></param>
<message>用户名长度必须在6到20字符之间</message>
</field-validator>
</field>

⑤ 显示错误消息

a、若使用的是struts2的非simple主题,则自动显示错误消息

b、若使用的是simple主题,则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)

${fieldErrors.age[0] }

     或者

    <s:fielderror fieldName="age"></s:fielderror>   推荐使用此方法

⑥  Struts2声明式验证的原理:

> Struts2 默认的拦截器栈中提供了一个 validation 拦截器

     > 每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器.

        该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml

        <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

⑦  短路验证

若对一个字段使用多个验证器, 默认情况下会执行所有的验证. 若希望前面的验证器验证没有通过, 后面的就不再验证, 可以使用短路验证

<validator …/>元素和
<field-validator …/>元素可以指定一个可选的
short-circuit属性,该属性指定该验证器是否是短验证器,默认值为false。

<!-- 设置短路验证: 若当前验证没有通过, 则不再进行下面的验证 -->
<field-validator type="conversion" short-circuit="true">
<message>Conversion Error Occurred</message>
</field-validator> <field-validator type="int">
<param name="min">20</param>
<param name="max">60</param>
<message key="error.int"></message>
</field-validator>

⑧  不同的字段使用同样的验证规则, 而且使用同样的响应消息 ?

将错误消息配置在国际化资源文件中:

error.int=${getText(fieldName)} needs to be between ${min} and ${max}

age=年龄

count=数量

⑨  自定义验证器:

I.   定义一个验证器的类

    > 自定义的验证器都需要实现 Validator.

    > 可以选择继承 ValidatorSupport 或 FieldValidatorSupport 类

    > 若希望实现一个一般的验证器, 则可以继承 ValidatorSupport

    > 若希望实现一个字段验证器, 则可以继承 FieldValidatorSupport

    > 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性,并提供对应的setter与getter方法

public class IDCardValidator extends FieldValidatorSupport {

	@Override
public void validate(Object object) throws ValidationException {
//1. 获取字段的名字和值
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object); //2. 验证
IDCard idCard = new IDCard();
boolean result = idCard.Verify((String)value); //3. 若验证失败, 则 ...
if(!result){
addFieldError(fieldName, object);
} } }

II.  在配置文件中配置验证器



    > 默认情况下下, Struts2 会在 类路径的根目录下加载 validators.xml 文件. 在该文件中加载验证器.

         该文件的定义方式同默认的验证器的那个配置文件: 位于 com.opensymphony.xwork2.validator.validators 下的 default.xml

         

    > 若类路径下没有指定的验证器, 则从 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的验证器加载     



III. 使用: 和目前的验证器一样.

三、Struts2的编程式验证

Struts2提供了一个Validateable接口,可以使Action类实现这个接口以提供编程验证功能.
ActionSupport 类已经实现了Validateable接口

Struts2的输入验证的更多相关文章

  1. struts2之输入验证

    输入校验主要分为两种: 基于客户端的校验: 客户端校验主要作用是防止正常浏览者的误输入,仅能对输入进行初步过滤:对于一些用户恶意行为,客户端校验则无能为力. 基于服务端的校验: 服务器接收客户端提交的 ...

  2. [原创]java WEB学习笔记70:Struts2 学习之路-- 输入验证,声明式验证,声明是验证原理

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. struts2的validate输入验证

    原创 struts2的输入验证有两种方式: 使用validate()方法实现验证 使用验证文件实现验证 下面通过一个例子介绍validate()方法验证——实现客户注册输入验证 设计的JSP页面代码: ...

  4. Struts2入门(四)——数据输入验证

    一.前言 1.1.什么是输入验证?为什么需要输入验证? 在上一篇文章中,我们学习了数据类型转换,我们提到了表示层数据处理的两个方法,也提到了用户输入数据需要进行类型转换才能得到我们想要的数据,那么,我 ...

  5. struts2输入验证

    1.方法     ① 基于Annotations的验证       ②基于XML配置的验证 http://blog.csdn.net/furongkang/article/details/692204 ...

  6. struts2系列(二):struts2参数传递错误、struts2的输入错误验证

    一.struts2参数传递错误 1. 基本数据类型的传递最好使用包装类,原因是struts 2.1之后使用基本数据类型如果参数为空会报错2. 日期参数的传递最好定义一个区域的属性(定义locale), ...

  7. Struts2的输入校验(1)——校验规则文件的编写

    Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: ...

  8. Struts2框架(8)---Struts2的输入校验

    Struts2的输入校验 在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验: 客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻 ...

  9. JavaWeb框架_Struts2_(六)----->Struts2的输入校验

    1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...

随机推荐

  1. Android开发之EditText属性详解

    1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 ( ...

  2. i386 和amd64 的意思

    首先可以简化一个概念,i386=Intel 80386.其实i386通常被用来作为对Intel(英特尔)32位微处理器的统称. Windows NT类系统的安装盘上,通常i386是其根上的一个文件夹, ...

  3. NFC(1)NFC简介,3种模式

    简介 NFC(Near Field Communication,近场通信),是一种数据传输技术.但与Wi-Fi.蓝牙.红外线等数据传输技术的一个主要差异就 是有效距离一般不能超过4厘米. NFC支持如 ...

  4. ACM - ICPC World Finals 2013 C Surely You Congest

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...

  5. uva12169 Disgruntled Judge

    扩展欧几里得. 枚举a,根据x1,x3和递推式可得. (a+1)*b-k*mod=f[3]-a*a*b. 通过扩展欧几里得求出b. 带入原式进行计算. #include<cstdio> # ...

  6. LA 3485 (积分 辛普森自适应法) Bridge

    桥的间隔数为n = ceil(B/D),每段绳子的长度为L / n,相邻两塔之间的距离为 B / n 主要问题还是在于已知抛物线的开口宽度w 和 抛物线的高度h 求抛物线的长度 弧长积分公式为: 设抛 ...

  7. UVa 1252 (状压DP + 记忆化搜索) Twenty Questions

    题意: 有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数. 每次只可以询问该数的第K为是否为1. 问采用最优询问策略,则最少需要询问多少次能保证猜 ...

  8. Asp.Net IEnumerable,ICollection,IList,List区别

    做C#的同学们,都知道,一类只能有一个继承类,但可以实现多个接口.这句话就告诉我们:IEnumerable,ICollection,IList,List区别了 首先我看看 IEnumerable: / ...

  9. 如何在Android应用中加入广告

    转载自:http://mobile.51cto.com/aprogram-387527.htm 目前我自己的一款小程序中正进行到加入广告阶段,BAIDU了一下,找到如下好文章,非常有必要共享一下,故转 ...

  10. 【转】linux中wait与waitpid的差别

    原文网址:http://blog.163.com/libo_5/blog/static/15696852010324287748/ zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存 ...