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提供的客户端校验最好不要使用,有很大缺陷!