输入验证的流程:
1. 类型转换器对请求参数执行类型转换,并把转换后的值赋给action的属性。
2. 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,
conversionError拦截器将异常信息添加到fileErrors里。不管类型转换是否出现异常
,都会进入第3步。
3. 系统通过反射技术先调用action的validateXxx()方法,Xxx为方法名。
4. 在调用action的validate()方法。
5. 经过上面4步 ,如果在系统中的fieldErrors存在错误信息(即存放错误信息的集合
的size大于0),系统自动将请求转发至名称为input的视图 。如果系统中的fieldErrors
没有任何错误信息,系统将执行action中的处理方法。
对于输入校验struts2提供了两种实现
@手工编写代码实现
@基于配置XML的实现
1.手工编写代码实现对action中所有方法输入校验
通过重写validate()方法实现,validate方法会验证所有与execute方法签名相同的方法,当某个数据验证失败时,我们应该调用addFieldError()方法网系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action必须继承ActionSupport),如果系统的fieldErrors包含错误信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
public void validate() {//会对action中的所有方法校验
if(this.username==null || "".equals(this.username.trim())){
this.addFieldError("username", "用户名不能为空");
}
if(this.mobile==null || "".equals(this.mobile.trim())){
this.addFieldError("mobile", "手机号不能为空");
}else{
if(!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile).matches()){
this.addFieldError("mobile", "手机号格式不正确");
}
}
}
2.手工编写代码实现对action中指定方法输入校验
通过validateXxx()方法实现,validateXxx()会验证action中方法名为xxx的方法,其它的流程与“手工编写代码实现对action中全部方法输入校验”一致。
3 . 基于XML配置实现对action中的所有方法进行输入校验
使用基于XML配置方式实现校验时,Action也要继承ActionSupport,并且提供校验文件,检验文件和action类放在统一包下,文件的取名格式为ActionClassName-validation.xml ,其中ActionClassName为action的简单类名,-validate为固定写法。
ActionClassName-validate.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>
<field name="mobile">
<field-validator type="requiredstring">
<message>手机号不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<message>手机号格式不正确!</message>
</field-validator>
</field>
</validators>
常用的校验器
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator>
<field-validator type="requiredstring">
<message>手机号不能为空!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<message>手机号格式不正确!</message>
</field-validator>
<field-validator type="required">
<message>性别不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLength">5</param>
<param name="trim">true</param>
<message><![CDATA[产品名称应在5-10个字符之间]]></message>
</field-validator>
<field-validator type="email">
<message>电子邮件地址无效</message>
</field-validator>
4 . 基于XML配置实现对action中的指定方法进行输入校验
如果只需对action中的某个方法进行进行校验,只需步骤3的基础上,把校验文件的取名应为:
ActionClassName-ActionName-validation.xml即可,但是这里的ActionName并不是struts中的配置的action名称(user_*)
而应该是路径中的action,如现在要访问useraction的add方法
http://localhost:8080/projectName/namespace/user_add.action
那么此时的actionName应是user_add
所以校验文件的名称应为UserAction-user_add-validation.xml。
5 . 基于XML校验的一些特性
5.1 :当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml
两种规则的校验文件中,系统按下面顺序寻找校验文件,
1>ActionClassName-validation.xml
2>ActionClassName-ActionName-validation.xml
在系统寻找到某一校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总
,然后全部应用于action方法的校验。如果两个校验文件中的规则冲突,则使用后面文件中的校验规则。
5.2 :当action继承了另一个action,父类的校验文件会被先搜到。
假设UserAction继承BaseAction
<action name="user" class="cn.action.UserAction" method="{1}">
</action>
访问上面的action,系统先搜索父类的校验文件:BaseAction-validation.xml,
BaseAction-user-validation.xml,接着搜索子类的校验文件:UserAction-validation.xml,
UserAction-user-validation.xml。应用于上面action的校验规则为这四个文件的总和。