3.Struts2的输入验证

l          当类型转换成功以后,struts2将进行输入验证

若要进行输入验证则你的action必须继承ActionSupport类,实现其validate方法

在方法中调用addFiledError方法为验证失败的字段加上错误信息

注意若是一旦有验证失败的信息,struts会自动转入配置文件input中,若没有则出错!

若类型转换时就出错,也会转回input指定的页面并产生一条信息也加入到FiledError中,

在input指定页面中可以用struts标签<s:fielderror></s:fielderror>读出所有转换失败的信息与验证失败的信息

<s:fielderror>
        <s:param>field1</s:param>指定显示field1字段的信息
   </s:fielderror>

 

l          类型转换失败后struts2会自动产生转换失败的信息,一般这种信息并不是想看到得,可以通过配置及及资源文件来替换掉其内置信息

方法:在struts.xml中加入以下语句:

<constant value="message"></constant>

其中name不能变(可以在struts的jar包里面的default.properties找到),表示国际化资源文件的前缀名如中文资源文件为:message_zh.properties

英文为:message_en.properties 若为默认的则为:message.properties 其中资源文件要放在classes文件下面,如在message.properties下面加上一句:xwork.default.invalid.fieldvalue={0} error

若中{0}为占位符,在发生转换错误时struts2会自动将此占位符替换成发生错误的字段名,这句话的key不能变(可以从xwork-message.properties中找到,注意每个单词都是小写),value可以自定义,这样的配置为全局配置,即所有的发生转换错误都会调用此默认的格式,一般很少这么使用,因为控制并不精确

局部转换错误替换信息的配置:在要转换的action的同一包下:名字为:actionName.properties 即名称与action名称相同。里面的内容为

invalid.fieldvalue.attributeName=xxxxx message

其中invalild.fieldvalue不能变,struts2会以此来判断是不是用来类型转换时的替换信息

attributeName为action中的属性名称

 

基中int类型转换时会有些问题,若abc转换为int 转换会失败,即产生转换失败信息,但是struts2会自动将此字段赋值为0,这些要注意

l          一个action里封装多个业务处理方法,即相当于struts1.x中的DispatcherAction 与MappingDispatcherAction一样,不过这个action 依然只继承ActionSupport.

  在自定义且继承ActionSupport的Action中加入业务处理方法,在struts.xml中的相应配置中加入

<!--

使用struts2的action很简单,也只继承一个ActionSupport就可以了,完全可以实现struts1.x中的

Action ,MappingDispatcherAction,DispatcherAction要实现的功能。

添加一个method属性则请求此action时会调用对应名称的业务处理方法。

若不加,则有两种情况

1.执行默认的execute方法。(此时请求的的path为register.action)

2.执行指定的方法,这个指定要在请求时指定.(此时请求的path为register!callMethodName.action)

比较奇怪,不过好用。

 -->

<action name="register" class="edu.yzu.action.UserAction" method="register">

<!-- result 的name属性可以不写,不写的话表示为success -->

<result>/result.jsp</result>

<result name="input">/index.jsp</result>

<result name="login">/login.jsp</result>

<!--

为这个action指定拦截器,若不指定则会使用此包的默认拦截器

若指定一个拦截器,则此包的默认拦截器则不会被用于拦截此action

所以若还要使用默认拦截器时必须显示指出,如下:

 -->

 

<interceptor-ref name="thirdinterceptor"></interceptor-ref>

<interceptor-ref name="mystack"></interceptor-ref>

<interceptor-ref name="thirdinterceptor"></interceptor-ref>

<interceptor-ref name="thirdinterceptor"></interceptor-ref>

</action>

这里要注意对于同一个自定义的action 中所有的业务处理方法在执行前一定会执行 validate方法,这显然有时并不合理。Struts2对于不同的业务处理方法的验证采用默认规则,即validate+业务处理方法名.如register()的验证方法为validateRegister().但是依然会执行validate()方法。解决方法有两个。1.不重写validate方法 2.将validate方法名改为validateExecute().因为execute()方法为action的默认方法,即struts.xml文件中没有配置method属性时会自动调用此方法。将validate改为validateExecute()后则此验证方法只验证execute()

Struts2的校验框架

l          Struts2的校验框架是针对一个action进行的(即一个action类一个校验文件,文件名也有一点的规则:actionName-validation.xml),用xml文件进行配置,这点有些类似于struts1.x

Xml文件的结构为

它的服务器端校验分为两种方式,一种是基于字段的,一种是基于验证器的,事实上两种方法是一回事,只是看问题的方面不同而已

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators SYSTEM "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >

<validators>

 

<!-- 基于字段的方式

filed 的name属性为要验证action的属性

field-validator 的type属性为用哪种校验器来校验,这个值可以从

com.opensymphony.xwork2.validator.validators包下面的default.xml 中找到

short-circuit是指定当本验证器验证失败后后面的验证器是否还继续验证。蛮有用

其中param 的name属性为对应校验器的java类的属性

message为校验失败后添加到fielderror中的信息。

 -->

<field name="userName" >

<field-validator type="requiredstring" short-circuit="true">

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

<message>userName shoud not blank!</message>

</field-validator>

<field-validator type="stringlength">

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

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

<message>userName shoud be between ${minLength} and ${maxLength}!</message>

</field-validator>

</field>

 

<!--

基于校验器的方式

其中每个校验器的最一个param 的name的值都为fieldName固定不变,

表示校验action中的哪个属性

以后的param 的name与基于字段的校验的含义一样

可以看出基于校验器的验证并不如基于字段的验证看来直接(两者可以混合使用)

 -->

<validator type="requiredstring">

<param name="fieldName">userName</param>

<message>userName shoud not be blank!</message>

</validator>

<validator type="stringlength">

<param name="fieldName">userName</param>

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

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

<message>userName shoud be between ${minLength} and ${maxLength}!</message>

</validator>

 

</validators>

 

 

 

要注意的是同样一个自定义的action中有几个业务处理方法时也可以对每个业务处理方法进行校验。校验文件与此action放在同一个包下,并且名字为:actionName-methodName-validation.xml

需要注意的是如果也为此action 也配置了actionName-validation.xml文件,则此文件也会被使用于校验,应该尽量避免这种情况:方法与上面上同,将actionName-validation.xml改为actionName-execute-validation.xml 使此文件专用于默认的execute业务方法的校验。(事实上这种情况似乎遇到的并不多)

 

Struts2提供的客户端校验最好不要使用,有很大缺陷!

posted @ 2010-05-03 16:58  沉兮  阅读(1052)  评论(0编辑  收藏  举报