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

Struts 2框架的输入校验

2013-04-06 19:27 302 查看
Struts 2框架的输入校验

1.服务器端输入校验

1.1使用编码进行输入校验

使用validate()方法进行输入校验时,会对当前Action中的所有的方法有效。由于Struts 2框架可以在同一个Action()中使用的不同方法来处理不同的请求,因此,如果只想对Action中的某个方法进行输入校验,则可以使用validateXxx()方法来实现,其中Xxx是将Action中的方法名称为xxx()的首字母大写。

1.2 实用配置文件进行输入校验

1.2.1校验规则文件的结构

校验规则文件的结构是由xwork-validator-1.0.2.dtd文件定义的,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
XWork Validators DTD.
Used the following DOCTYPE.

<!DOCTYPE validators PUBLIC

"-//OpenSymphony Group//XWork
Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->

<!ELEMENT
validators (field|validator)+>

<!ELEMENT
field (field-validator+)>
<!ATTLIST
field
name CDATA
#REQUIRED
>

<!ELEMENT
field-validator (param*,
message)>
<!ATTLIST
field-validator
type CDATA
#REQUIRED
short-circuit (true|false)
"false"
>

<!ELEMENT
validator (param*,
message)>
<!ATTLIST
validator
type CDATA
#REQUIRED
short-circuit (true|false)
"false"
>

