首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

WebWork课程-validator

2012-12-18 
WebWork教程-validator验证框架WebWork 提供了在 Action 执行之前,对输入数据的验证功能,它使用了其核心 X

WebWork教程-validator
验证框架
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" "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" 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 中找到。

热点排行