您的位置:首页 > 编程语言 > Java开发

Struts2输入校验以及错误信息处理(2)——用Struts2定义好的校验框架进行校验

2011-11-12 20:15 465 查看
Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。

不管是哪种方式,程序执行的流程都是一样的,执行流程如下:

1、对表单传递过来的数据,先进行类型转换

2、执行校验

3、若校验不合法,则跳转到以input命名的result页面,若合法,则跳转到指定的页面

第一种方法,已经在上一篇博客中介绍了,现在介绍第二种方法:

校验框架中又有两种方法,一种是字段优先,一种是校验器优先,这里只介绍字段优先

字段优先就是以字段作为参照物进行校验

首先在要校验的Action所在的包中,新建一个以该Action的类名为文件名的xml文件,然后引进<!DOCTYPE …xwork-validator-1.0.2.dtd>元素,在该xml文件中,进行编写验证校验规则。

实例如下:

RegisterAction-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">
<message>username can't be blank !</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">6</param>
<message key="username.length"></message>
</field-validator>
</field>

<field name="password">
<field-validator type="requiredstring">
<message>password can't be blank !</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">6</param>
<message>password should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>

<field name="repassword">
<field-validator type="requiredstring">
<message>repassword can't be blank !</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">6</param>
<message>repassword should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>

<field name="age">
<field-validator type="required">
<message>age can not be blank !</message>
</field-validator>
<field-validator type="int">
<param name="min">10</param>
<param name="max">50</param>
<message>age should be between ${min} and ${max}</message>
</field-validator>
</field>

<field name="birthday">
<field-validator type="required">
<message>birthday can't be blank !</message>
</field-validator>

<field-validator type="date">
<param name="min">2005-05-01</param>
<param name="max">2011-11-12</param>
<message>birthday should be between ${min} and ${max}</message>
</field-validator>
</field>
</validators>


说明:
① 每一个field-validator的type对应一个具体的类,这个对应关系,在com.opensymphony.xwork2.validator.validators包下的default.xml文件中定义。

② 每一个类处理对特定类型的数据进行特定的验证。

③ 在field-validator下传递的param参数,其name就是相对应的类中的属性名,注意,这个属性名是由set/get方法中的方法名中get/set后的属性名决定的,如在一个类中,定义了一个叫做doTrim的私有属性,但是其set/get方法为:setTrim()/getTrim(),通过param向这个属性传递数据的时候,param的name要写成"trim"才对。

④ 对每一个字段可以定义多个校验器,进行各方面的校验。

注意:xml文件名的格式为:Action类名-validation.xml,如本例中的RegisterAction-validation.xml,位置要放在和该Action类所在的同一个包中。

补充:在field-validator元素下的message元素,还有一个key属性,如上例中的对username的校验中,message元素为:

<message key="username.length"></message>这样的写法,是为了实现用几种不同的语言,去显示提示信息,message指定了一个key,对应的还有要value,这个value值就是错误提示信息,要在几个不同的properties文件中去实现这个对应关系,所以有几种语言,就要新建几个properties文件,在其中指定key和value。

这样的properties文件的命名也有一定的规则:package_语言_国家.properties,如若要显示中文错误信息,则该文件命名为:package_zh_CN.properties,若要显示英文提示错误信息,文件命名为:package_en_US.properties。

message中指定的key要和properties文件中的key相同,才能正确显示相应的错误提示信息。

如在本例中,分别用中文和英文显示username字段的长度的错误提示信息:

package_zh_CN.properties:

username.length=\u7528\u6237\u540D\u7684\u957F\u5EA6\u5E94\u8BE5\u5728${minLength}\u548C${maxLength}\u4E4B\u95F4


(用户名的长度应该在${minLength}和${maxLength}之间)

package_en_US.properties:

username.length=length of username should be between ${minLength} and ${maxLength}

这种机制有什么好处呢?这种机制就是为了实现国际化!Struts可以根据浏览器的首选语言,对应的显示相应语言的提示信息。

那么这种机制是怎么实现的呢?来看一个test

package com.suo.i18n;

import java.util.Locale;
import java.util.ResourceBundle;

public class I18NTest
{
public static void main(String[] args)
{
ResourceBundle bundle=ResourceBundle.getBundle("piao",Locale.CHINA);

System.out.println(bundle.getString("hello"));
}
}


还有若干个properties文件,命名和上面的类似,只是这里可以以任意字符串开头,如:

piao_zh_CN.properties:

hello=\u4F60\u597D\uFF0C\u4E2D\u56FD(你好,中国)

piao_en_US.properties:

hello=hello US

ResourceBundle类,我们叫它资源包。资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如
String
),程序可以从适合当前用户语言环境的资源包中加载它。使用这种方式,可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

properties文件在这里可以看成我们的资源文件。

ResourceBundle类中有很多重载的getBundle()方法,可以调用某一个properties文件,即某一个资源。如上例中getBundle()方法中的第一个参数为"piao",第二个参数为Locale.CHINA,即是要使用以piao为命名的,中文的资源文件,即使用的是piao_zh_CN.properties文件。若getBundle()方法的参数为getBundle("piao",Locale.US),即使用的piao_en_US.properties文件。这里就是根据properties文件的文件名来找到相应的资源文件的。所以命名一定要正确。

在Struts2中,所有的资源文件名都是以package开头的,这test种的piao的地位是一样的,这就是这种机制的原理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