<!ELEMENT
param (#PCDATA)>
<!ATTLIST
param
name CDATA
#REQUIRED
>

<!ELEMENT
message (#PCDATA)>
<!ATTLIST
message
key CDATA
#IMPLIED
>
(1)
文件中“<!--”和“-->”标记之间的内容表明,一个校验规则文件开始的内容是如下内容:

<!DOCTYPE validators PUBLIC

"-//OpenSymphony Group//XWork
Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

(2)
validators是校验规则文件的根元素。Validators元素可以包含一个或多个field或validator子元素。

(3)
field子元素是基于字段定义输入校验的验证规则。field子元素有一个必选的name属性。Name:必选属性,用于设置要验证的表单字段的名称。

另外,field子元素可以包含一个或多个field-validator子元素,用于设置校验器。

(4)
field-validator子元素有type和short-circuit两个属性。

type:必选属性,用于设置验证器的名称。

short-circuit:如果为同一个表单字段配置多个验证器,当某个验证器验证失败后,其后的验证器是否还执行,可以使用short-circuit属性进行设置,默认值为false。如果short-circuit属性值设置为true,则其后的验证器不执行。

(5)
validator子元素是基于验证器定义输入校验的验证规则。Validator子元素有type和short-circuit两个属性。

type:必选属性,用于设置验证器的名称。

short-circuit:用于设置当某个验证器验证失败后,其后的验证器是否还执行,默认值为false。如果short-circuit属性值设置为true,则其后的验证器不执行。

另外,validator子元素包含0个、1个、或多个param子元素以及一个message子元素

(6)
param子元素为验证器传递参数。

name:必选属性,用于设置参数的名称,参数的值嵌套在param元素内。

(7)
message子元素设置当验证器验证失败时显示的错误信息。

Key:可选属性,用于指定错误信息在国际化资源文件中的键(key)。

1.2.2校验规则文件的命名

校验规则文件有两种命名方式,其名称分别是Actionname-validation.xml和Actionname-actionAlias-validation.xml,其中Actionname是Action类的名称。校验规则文件和对应的Action保存在相同的目录下。

actionAlias是指在Struts框架的配置文件中给定的action的名称。通常,action的name属性值和method名称匹配,但是也可以不同。

Actionname-validation.xml中的校验规则:在调用Action类中的任何方法时都会起作用

Actionname-actionAlias-validation.xml中的校验规则:仅在actionAlias和action的name属性值相同时才起作用。

如果同时配置了两个校验规则文件,则在Actionname-validation.xml文件中只放所有method都使用的验证规则。

1.2.3基于字段的校验规则

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">
<param
name="trim">false</param>
<message>username can't be blank!</message>
</field-validator>
<field-validator
type="stringlength">
<param
name="minLength">4</param>
<param
name="maxLength">6</param>
<param
name="trim">false</param>
<message
key="username.invalid"></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>length of password should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>

<field
name="age">
<field-validator
type="required">
<message>age can't be blank!</message>
</field-validator>
<field-validator
type="int">
<param
name="min">10</param>
<param
name="max">40</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-1-1</param>
<param
name="max">2007-12-31</param>
<message>birthday should be between ${min} and ${max}</message>
</field-validator>
</field>
</validators>
例子:如下表单:
假定在该应用中要求这三个请求参数必须满足如下要求:
1、name和password只能是字母和数组,且长度必须在4到16之间。
2、年龄必须是1到150之间的整数。
[html] view plaincopyprint?

1.
<s:form action="regist" >
2.
<s:textfield name="name" label="用户名"></s:textfield>
3.
<s:textfield name="password" label="密码"></s:textfield>
4.
<s:textfield name="age" label="年龄"></s:textfield>
5.
<s:submit value="注册"></s:submit>
6.
</s:form>

下面是该请求的Action代码:
[java] view plaincopyprint?

1.
public class RegistAction extends ActionSupport {
2.
private String name;
3.
private String password;
4.
private int age;
5.

6.
//省略上面三个属性的getter和setter方法
7.
public String execute() throws Exception {
8.

9.
return SUCCESS;
10.
}

上面的Action中包含的execute方法,之间返回success字符串,不需要做任何的处理,所以这个Action不具备任何输入校验的功能。
但是通过为该Action指定一个校验文件后,既可以利用Struts 2的输入校验功能对该Action进行校验。
该校验文件应该遵守以下的命名规则:<Action name>-validation.xml,且该文件应该保持在和Action相同的路径下。
校验文件如下:
[html] view plaincopyprint?

1.
<validators>
2.
<!-- 校验Action的name属性 -->
3.
<field name="name">
4.
<!-- 指定name属性必须满足的必填规则 -->
5.
<field-validator type="requiredstring">
6.
<param name="trim">true</param>
7.
<message>必须输入名字</message>
8.
</field-validator>
9.
<!-- 指定name属性必须匹配正则表达式 -->
10.
<field-validator type="regex">
11.
<param name="expression"><![CDATA[(\w{4,25})]]></param>
12.
<message>您输入的用户名只能是字母和数字,且长度必须在4到25之间</message>
13.
</field-validator>
14.
</field>
15.

16.
<!-- 校验Action的password属性 -->
17.
<field name="password">
18.
<!-- 指定password属性必须满足必填的规则 -->
19.
<field-validator type="requiredstring">
20.
<param name="trim">true</param>
21.
<message>必须输入密码</message>
22.
</field-validator>
23.
<!-- 指定password属性必须满足匹配指定的正则表达式 -->
24.
<field-validator type="regex">
25.
<param name="expression"><![CDATA[(\w{4,25})]]></param>
26.
<message>您输入的密码指定是字母和数字,且长度必须在4到25之间</message>
27.
</field-validator>
28.
</field>
29.

30.
<!-- 校验Action的age属性 -->
31.
<field name="age">
32.
<field-validator type="int">
33.
<param name="min">1</param>
34.
<param name="max">150</param>
35.
<message>年龄必须在1到150之间</message>
36.
</field-validator>
37.
</field>
38.
</validators>

当输入校验失败后,Struts 2是自动返回名为“input”的result,因此需要在struts.xml中配置名为"input"的Result.
如下:
[html] view plaincopyprint?

1.
<package name="myaction" extends="struts-default">
2.
<action name="regist" class="com.app.action.RegistAction" >
3.
<result name="input">/regist.jsp</result>
4.
<result name="success">/welcome.jsp</result>
5.
</action>
6.
lt;/package>

指定了校验失败后应用会跳转到的物理资源页面后,这样我们就可以在该页面中添加<s:fielderror/>来输出错误提示
当用户提交请求时,Struts 2的校验框架会根据该文件对用户请求进行校验。如果用户的输入不满足校验规则,浏览器就会显示相应的错误提示:

1.2.4基于validator校验器的校验规则

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>

<validator
type="requiredstring">
<param
name="fieldName">username</param>
<message>username can't be blank!</message>
</validator>

<validator
type="stringlength">
<param
name="fieldName">username</param>
<param
name="minLength">4</param>
<param
name="maxLength">6</param>
<message>length of username should be between ${minLength} and ${maxLength}</message>
</validator>

<field
name="birthday">
<field-validator
type="required">
<message>birthday can't be blank!</message>
</field-validator>
<field-validator
type="date">
<param
name="min">2005-1-1</param>
<param
name="max">2007-12-31</param>
<message>birthday should be between ${min} and ${max}</message>
</field-validator>
</field>

</validators>

在同一个校验规则文件中,可以混合使用<field>子元素和<validator>子元素定义校验规则,如上面例子所示。

当使用字段校验器时,基于字段校验去的语法总是优于基于validator校验器的语法,因为前者更容易根据字段组织字段校验器,特别是当一个字段需要多个字段校验器时更显得方便。

1.2.5校验规则的搜索顺序

(1)校验规则文件的搜索顺序

Struts 2框架将首先搜索Actionname-validation.xml文件,然后搜索Actionname-actionAlias-validation.xml文件。因此,如果两个校验规则文件中的校验规则有重复时,则校验规则将重复执行。

另外,如果在定义某业务控制器类(如BookAction)时,继承了BookParentAction类,同时实现了IBookAction接口。这时校验规则文件的搜索顺序如下:

① IBookAction-validation.xml

② IBookAction-actionAlias-validation.xml

③ BookParentAction-actionAlias-validation.xml

④ BookParentAction-actionAlias-validation.xml

⑤ BookAction-actionAlias-validation.xml

⑥ BookAction-actionAlias-validation.xml

(2)校验规则文件中校验器的搜索顺序

在同一校验规则文件中,既可以定义基于字段的校验规则,又可以定义基于validator校验器的校验规则。那么同一个校验规则文件中,Struts
2框架将按照如下的顺序运行校验:

① 使用<validator>定义的校验器优先于使用<field>定义的校验器;

② 如果都是使用<validator>定义的校验器,则按照校验器的定义顺序进行校验;

③ 如果都是使用<field>定义的校验器,则按照校验器的定义顺序进行校验;

④ 如果某个短路的校验器校验失败,则相同表单字段的后续校验器就不再执行校验。

Struts 2的输入校验需要经过以下几个步骤:
1、类型转换器负责对字符串的请求参数执行类型转换,并将这些值设置为Action的 属性值。2、在执行类型转换过程中可能出现异常,如果出现异常,将异常信息保存到ActionContext中。
conversionError拦截器负责将其封装到FieldError里,然后执行第三步;如果转换过程中没有异常信息,则直接进入第三步。
3、使用Struts 2应用配置的校验器进行输入校验
4、通过反射调用validateXxx()方法,其中Xxx是即将处理用户请求的处理逻辑所对应的方法。
5、调用Action类里的validate方法。
6、如果经过上面5步都没有出现FieldError,将调用Action里处理用户请求的处理方法;如果出现了FieldError,系统将会转入input逻辑视图所指定的视图资源。
流程如下:

2.客户端输入校验

2.1在Struts 2应用中使用客户端校验

对于客户端校验非常简单,只需改变如下两个地方:

Ø 将输入页面的表单元素全部改为使用Struts 2标签来生成表单。

Ø 为该<s:form..../>元素增加validate="true"属性。

1.
<%@ page contentType="text/html; charset=GBK" language="java" %>
2.
<%@ taglib prefix="s" uri="/struts-tags"%>
3.
<html>
4.
<head>
5.
<title>register</title>
6.
</head>
7.
<body>
8.
<s:form action="login" validate="true">
9.
<s:textfield name="username" label="用户名"/>
10.
<s:textfield name="pass" label="密码"/>
11.
<s:textfield name="repass" label="确认密码"/>
12.
<s:textfield name="age" label="年龄"/>
13.
<s:textfield name="high" label="身高"/>
14.
<s:textfield name="email" label="邮箱"/>
15.
<s:textfield name="website" label="个人主页"/>
16.
<s:textfield name="birthday" label="生日"/>
17.
<s:submit/>
18.
</s:form>
19.
</body>
20.
</html>

2.2 客户端校验支持的校验器

Ø required validator
必填校验器

Ø requiredstring validator必填字符串校验器

Ø stringlength validator字符串长度校验器

Ø regex validator正则表达式校验器

Ø email validator电子邮件校验器

Ø url validator网址校验器

Ø int validator整型校验器

Ø double validator
双精度校验器

对于客户端校验有三个地方需要注意:

Ø
Struts 2的<s:form.../>元素有一个theme属性,不要将该属性指定为simple。

Ø 浏览者不能直接访问启用客户端校验的表单页面,这样会引起异常。我们可以把启用客户端校验的表单页面放到WEB-INF路径下,让浏览者访问所有资源之间都先经过它的核心Filter

Ø 启动客户端校验的表单页面的action和namespace要分开写。

3.Ajax校验

4.Struts 2框架的内置校验器

Struts 2提供了大量的内建校验器,这些内建校验器可以满足大部分应用的校验需求。
在xwork-core-2.2.1.jar文件中的com\opensymphony\xwork2\validator\validators路径下的default.xml文件,该文件就是Struts 2默认的校验器注册文件。

[html] view plaincopyprint?
<validators>
1.
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
2.
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
3.
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
4.
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
5.
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
6.
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
7.
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
8.
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
9.
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
10.
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
11.
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
12.
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
13.
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
14.
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
15.
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
16.
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
17.
</validators>

通过上面可以发现,注册一个校验器只需要通过一个<validator.../>元素即可注册一个校验器,每一个<validator.../>元素的name属性指定该校验器的名字,class属性指定该校验器的实现类。
常用的内建校验器有:
名字
校验器名
说明
required
必填校验器
该校验器要求指定的字段必须有值
requiredstring
必填字符串校验器
该校验器要求字段值必须非空且长度大于0
int、long、short
整型校验器
该校验器要求字段的整数值必须在指定范围内
date
日期校验器
该校验器要求字段的日期值必须在指定范围内
expression
表达式校验器
非字段校验器,不可在字段校验器的配置风格中使用,它要求OGNL表达式返回true,当返回true时,该校验通过;否则未通过
fieldexpression
字段表达式校验器
该校验器要求指定字段满足一个逻辑表达式
email
电子邮件校验器
该校验器要求被检查字段的字符如果非空,则必须是合法的邮件地址
url
网址校验器
该校验器要求被检查字段的字符如果非空,则必须是合法的URL地址
visitor
Visitor校验器
该校验器主要用于检测Action里的复合属性
conversion
类型转换校验器
该校验器检查被校验的字段在类型转换过程中是否出现错误
stringlength
字符串长度校验器
该校验器要求被校验字段的长度必须在指定范围内
regex
正则表达式校验器
该校验器检查被校验字段是否匹配一个正则表达式
表1.常见的内建校验器
5.自定义校验器

使用自定义校验器主要有三个步骤:

(1)首先创建自定义校验器类

(2)然后注册自定义校验器类

(3)最后使用注册的自定义校验器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: