Struts2的输入效验
在struts2中,我们可以实现对action的所有业务方法进行校验或者对action的指定业务方法进行校验。
对于输入校验struts2提供了两种实现方法:
1. 基于验证方法编写代码实现。
2. 基于验证框架配置方式实现。
基于验证方法编写代码实现
在action中提供validate() 方法实现输入校验,该方法对action中所有的业务方法均有作用。
基于验证方法编写代码实现
validate()使用例子:
public void validate() {
if(this.mobile==null || "".equals(this.mobile.trim())){ this.addFieldError(“mobile", "手机号不能为空");
}else{ if(!Pattern.compile("^1[358]\\d{9}").matcher(this.mobile.trim()).matches()){
this.addFieldError(“mobile", "手机号的格式不正确"); }
}
}
验证失败后,请求转发至input视图:
<result name="input">/addUser.jsp</result>
在addUser.jsp页面中使用<s:fielderror/>或者${FiledErrors.key[0]}显示失败信息
通过validateXxxx()方法实现针对某个指定方法的验证,xxxx代表业务方法的方法名。
validateXxxx()方法使用例子:
public String add() throws Exception{ return "success";}
public void validateAdd(){
if(username==null && "".equals(username.trim())) this.addFieldError("username", "用户名不能为空");
}
输入校验的流程
1、类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
2、如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。
3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
4、再调用action中的validate()方法。
5、经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
基于验证框架配置方式实现
校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法。
<?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>
</validators>
为方便编写validation.xml,导入xwork-validator-1.0.3.dtd到MyEclipse中。
struts2所提供的验证规则全部在com.opensymphony.xwork2.validator.validators目录下的default.xml中。
required 必填校验器
<field-validator type="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>产品名称应在2-10个字符之间</message>
</field-validator>
email:邮件地址校验器
<field-validator type="email">
<message>电子邮件地址无效</message>
</field-validator>
regex:正则表达式校验器
<field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<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>
如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为访问该action的名称
<action name="user_*" class="com.lovo.action.UserAction" method="{1}“ >
<result name="success"></result>
<result name="input">/addUser.jsp</result>
</action>
UserAction中有以下两个处理方法:
public String add() throws Exception{
}
public String update() throws Exception{
}
要对add()方法实施验证,校验文件的取名为: UserAction-user_add-validation.xml
要对update()方法实施验证,校验文件的取名为: UserAction-user_update-validation.xml
验证嵌套属性
Action中如果有一个特有的JavaBean属性,这种情况下要使用visitor验证。
public class AddAction extends ActionSupport{ private User user;
//省略get/set方法
}
<field name="user"> <field-validator type="visitor"> <param name="context">abc</param> <param name="appendPrefix">true</param> <message>User:</message> </field-validator> </field>
context参数将作为验证User类属性的文件名的一部分,如user属性返回一个User对象,那么用于验证User对象属性的文件名为User-abc-validation.xml。
appendPrefix表示是否附加错误信息,如果为true,当出错时Struts2会将<message>标签中的信息加到User-abc-validation.xml文件中的相应错误信息前面。
在struts2中,我们可以实现对action的所有业务方法进行校验或者对action的指定业务方法进行校验。
对于输入校验struts2提供了两种实现方法:
1. 基于验证方法编写代码实现。
2. 基于验证框架配置方式实现。
基于验证方法编写代码实现
在action中提供validate() 方法实现输入校验,该方法对action中所有的业务方法均有作用。
当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过struts2的标签<s:fielderror/>显示失败信息。
基于验证方法编写代码实现
validate()使用例子:
public void validate() {
if(this.mobile==null || "".equals(this.mobile.trim())){ this.addFieldError(“mobile", "手机号不能为空");
}else{ if(!Pattern.compile("^1[358]\\d{9}").matcher(this.mobile.trim()).matches()){
this.addFieldError(“mobile", "手机号的格式不正确"); }
}
}
验证失败后,请求转发至input视图:
<result name="input">/addUser.jsp</result>
在addUser.jsp页面中使用<s:fielderror/>或者${FiledErrors.key[0]}显示失败信息
通过validateXxxx()方法实现针对某个指定方法的验证,xxxx代表业务方法的方法名。
validateXxxx()方法使用例子:
public String add() throws Exception{ return "success";}
public void validateAdd(){
if(username==null && "".equals(username.trim())) this.addFieldError("username", "用户名不能为空");
}
输入校验的流程
1、类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
2、如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。
3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
4、再调用action中的validate()方法。
5、经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
基于验证框架配置方式实现
校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法。
<?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>
</validators>
为方便编写validation.xml,导入xwork-validator-1.0.3.dtd到MyEclipse中。
struts2所提供的验证规则全部在com.opensymphony.xwork2.validator.validators目录下的default.xml中。
required 必填校验器
<field-validator type="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>产品名称应在2-10个字符之间</message>
</field-validator>
email:邮件地址校验器
<field-validator type="email">
<message>电子邮件地址无效</message>
</field-validator>
regex:正则表达式校验器
<field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<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>
如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为访问该action的名称
<action name="user_*" class="com.lovo.action.UserAction" method="{1}“ >
<result name="success"></result>
<result name="input">/addUser.jsp</result>
</action>
UserAction中有以下两个处理方法:
public String add() throws Exception{
}
public String update() throws Exception{
}
要对add()方法实施验证,校验文件的取名为: UserAction-user_add-validation.xml
要对update()方法实施验证,校验文件的取名为: UserAction-user_update-validation.xml
验证嵌套属性
Action中如果有一个特有的JavaBean属性,这种情况下要使用visitor验证。
public class AddAction extends ActionSupport{ private User user;
//省略get/set方法
}
<field name="user"> <field-validator type="visitor"> <param name="context">abc</param> <param name="appendPrefix">true</param> <message>User:</message> </field-validator> </field>
context参数将作为验证User类属性的文件名的一部分,如user属性返回一个User对象,那么用于验证User对象属性的文件名为User-abc-validation.xml。
appendPrefix表示是否附加错误信息,如果为true,当出错时Struts2会将<message>标签中的信息加到User-abc-validation.xml文件中的相应错误信息前面。
User-abc-validation.xml文件的内容如下:
<field name="name">
<field-validator type="requiredstring">
<message>请输入name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">5</param>
<param name="max">20</param>
<message> 必须在 5至20之间 </message>
</field-validator>
</field>