struts校验主要是用于表单输入的校验,为action指定校验规则,当校验不通过时,将不执行action的目标方法,而是返回input的结果。
为了良好的实现校验,请让Action继承于ActionSupport
一、实现校验的方式
1 指定类的校验xml文件
支持继承,也支持对指定逻辑进行校验,假如RegistAction继承于BaseAction,此外BaseAction有login方法,那么对于login方法,整个校验的文件搜索顺序如下:
BaseAction-validation.xml
BaseAction-login-validation.xml
RegistAction-validation.xml
RegistAction-login-validation.xml
如果全部存在,那么上面的所有文件的校验规将都被执行。
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWrok Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <validators> <!-- 校验器的写法分字段风格和非字段风格 --> <!-- 字段风格的校验*************************** --> <field name="name"> <!-- 非空校验 --> <field-validator type="requiredstring"> <param name="trim">true</param> <message key="name.required"></message> <!-- key属性是资源文件中的键,属于国际化的做法,另外也可以使用getText方法: <message>${getText("name.required")}</message> --> </field-validator> <!-- 正则表达式校验 --> <field-validator type="regex" > <param name="expression"><![CDATA[(\w{4,25})]]></param> <message key="name.length"></message> </field-validator> <!-- 注:对于一个字段有多个校验的情况,某些关键校验可以设置short-circuit="true"来开启短路特性。该特性将使得 当前校验失败的情况下终止后面关于该字段的字段风格校验的执行。 --> </field> <field name="pass"> <field-validator type="requiredstring"> <param name="trim">true</param> <message key="pass.required"></message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{4,25})]]></param> <message key="pass.length"></message> </field-validator> </field> <field name="confirm"> <!-- 字段表达式校验 --> <field-validator type="fieldexpression"> <param name="expression"><![CDATA[(pass==confirm)]]></param> <message key="pass.confirm"></message> </field-validator> </field> <field name="age"> <!-- 数值校验 --> <field-validator type="int"> <param name="min">1</param> <param name="max">150</param> <message key="age.range"></message> </field-validator> </field> <!-- 非字段风格校验 ************************--> <!-- 日期校验 --> <validator type="date"> <param name="fieldName">birth</param> <param name="min">1900-01-01</param> <param name="max">2050-02-21</param> <message key="birth.range"></message> </validator> <!-- 所有非字段风格的校验都将优先于字段风格的校验 --> <!-- 短路校验器如果在非字段风格校验中,会被优先执行,如果是字段风格,则还是按顺序来 --> <!-- 短路校验器的失败会导致后续关于该字段的字段风格校验不执行,而对于非字段风格的校验则无影响 --> </validators>
2 使用注解
@RequiredStringValidator(type=ValidatorType.FIELD,key="name.required", message="")
public void setName(String name)...
更多参考:http://struts.apache.org/2.2.3/docs/validation-annotation.html
3 覆盖ActionSupport的validate方法或validateXXX方法
对于后者,如果调用的方法是login那么就为validateLogin方法。
这两者中validate会先被调用,validateXXX在后面被调用。
在重写的方法中,可以调用ActionSupport提供的便利方法如:
addFieldError("user","用户名称输入不正确"); --- 添加一条校验错误,一旦执行过这样的操作,便表示校验未通过(返回结果input)
getText("user.required")根据key获取资源文件的内容
二、关于校验过程的描述
1 类型转换,如果出错,将错误信息保存到ActionContext里,由conversionError拦截器负责将其转换为fieldError,然后继续执行校验;否则直接进入校验过程
2 配置文件校验 -> 注解校验
3 执行validate
4 执行validateXXX
5 判断是否存在fieldError,如果有则返回input结果,否则调用action的目标方法
6 处理结果..
三、关于内建校验器
conversion validator
date validator
double validator
email validator
expression validator
fieldexpression validator
int validator
regex validator
required validator
requiredstring validator
stringlength validator
url validator
visitor validator
参考:http://struts.apache.org/2.2.3/docs/validation.html#Validation-RegisteringValidators
四、关于客户端校验
客户端校验即是struts通过获取服务端action的校验配置自动在jsp页面中生成校验的js代码的功能。
由于兴趣原因,试验了一下客户端校验,发现这部分功能就是鸡肋..:
用的是2.3.3版本,客户端校验的实现过程如下:
1 使用<s:form>要求设置属性 validate为"true",内部的表单元素一律采用struts的标签
2 jsp页面不能是直接访问,否则会报异常(NullPointer之类..),需要通过action映射到jsp资源:
<action name="*"><result>/{1}.jsp</result>
3 <s:form>的action必须是action的名称,而不能是**.action 否则会直接提交给后台action验证;
4 在<head>内加入<s:head/>可以看到一点点css效果。
用后感觉:功能太弱,容易出错;许多校验器都支持不了;出错情况下再次提交出错会显示重复的错误提示(上次提交的错误提示并未消除)
最好的资源来自官方文档:http://struts.apache.org/2.2.3/docs/validation.html