当前位置:编程学习 > JAVA >>

使用Struts2实现多字段验证

一个健壮的 web 应用程序必须确保用户输入是合法、有效的. 
Struts2 提供了一些基于 XWork Validation Framework 的内建验证程序. 使用这些验证程序不需要编程, 只要在一个 XML 文件里对验证程序应该如何工作作出声明就可以了. 需要声明的内容包括: 
①.哪些字段需要进行验证
②.使用什么验证规则
③.在验证失败时应该把什么样的出错消息发送到浏览器端
Struts2的验证步骤:
1). 编辑一个验证的配置文件: 
①. 它的文件名必须是以下两种格式之一: 
> 若一个 Action 类的多个 action 使用同样的验证规则: ActionClass-validation.xml
> 若一个 Action 类的多个 action 使用不同的验证规则: ActionClass-alias-validation.xml, 其中 alias 为对应请求的 action 节点的 name 属性值
例如 UserAction-User_create-validation.xml 
②. 编写验证规则: 参考 struts-2.3.4/docs/WW/validation.html
   <field name="name">
        <field-validator type="requiredstring">
            <message key="requiredstring"/>
        </field-validator>
    </field>
2). 指定验证出错对应的响应页面: 为该 Action 指定 name=input 的一个 result 节点.
但是Struts2的输入验证没有提供对同一个表单的不同字段之间的验证,例如
Struts2在验证Name和Email字段不能为空时,需要为Name和Email配置两个验证:
验证Name不能为空:
<field name="name">
<field-validator type="requiredstring">
<message key="requiredstring" />
</field-validator>
</field>
验证Email不能为空:
<field name="email">
<field-validator type="requiredstring">
<message key="requiredstring" />
</field-validator>
</field>
这样其实是很麻烦的,那么能不能一个配置验证多个字段呢?
比如这样配置:
<validator type="requiredStrings">
<param name="fieldName">name,email</param>
<message key="requires"></message>
</validator>
怎样实现同时验证name,和email不能为空?
通过阅读Struts2源码,我们发现,Struts2的非空验证是com.opensymphony.xwork2.validator.validators.RequiredFieldValidator的validate()方法来实现的,那么我们就来写一个具有同样功能,而且可以验证多个字段的验证器
public class FieldsRequiredStringValidator extends ValidatorSupport implements FieldValidator {
//定义一个fieldNames变量,用于存放需要验证的字段
private String fieldNames;
//定义fieldName
private String fieldName;
    public void setFieldName(String fieldName) {
        this.fieldNames = fieldName;
    }
    public String getFieldNames() {
        return fieldNames;
    }
    public String getFieldName() {
        return fieldName;
    }
@Override
public void validate(Object object) throws ValidationException {
        
        String fieldNames = getFieldNames();
        for(String fieldName: fieldNames.split(",")){
        //取出字段对应的值
        Object value = this.getFieldValue(fieldName, object);
        this.fieldName = fieldName;
        if (!(value instanceof String)) {
        addFieldError(fieldName, object);
        } else {
        String s = (String) value;
        
        if (s != null) {
        s = s.trim();
        }
        
        if (s.length() == 0) {
        addFieldError(fieldName, object);
        }
        }
        } 
}
}
看完这个程序有些兄弟可能会问了,为什么要写fieldName和fieldNames这两个属性,还有setNFieldName()方法中为什么将fieldName的值赋值给fieldNames?这是因为我们在配置文件上写的<param name="fieldName">name,email</param>,而在Struts2中是通过setFieldName这个方法将name,email传递给fieldName的,那么在我们的这个程序中为什么要将fieldName的值赋给fieldNames呢?这个你再读下面的程序也许就能明白,我们需要一个另外(不是fieldName)的属性来暂存name,email这个值。然后取出name和email这两个字段名,再分别对他们的字段值进行验证。那么为什么要有public String getFieldName()这个方法呢?那是因为将name,email等属性放入栈中时需要调用getXXX()方法来获取这些属性。(好像扯远了耶)
还是回到我们这个多字段验证中,验证器写完了,怎样来使用它呢?
像所有的自定义验证器一样,首先我们需要配置自定义验证器
* 自定义验证器需要在类路径里的某个 validators.xml 文件里注册:  
验证框架首先在根目录下找validators.xml文件,没找到validators.xml文件, 验证框架将调用默认的验证设置,即default.xml里面的配置信息,因此我们需要在validators.xml中对自定义的验证器进行注册:
validators>
    <validator name="requiredStrings" class="net.lampbrother.actions.FieldsRequiredStringValidator"/>
</validators>然后再资源文件中写上对应的资源:
name=姓名
email = 邮箱
requires=%{getText(fieldName)}不能为空
OK!我们自定义的多字段验证器完工了。你看明白了吗?
struts 多字段 验证 --------------------编程问答-------------------- mark下,存着。。。 --------------------编程问答-------------------- 不过一般这种事无须程序员做 --------------------编程问答-------------------- 我也mark一下··· --------------------编程问答-------------------- 我做android开发的时候,会写java代码验证用户输入的数据,
但做java web的时候,这东西没啥意义,随手写点js就够了,
就一个增删改查,也要整的这么复杂,不是闲的蛋疼,就是折磨自己吧! --------------------编程问答--------------------
存着 --------------------编程问答-------------------- 校验框架。一般是前台处理好的。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,