验证框架

重写validate方法,页面中使用了ww:form标签,已经提供了输出校验错误和显示错误的能力了。
使用配置文件方式,命名方式ActionName-validation.xml其中actionname就是action的类字(注意是类名不是action名字)。和action的源文件位于同一个包下。如:

<!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="hello">
//requiredstring类型的校验表示该字段是必须输入的。
        <field-validator type="requiredstring">
            <message>You must enter a name</message>
        </field-validator>
    </field>
</validators>

页面刻意通过<s:fielderror/>来输出错误。

重写validateXxx方法
一个action可以多个方法,重写validae方法无法应付多个方法的情况。我们的做法如下
如果有一个register方法,重写validateRegister方法。
然后是定义个action,这个action指定了method方法是register,那么访问这个register的action会调用validateRegister方法。

校验的完整流程是:
1.类转换器进行转换成action的属性
2.转换器出现一场,错误信息保存到ActionContext中。conversionError封装到fieldError
3.通过反射调用validateXXX
4.调用action的validate
5.如果没有fieldError(前面都执行了,才会检查),那么就是action会执行。

<!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="hello">
//requiredstring类型的校验表示该字段是必须输入的。
        <field-validator type="requiredstring">
            <message>You must enter a name</message>
        </field-validator>

//这里对name进行的两个验证。
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
            <message>名字无效</message>
        </field-validator>
    </field>
</validators>

国际化
<message>元素的key属性,指定国际化提示信息对应的key、
获取局部国际化的text。

客户端的校验
<s:form的validate=true的话会进行客户端校验。
如果直接访问这样的页面,会报错。
是校验配置文件中的message元素的key引起的,它加载的是全局的国际资源文件,而全局的并未定义这个key。
刻意使用${getText("消息key")}如
<message>${getText("name.requried")}</message>
由于javascript的限制,无法全部将服务端的验证转换成客户段,客户端只支持:
required必填验证
requiredstring 必填的字符串
stringlength 字符串长度校验
regex表达式校验
email
url
int
double
另外不要将<s:form>的theme设置simple
不要在校验文件中使用key来指定国际化

一个action类中对应的多个方法
<ActionClassName>-<ActionAliasName>-validation.xml

RegistionAction-login-validation.xml
ActionAliasName标示的是action name,而不是方法名,这个可以从源码当中看出来。在源码中可以看到初始化验证器的代码:
buildClassValidatorConfigs(anInterface1, checkFile)
buildAliasValidatorConfigs(anInterface1, context, checkFile)
第二个方法buildAliasValidatorConfigs(anInterface1, context, checkFile)就是根据标识生成对应的验证器。
而这里的参数context,从调试中可以看出来是action名字而不是方法名。
String fileName = aClass.getName().replace('.', '/') + "-" + context + VALIDATION_CONFIG_SUFFIX;

return loadFile(fileName, aClass, checkFile);
其方法里面代码只有两句
fileName是action类名+context。
系统收索ActionName-validation.xml,搜索到与否都不会停止
搜索ActionName-login-validation.xml


短路
<validator元素和field-validator都有一个short-circuit属性,true为短路,默认false
如果一个字段指定了两个校验,那么这个字段有一个校验有效就放弃该字段下面的校验。如果加入了短路,那么执行顺序要注意
非字段风格
( <validator type="requiredstring">
<param name="fieldName>要验证的字段</param>
            <message>You must enter a name</message>
        </validator>直接写validator,然后<param name="fieldName>要验证的字段</param>设置字段

的校验器优先字段风格校验器
(<field name="hello">
//requiredstring类型的校验表示该字段是必须输入的。
        <field-validator type="requiredstring">
            <message>You must enter a name</message>
        </field-validator>
    </field>,先有field,然后是field-validator

同类型,按先后顺序,从上到下。

注册校验器
在xwork的jar文件中
在com.opensymphony.xwork2.validator.validators的一个default.xml框架提供的校验器
<validators>
<validator name="xxx" class="校验器类" />
自己添加校验器需要添加一个validators.xml到classes文件目录下。另外如果有这个文件,default.xml的不会加载,自己定义的话记得把default.xml的复制进来。

复合属性的校验,visitor
如有一个User类型的user属性,
<field name="user">
//requiredstring类型的校验表示该字段是必须输入的。
        <field-validator type="visitor">
            <param name="context">userContext</param>
<param name="appendPrefix">true</param>
        </field-validator>
    </field>
这里不设置校验规则,User类有一个对应的校验文件
User-validation.xml,由于我们上面设置了context属性,所以该文件的名字应该是
User-userContext-validation.xml,该文件和action的校验一样。

你可能感兴趣的:(JavaScript,框架,xml)