转载:http://blog.csdn.net/iuhiqnehc/article/details/8245767
如果在Action类在struts配置中有多个action实例(action name),那么对应某个action的验证文件名:<ActionClassName>-<aliasName>-validation.xml。例如:UserAction-login-validation.xml。 (注意:<aliasName>并不是method name,而是struts.xml中配置的action的name)。
多个校验规则文件的验证次序
例如有一个LoginAction继承BaseAction,这两个Action中都有业务方法login,并且存在4份校验规则文件如下:BaseAction-vadition.xml, BaseAction-login-validation.xml , LoginAction-validation.xml, LoginAction-login-validation.xml那么用户访问LoginAction的login方法里,会按照以上的顺序执行校验规则,实际的校验规则是以上四个校验规则的总和,但是如果存在冲突的情况下,后面的校验规则优先。
字段校验和非字段校验
字段校验,属于是字段优先。即我去校验谁,然后是我用谁去校验
非字段校验,则校验器优先。即我用谁去校验,然后是我去校验谁
即字段校验中先定义name="username"对哪个字段校验,再定义type="requiredstring"如何校验
而非字段校验先定义type="requiredstring"确定校验器,再定义name="fieldName"指定所校验的属性,字段校验和非字段校验的本质都是一样的,只是说话的顺序不同罢了。反映到底层后,二者实质上都是一样的。相对来说不推荐使用非字段验证,因为如果需要验证的字段非常多的话,那么在维护的时候就比较困难了。
validation.xml 的内容示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="userName">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="userName.required"></message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>用户名长度必须在6到20之间!</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>密码不能为空!</message>
</field-validator>
<field-validator type="regex" short-circuit="true">
<param name="expression"><![CDATA[(\w{6,15})]]></param>
<message>密码必须是字母和数字组合且长度在6到15之间!</message>
</field-validator>
</field>
<field name="rpassword">
<field-validator type="requiredstring" short-circuit="true">
<param name="trim">true</param>
<message>确认密码不能为空!</message>
</field-validator>
<field-validator type="fieldexpression" short-circuit="true">
<param name="expression"><![CDATA[password==rpassword]]></param>
<message>确认密码和密码不一致!</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<param name="repopulateField">true</param>
<message>年龄必须在1到150之间!</message>
</field-validator>
</field>
<field name="email">
<field-validator type="email">
<message>请输入合法的Email地址!</message>
</field-validator>
</field>
<field name="birthday">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2012-12-31</param>
<param name="repopulateField">true</param>
<message key="birth.range"></message>
</field-validator>
</field>
<field name="url">
<field-validator type="url">
<message>个人主页必须是有效的URL地址!</message>
</field-validator>
</field>
</validators>
message的信息可以配置国际化:<message key="userpass.required"></message>,key对应的是国际化配置文件中的国际化信息。还可以使用以下配置获取国际化资源中的信息
:<message>${getText("
userpass
.
required
")}</message>
这种方式是通过调用ActionSupport类的getText()方法来获取国际化资源的。
将<s:form>的validate属性设置为true,不能将<s:form theme="">的theme属性设置为simple,将<s:form/>的action和namespace属性分开写。设置validate="true"之前和之后的JSP页面在运行时的源代码是不同的,JSP页面中会自动生成校验配置文件中对应的javascript代码。但是并不是所有的服务器端校验都可以转换成客户端校验,如日期校验。Struts2的客户端验证提示信息都显示在各字段的正上方,不够友好。在实际开发中,几乎不会使用到Struts2提供的客户端校验。使用的更多的还是它的服务端的校验,这也是Strtus2的强项。
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器
1、required验证器用来验证一个参数是否为null。
<field-validator type="required">
<message>指定检验失败的提示信息</message>
</field-validator>
</field>
</validators>
2、requiredstring验证器用来验证一个字符串参数是否非空,既不为null,且长度大于0。
3、int验证器用来验证一个整数型参数是否在指定的范围内。如果一个已经被成功转换为int的属性不在验证器指定的范围内,int验证器就会报错。
int验证器可以有两个参数:
min用来指定可接受范围的最小值。
max用来指定可接收范围的最大值。
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年纪必须在1到150之间</message>
</field-validator>
</field>
</validators>
5、 double验证器验证一个双精度浮点型参数是否在指定的范围内。如果一个已经被成功转换为double的属性不在验证器指定的范围内,double验证器就会报错。
double验证器可以有四个参数:
minInclusive用来指定可接受范围的最小值,包含给定值。
maxInclusive用来指定可接收范围的最大值,包含给定值。
minExclusive用来指定可接受范围的最小值,不包含给定值。
maxExclusive用来指定可接收范围的最大值,不包含给定值。
6、date验证器用来验证一个日期型参数是否在指定的范围内。如果一个已经被成功转换为date的属性不在验证器指定的范围内,date验证器就会报错。
date验证器可以有两个参数:
min用来指定可接受范围的最小值。
max用来指定可接收范围的最大值。
注意:指定日期范围的时候,需要使用统一的格式,比如用MM/DD/YYYY的格式等。
<validators>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message key="birth.range"/>
</field-validator>
</field>
</validators>
7、fieldexpression验证器中必须指定一个返回布尔值的ognl表达式,根据这个表达式的值来确定是否符合条件。
参数:
expression:返回布尔值的ognl表达式,可以在这个ognl表达式中访问当前的值栈。
表达式验证器(expression)与字段表达式验证器(fieldexpression)类似,同样使用expression参数来指定返回布尔值的ognl表达式,但是,只能用于动作验证器。
<validators>
<field name="re_pass">
<message>密码必须和确认密码相等</message>
</field-validator>
</field>
</validators>
8、email验证器用来验证一个参数是否为邮箱地址。
<validators>
<field name="email">
<field-validator type="email">
<message>你的电子邮件地址必须是一个有效的电邮地址</message>
</field-validator>
</field>
</validators>
9、url验证器用来验证一个参数是否为合法的URL。
<validators>
<field name="url">
<field-validator type="url">
<message>你的主页地址必须是一个有效的网址</message>
</field-validator>
</field>
</validators>
参数:
context:引用的域对象验证信息文件上下文名。
appendPrefix:是否在错误信息中添加<message>元素指定的前缀。
<validators>
<field name="user">
<field-validator type="visitor">
<param name="context">c1</param>
<param name="appendPrefix">true</param>
<message>用户</message>
</field-validator>
</field>
</validators>
上面的示例,在user字段上指定了一个visitor验证器,设置上下文的名称为c1,设置前缀为true,也就是说在发生错误的时候,要在c1上下文返回的错误信息前加上“用户”这个前缀。
接下来新添一个上下文验证文件,其文件名为“字段的简单类名-上下文名-validation.xml”,比如现在要为user属性指定一个名为c1的上下文,所以文件名为UserModel-c1-validation.xml,放在与域对象同级的包内,即UserModel所在的包内,注意:不再是与Action同级的包内了,其内容示例为:
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<message>年龄要大于等于18</message>
</field-validator>
</field>
</validators>
它的本质也是一个验证文件,与之前直接在RegisterAction-validation.xml直接写出对user.age的验证相比,没有本质上的区别,只是这个文件以UserModel类为验证的根,所以<field>元素的name属性直接写age就可以了,而不再是原来的user.age。
JSP中则为:<INPUT TYPE="text" NAME="user.age">
11、conversion验证器用来验证类型转换时是否出错。如果一个类型为int的参数接到了“18a”这个字符串,conversion验证器就会报错。
参数:repopulateField指定当类型转换失败后返回input页面时,表单是否保留原来的错误输入。
<field name="myField">
<field-validator type="conversion">
<param name ="repopulateField">true</param>
<message>类型转换错误</message>
</field-validator>
</field>
12、stringlength验证器用来验证一个字符串的长度是否在指定范围内。
参数:
minLength:字符串长度的最小值。
maxLength:字符串长度的最大值。
<field name="userName">
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">20</param>
<message>用户名长度必须在${minLength}到${maxLength}之间!</message>
</field-validator>
</field>
13、regex验证器用来验证一个字符串是否符合一个正则表达式的要求。
参数:
expression:必填参数,正则表达式。
caseSensitive:是否检查大小写,默认为true。
<field name="password">
<field-validator type="regex" short-circuit="true">
<param name="expression"><![CDATA[(\w{6,15})]]></param>
<message key="password.invalid"></message>
</field-validator>
</field>
非字段校验器的配置
<validator type="requiredstring"><param name="fieldName">password</param>
<param name="trim">true</param>
<message>${getText("password.requried")}</message>
</validator>