在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
对于输入校验struts2提供了两种实现方法:
采用手工编写代码实现。
基于XML配置方式实现。
输入校验的流程:
1、类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
2、如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。
3、系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
4、再调用action中的validate()方法。
5、经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
1.手工编写代码实现对action中所有方法输入校验
通过重写validate()方法实现, validate()方法会校验action中所有与execute方法签名相同的方法。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,Struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
验证例子如下:
package com.action; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport{ private String UserName; private String message; public String getUserName() { return UserName; } public void setUserName(String userName) { UserName = userName; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String execute(){ this.message = "验证通过"; return "success"; } //重写validate()方法 public void validate() { // TODO Auto-generated method stub <span style="color:#FF0000;">if(UserName==null || UserName.equals("")){ this.addFieldError("UserName", "用户名不能为空"); }</span> } }
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>主页</title> </head> <body> <span style="color:#FF0000;"><s:fielderror></s:fielderror></span> <form method="post" action="/Validate/Validate/UserInfo"> 用户名:<input type="text" name="UserName"/> <input type="submit" value="提交"/> </form> ${message} </body> </html>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="Validate" namespace="/Validate" extends="struts-default"> <action name="UserInfo" class="com.action.UserAction" method="execute"> <span style="color:#FF0000;"><result name="input">/UserInfo.jsp</result></span> <result name="success">/UserInfo.jsp</result> </action> </package> </struts>
2.基于XML配置方式实现对action的所有方法进行输入校验
使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:
ActionClassName-validation.xml
ActionClassName为action的简单类名
validation为固定写法
如果Action类为cn.itcast.UserAction,那么该文件的取名应为:UserAction-validation.xml。
<field>指定action中要校验的属性,<field-validator>指定校验器,上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>为校验失败后的提示信息,如果需要国际化,可以为message指定key属性,key的值为资源文件中的key。
在这个校验文件中,对action中字符串类型的username属性进行验证,首先要求调用trim()方法去掉空格,然后判断用户名是否为空。
例子如下:
package com.action; import com.opensymphony.xwork2.ActionSupport; public class <span style="color:#FF0000;">UserAction</span> extends ActionSupport{ private String UserName; private String message; public String getUserName() { return UserName; } public void setUserName(String userName) { UserName = userName; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String execute(){ this.message = "验证通过"; return "success"; } // //重写validate()方法 // public void validate() { // // TODO Auto-generated method stub // if(UserName==null || UserName.equals("")){ // this.addFieldError("UserName", "用户名不能为空"); // } // } }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>Struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="ValidateXml" namespace="/ValidateXml" extends="struts-default"> <action name="UserInfo" class="com.action.UserAction" method="execute"> <result name="input">/UserInfo.jsp</result> <result name="success">/UserInfo.jsp</result> </action> </package> </struts>
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时,校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中