验证框架
WebWork
提供了在
Action
执行之前Q对输入数据的验证功能,它用了其核?/span>
XWork
的验证框架。提供了如下功能Q?/span>
1?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
可配|的验证文g。它的验证文件是一个独立的
XML
配置文gQ对验证的添加、修改只需更改配置文gQ无需~译M?/span>
Class
?/span>
2?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
验证文g和被验证的对象完全解藕。验证对象是普通的
JavaBean
可以了Q可以是
FormBean
、域对象{)Q它们不需实现M额外的方法或l承额外的类?/span>
3?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
多种不同的验证方式。因为它验证功能是可以承的Q所以可以用多种不同的方式指定验证文Ӟ比如Q通过父类?/span>
Action
、通过
Action
、通过
Action
的方法、通过
Action
所使用的对象,{等?/span>
4?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
强大的表辑ּ验证。它使用?/span>
OGNL
的表辑ּ语言Q提供强大的表达式验证功能?/span>
5?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
同时支持服务器端和客L验证?/span>
下面我们来看看如何ؓ用户注册d验证功能Q?/span>
1?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
注册我们的验证类?/span>
WebWork
Z同的验证要求提供不同的验证类型。一个验证类型,一般是有一个类来提供。这个类必须实现接口Q?/span>
com.opensymphony.xwork.validator.Validator
Q但我们在写自己的验证类型时Q无需直接实现
Validator
接口Q它有抽象类可供直接使用?/span>
ValidatorSupport
?/span>
FieldValidatorSupport
{?/span>
验证cd在用之前,必须要在
ValidatorFactory
Q?/span>
com.opensymphony.xwork.validator
. ValidatorFactory
Q中
注册。可以有二种Ҏ实现验证cd的注册。一、写E序代码q行注册Q它使用
ValidatorFactory
cȝ静态方法:
registerValidator(String name, String className)
?/span>
二、用配|文?/span>
validators.xml
q行注册Q要求把文g
validators.xml
攑ֈ
ClassPath
的跟目录中(
/WEB-INF/classes
Q。但在实际开发中Q一般都使用W二中注册方法。我们的验证cd注册如下Q?/span>
<validators>
<validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
</validators>
注册验证cd的配|文仉常简单。它使用标签
<validator
>
提供名-值对的Ş式注册。这h们的验证文g可以直接引用它的名字?/span>
2?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
开?/span>
Action
的验证功?/span>
如果
Action
要用验证框架的验证功能Q它必须在配|文件中指定拦截器?/span>
validation
”,它的定义如下Q?/span>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
?/span>
我们的验证文件必M
ActionName-validation.xml
格式命名Q它必须被放|到与这?/span>
Action
相同的包中。你也可以ؓq个
Action
通过别名的方式指定验证文Ӟ它的命名格式为:
ActionName-aliasname-validation.xml
。?/span>
ActionName
”是我们
Action
的类名;?/span>
aliasname
”是我们在配|文Ӟ
xwork.xml
Q中定义q个
Action
所用到的名U。这P同一?/span>
Action
c,在配|文件中的不同定义就可以对应不同的验证文件。验证框架也会根?/span>
Action
的承结构去查找
Action
的父c验证文Ӟ如果扑ֈ它会L行这个父cȝ验证?/span>
3?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
实现我们的验证文Ӟ
RegisterActionSupport-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
<field name="user.username">
<field-validator type="requiredstring">
<message>You must enter a value for username.</message>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<message>You must enter a value for password.</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression">user.password == verifyPassword</param>
<message>Passwords don't match.</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="email">
<message>You must enter a valid email.</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">6</param>
<param name="max">100</param>
<message>Age must be between ${min} and ${max}, current value is ${user.age}.</message>
</field-validator>
</field>
</validators>
说明Q?/span>
1
Q?/span>
<field
>
标签代表一个字D,它的属性?/span>
name
”和面输入框的?/span>
name
”属性必需完全一_其实它也是我们的表辑ּ语言?/span>
2
Q?/span>
<field-validator
>
标签定义我们的验证规则,
type
属性的值就是就是我们前面定义的验证cd?/span>
3
Q、验证文件中Q字D늚数据是通过表达式语a从我们的值堆栈(
OgnlValueStack
Q中取得Q一般是
Action
?/span>
Model
对象。例如:我们的字D?/span>
user.age
”,它会通过
Action
?/span>
getUser().getAge()
来取得用戯入的q龄Q再来根据验证的cd?/span>
int
”和最大值最值的参数来判断输入的数据是否能通过验证?/span>
4
Q、不验证是否通过Q我们的
Action
都会执行Q但如果验证没有通过Q它不会调用
Action
?/span>
execute()
Ҏ?/span>
4?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">
昄
Action
的验证错误信?/span>
如果用户输入的数据验证没有通过Q我们需重新q回输入面Qƈl出错误信息提示。拦截器栈?/span>
validationWorkflowStack
”ؓ我们实现了这个功能。它首先验证用户输入的数据,如果验证没有通过不执行我们
Action
?/span>
execute()
ҎQ而是请求重新返回到输入面?/span>
我们?/span>
xwork.xml
配置文g如下Q?/span>
<action name="registerSupport" class="example.register.RegisterActionSupport">
<result name="success" type="dispatcher">
<param name="location">/register-result.jsp</param>
</result>
<result name="input" type="dispatcher">
<param name="location">/registerSupport.jsp</param>
</result>
<interceptor-ref name="validationWorkflowStack"/>
</action>
通过接口
ValidationAware
Q?/span>
我们可以获得cȝ别或字段U别的验证错误信息,q个错误信息也就是我们验证文件中
<message>
标签里的数据?/span>
ActionSupport
cd实现了此接口Q这样在应用中我们的
Action
只要l承
ActionSupport
cd可以了?/span>
RegisterActionSupport
.java
代码如下Q?/span>
package
example.register;
import
com.opensymphony.xwork.ActionSupport;
public
class RegisterActionSupport extends ActionSupport {
private User user= new User();
private String verifyPassword;
public User getUser(){
returnthis.user;
}
public String execute(){
//
在这里调用用h册的业务逻辑Q比如:注册信息存储到数据?/span>
return SUCCESS;
}
public String getVerifyPassword(){
returnthis.verifyPassword;
}
publicvoid setVerifyPassword(String verPassword){
this.verifyPassword = verPassword;
}
}
我们
WebWork
?/span>
UI
标签库直接提供了验证错误信息昄功能。如果字D别的验证没有通过Q它会在输入框上ҎC验证文件定义的错误提示信息。我们将用户输入的页面更改如下:
registerSupport.jsp
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head><title>Register Example</title></head>
<body>
<table border=0 width=97%>
<tr><td align="left">
<ww:form name="'test'" action="'/example/registerSupport.action'" method="'POST'">
<ww:textfield label="'Username'" name="'user.username'" required="true"/>
<ww:textfield label="'Password'" name="'user.password'" required="true"/>
<ww:textfield label="'VerifyPassword'" name="'verifyPassword'" required="true"/>
<ww:textfield label="'Email'" name="'user.email'" required="true"/>
<ww:textfield label="'Age'" name="'user.age'" required="true"/>
<ww:submit value="'Submit'"/>
</ww:form>
</td></tr>
</table>
</body>
</html>
我们上面的例子用的是服务器端验证?/span>
WebWork
也ؓ我们提供了方便的客户端验证。它验证自动生?/span>
JavaScript
脚本。如果要使用客户端验证只需改变相应的验证类型就可以了(输入面的表单必需使用
<ww:form>
标签Qƈ讄属性?/span>
validate="true"
”)。具体的验证cd可以?/span>
WebWork
的包
com.opensymphony.webwork.validators
中找到?/span>

]]>