struts2框架------验证机制

在struts2中,我们可以实现对action类的所有方法进行校验或者对action的指定方法进行校验。
对于输入校验struts2提供了两种实现方法:
1. 采用手工编写代码实现(编程式)。

2. 基于XML配置方式实现(声明式)。


手工校验机制
在Struts2 中手工校验是使用ActionSupport类的validate方法。
ActionSupport类实现了一个Validateable接口。这个接口只
有一个validate方法。如果Action类继承了ActionSupport类 ,Struts2 会在调用execute 方法之前自动调用这个方法,我们可以在validate方法中编写服务器端验证代码
如果发生错误,可以根据错误的level选择字段级(fielderror)错误,还是动作级(actionerror)错误。并且可使用addFieldError或addActionError加入相应的错误信息,如果存在Action或Field错误,Struts2 会返回“input”(这个并不用开发人员写,由Struts2 自动返回)
如果返回了“input”,Struts2 就不会再调用execute 方法了。如果不存在错误信息,Struts2在最后会调用execute 方法。


Struts2中的3种消息标签
<s:actionerror>承载Action级别错误信息
<s:fielderror>承载字段级别错误信息
<s:actionmessage>承载动作消息

这三种消息本质上都是存储在响应集合里的
调用标签时,如果相应消息集合里的内容为空,则什么都不显示。如果不为空,则依次迭代显示在页面上

手工编写代码实现对action指定方法输入校验

通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。

validateXxx()方法使用例子:

public String add() throws Exception{  return "success";} 

public void validateAdd(){

          if(username==null &&"".equals(username.trim())) this.addFieldError("username","用户名不能为空");

}

验证失败后,请求转发至input视图:

<resultname="input">/WEB-INF/page/addUser.jsp</result>

在addUser.jsp页面中使用<s:fielderror/>显示失败信息。

输入校验的流程

型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContextconversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。

3。系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。

4。再调用action中的validate()方法。

5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。


使用Validation框架验证数据
用validate方法校验数据会将验证代码和正常的逻辑代码混在一起,但这样做并不利于代码维护,而且也不能实现代码复用
在Struts2中提供了一个Validation框架,这个框架和Struts1.x提供的Validation框架类似,也是通过XML文件进行配置。
Validation框架可以实现服务器端验证和客户端验证


Validation服务器端验证
1.建立Action类
2. 配置Action类
3.编写验证规则配置文件
4. 编写数据录入JSP


验证配置文件
使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法。如果Action类为cn.itcast.UserAction,那么该文件的取名应为:UserAction-validation.xml。下面是校验文件的模版:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用户名不能为空!</message>
        </field-validator>
    </field>
</validators>


<field>指定action中要校验的属性,<field-validator>指定校验器,上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>为校验失败后的提示信息


编写校验文件时,不能出现帮助信息
在编写ActionClassName-validation.xml校验文件时,如果出现不了帮助信息,可以按下面方式解决:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
点“add”,在出现的窗口中的location中选“File system”,然后在xwork-2.1.2解压目录的src\java目录中选择xwork-validator-1.0.3.dtd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd


Validation客户端验证
其他步骤和服务器端验证一致
额外只需要在<s:form>中加入一个validate属性,值为true,即可
如<s:form validate="true" ... > ... </form>


struts2提供的校验器列表
系统提供的校验器如下:
required (必填校验器,要求field的值不能为null)
requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)
url(网址校验器,要求如果field的值非空,则必须是合法的url地址)
date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)
conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)
expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)

校验器的使用例子

required 必填校验器

<field-validatortype="required">

       <message>性别不能为空!</message>

</field-validator>

requiredstring 必填字符串校验器(先去掉空格)

<field-validator type="requiredstring">

       <param name="trim">true</param>

       <message>用户名不能为空!</message>

</field-validator>

stringlength字符串长度校验器

<field-validator type="stringlength">

  <param name="maxLength">10</param>

  <param name="minLength">2</param>

  <param name="trim">true</param>

  <message><![CDATA[产品名称应在2-10个字符之间]]></message>

</field-validator>


email:邮件地址校验器

<field-validatortype="email">

  <message>电子邮件地址无效</message>

</field-validator>

int:整数校验器

<field-validator type="int">

  <param name="min">1</param>

  <param name="max">150</param>

  <message>年龄必须在1-150之间</message>

</field-validator>


Validation框架对指定action方法实现校验

校验文件的取名为ActionClassName-validation.xml时,会对 action中的所有处理方法实施输入验证。如果你只需要对action中的某个action方法实施校验那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml其中ActionNamestruts.xmlaction的名称。例如:在实际应用中,常有以下配置:

<actionname="user_*"class="cn.itcast.action.UserAction"method="{1}“ >

  <resultname="success">/WEB-INF/page/message.jsp</result>

  <resultname="input">/WEB-INF/page/addUser.jsp</result>

</action>

UserAction中有以下两个处理方法:

public String add() throwsException{

   ....

}

public String update() throwsException{

   ....

}

要对add()方法实施验证,校验文件的取名为:UserAction-user_add-validation.xml

要对update()方法实施验证,校验文件的取名为:UserAction-user_update-validation.xml


复合属性验证
有一类特殊的属性,即这个属性的类型是另外一个JavaBean,对于复合属性的验证,需要使用visitor类型
其中context参数将作为验证User类属性的文件名的一部分,如context设为abc,复合属性的验证文件名为User-abc-validation.xml
该参数是可选的,如果不设置,则复合属性验证文件名就是ClassName-validation.xml
如果另一个Action对同类复合属性使用另一个校验规则,可以创建新的验证文件,并且使用context参数区分即可



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值