验证框架
						
				
		
		
				WebWork
				提供了在
				Action
				执行之前,对输入数据的验证功能,它使用了其核心
				XWork
				的验证框架。提供了如下功能:
		
		
				1、   
				可配置的验证文件。它的验证文件是一个独立的
				XML
				配置文件,对验证的添加、修改只需更改配置文件,无需编译任何的
				Class
				。
		
		
				2、   
				验证文件和被验证的对象完全解藕。验证对象是普通的
				JavaBean
				就可以了(可以是
				FormBean
				、域对象等),它们不需实现任何额外的方法或继承额外的类。
		
		
				3、   
				多种不同的验证方式。因为它验证功能是可以继承的,所以可以用多种不同的方式指定验证文件,比如:通过父类的
				Action
				、通过
				Action
				、通过
				Action
				的方法、通过
				Action
				所使用的对象,等等。
		
		
				4、   
				强大的表达式验证。它使用了
				OGNL
				的表达式语言,提供强大的表达式验证功能。
		
		
				5、   
				同时支持服务器端和客户端验证。
		
		
		
				下面我们来看看如何为用户注册添加验证功能:
		
		
				
						1、   
				
				
						注册我们的验证类型
				
		
		
				WebWork
				为不同的验证要求提供不同的验证类型。一个验证类型,一般是有一个类来提供。这个类必须实现接口:
				com.opensymphony.xwork.validator.Validator
				,但我们在写自己的验证类型时,无需直接实现
				Validator
				接口,它有抽象类可供直接使用如
				ValidatorSupport
				、
				FieldValidatorSupport
				等。
		
		
				验证类型在使用之前,必须要在
				ValidatorFactory
				(
				com.opensymphony.xwork.validator
				. ValidatorFactory
				)中
				注册。可以有二种方法实现验证类型的注册。一、写程序代码进行注册,它使用
				ValidatorFactory
				类的静态方法:
				registerValidator(String name, String className)
				。
				二、使用配置文件
				validators.xml
				进行注册,要求把文件
				validators.xml
				放到
				ClassPath
				的跟目录中(
				/WEB-INF/classes
				)。但在实际开发中,一般都使用第二中注册方法。我们的验证类型注册如下:
		
		
				<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>
		
		
				注册验证类型的配置文件非常简单。它使用标签
				<validator
				>
				提供名-值对的形式注册。这样我们的验证文件就可以直接引用它的名字。
		
		
				
						2、   
				
				
						开启
				
				
						Action
				
				
						的验证功能
				
		
		
				 
				如果
				Action
				要使用验证框架的验证功能,它必须在配置文件中指定拦截器“
				validation
				”,它的定义如下:
		
		
				<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
				。
		
		
				我们的验证文件必须以
				ActionName-validation.xml
				格式命名,它必须被放置到与这个
				Action
				相同的包中。你也可以为这个
				Action
				通过别名的方式指定验证文件,它的命名格式为:
				ActionName-aliasname-validation.xml
				。“
				ActionName 
				”是我们
				Action
				的类名;“
				aliasname
				”是我们在配置文件(
				xwork.xml
				)中定义这个
				Action
				所用到的名称。这样,同一个
				Action
				类,在配置文件中的不同定义就可以对应不同的验证文件。验证框架也会根据
				Action
				的继承结构去查找
				Action
				的父类验证文件,如果找到它会去执行这个父类的验证。
		
		 
		
				
						3、   
				
				
						实现我们的验证文件:
				
				
						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>
		
		
				说明:
		
		
				1
				)、
				<field
				>
				标签代表一个字段,它的属性“
				name
				”和页面输入框的“
				name
				”属性必需完全一致,其实它也就是我们的表达式语言。
		
		
				2
				)、
				<field-validator
				>
				标签定义我们的验证规则,
				type
				属性的值就是就是我们前面定义的验证类型。
		
		
				3
				)、验证文件中,字段的数据是通过表达式语言从我们的值堆栈(
				OgnlValueStack
				)中取得,一般是
				Action
				或
				Model
				对象。例如:我们的字段“
				user.age
				”,它会通过
				Action
				的
				getUser().getAge()
				来取得用户输入的年龄,再来根据验证的类型“
				int
				”和最大值最小值的参数来判断输入的数据是否能通过验证。
		
		
				4
				)、不管验证是否通过,我们的
				Action
				都会执行,但如果验证没有通过,它不会调用
				Action
				的
				execute()
				方法。
		
		 
		
				
						4、   
				
				
						显示
				
				
						Action
				
				
						的验证错误信息
				
		
		
				如果用户输入的数据验证没有通过,我们需重新返回输入页面,并给出错误信息提示。拦截器栈“
				validationWorkflowStack
				”为我们实现了这个功能。它首先验证用户输入的数据,如果验证没有通过将不执行我们
				Action
				的
				execute()
				方法,而是将请求重新返回到输入页面。
		
		
				我们的
				xwork.xml
				配置文件如下:
		
		
				<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
				,
				我们可以获得类级别或字段级别的验证错误信息,这个错误信息也就是我们验证文件中
				<message>
				标签里的数据。
				ActionSupport
				类已实现了此接口,这样在应用中我们的
				Action
				只要继承
				ActionSupport
				类就可以了。
				RegisterActionSupport
				.java
				代码如下:
		
		
				
						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(){
		
		
				        //
				在这里调用用户注册的业务逻辑,比如:将注册信息存储到数据库
		
		
				        return SUCCESS;
		
		
				    }
		
		 
		
				    public String getVerifyPassword(){
		
		
				        returnthis.verifyPassword;
		
		
				    }
		
		
				    
		
		
				    publicvoid setVerifyPassword(String verPassword){
		
		
				        this.verifyPassword = verPassword;
		
		
				    }
		
		
				}
		
		
				我们
				WebWork
				的
				UI
				标签库直接提供了验证错误信息显示功能。如果字段级别的验证没有通过,它会在输入框上方显示验证文件定义的错误提示信息。我们将用户输入的页面更改如下:
		
		
				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>
		
		
				我们上面的例子使用的是服务器端验证。
				WebWork
				也为我们提供了方便的客户端验证。它将验证自动生成
				JavaScript
				脚本。如果要使用客户端验证只需改变相应的验证类型就可以了(输入页面的表单必需使用
				<ww:form>
				标签,并设置属性“
				validate="true"
				”)。具体的验证类型可以在
				WebWork
				的包
				com.opensymphony.webwork.validators
				中找到。
		
	posted on 2006-12-14 19:13 
周锐 阅读(301) 
评论(0)  编辑  收藏  所属分类: 
Webwork