`

2.1、Struts2数据验证

 
阅读更多
进行数据验证的action的执行流程:
    当Client端发送请求给Server端时,首先将请求中的参数转换action中的字段,然后执行action中的validate方法
    当action中的fielderror 或 actionerror为空时,才会执行execute方法,否则不会执行execute方法.
  
struts2中两种数据验证框架是:
1.通过重写ActionSupport类中的validate方法进行验证或在调用的方法中直接验证
2.通过数据验证框架进行验证

a.用validate进行数据验证:
    这种验证方法相对于第二种方法来说比较灵活,通过判断actionerror和fielderror中内容来判断是否验证成功。
    假如fielderror 或者 actionerror有一个不是空的集合,就会跳转到当先action 的 result中 name="input"所对应的页面。
实例:
在validate.jps中有一个form,当提交后会给ValidateAction处理,假如username的长度小于4或者大于6就会将错误加入到fielderror中,并且跳转到input对应的页面,否则就会叫转到success对应的页面.
validate.jsp 部分源码
<body>
    <center>
        <s:fielderror value="username"/>
	<form action="validate" method="get">
	    username:
	    <input type="text" name="username"/>
	    <br/>
	    <input type="submit" value="validate"/>
	</form>
    </center>
</body>


struts.xml中的配置
<action name="validate" class="ValidateAction">
    <result name="success">validateresult.jsp</result>
    <result name="input">validate.jsp</result>
</action>


ValidateAction类部分源码
@SuppressWarnings("serial")
public class ValidateAction extends ActionSupport{
    private String username;
    private String password;
    private String repassword;
    private Date birthday;
    private Date graduation;
    //setXXX getXXX省略
    @Override
    public String execute() throws Exception {
	return "success";
    }
    @Override
    public void validate() {
	if(username.length() < 4 || username.length() > 6) {  
	    this.addFieldError("username", "the length of username should between 4 and 6");
	}
    }	
}


b.通过数据验证框架验证
    这种验证方法是通过一个配置文件自动的进行数据校验,配置文件的命名规则是‘action的名字''-''validation.xml'.
    在与XXXAction同级的目录下,建立配置文件,即为该Action的校验逻辑。该校验XML的dtd格式文件为  http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd

数据校验XML的根元素<validator>下面可以包含两种 子元素:field和validator
1、前者field     是针对字段进行的校验;
2、后者validator 是非字段或者说全局范围的校验。
在介绍完校验是怎么回事后,后面会简单比较一下两种校验方式的区别。

一、字段校验:(field)
<?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">
            <message key="error.username.required"/>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="stringlength">
            <param name="trim">true</param>
            <param name="minLength">4</param>
            <param name="maxLength">10</param>
            <message>password should be ${minLength} to ${maxLength} characters long.</message>
        </field-validator>
     </field>
     <!--
     如果使用DomainModel方式接受表单数据,则为如下形式
     <field name="user.username">
     -->
</validators>

有几个地方需要注意一下的。

1、field-validator的type在哪里定义的?
struts2校验框架预设的类在包com.opensymphony.xwork2.validator.validators中,同一目录下的default.xml中定义了field-validator中type的名称和对应的处理类。
<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
</validators>

其中,name是上面type需要引用的名字,而后面的class则是这些validator对应的类。这些类中大部分都是自解释的,其中fieldexpression比较特殊,它提供了一种多个field之间比较值的机制。

2、param的值又是在哪里找到的呢?
param中的name值在上述类中被定义为属性。譬如说在类com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是stringLength对应的处理类),就定义了
boolean trim;
int minLength,maxLength;
及它们的get/set方法。

3、message的注意事项
(1)每个field都必须拥有一个message;message错误信息最后是以addFieldError实现的,也就是说是field一级的错误。
(2)message中可以引用param变量,引用格式为${param1},如上面的例子中对password验证失败的报错信息。
(3)message的内容可以放到全局i18n属性文件中,并在message中以key属性值指定,比如上面例子中对username验证失败的报错信息。

二、非字段校验/全局校验
全局校验和字段校验其实类似,使用的验证器也是那些。区别在于校验的方式和关注点不同:
1、字段校验先指定那个字段要校验,再指定用那些校验器来校验该字段;
2、全局校验不针对特定字段,先指定验证器,再来指定用该校验器校验那些字段。
<validators>

    <validator type="requiredstring" short-circuit="true">
        <param name="fieldName">username</param>
        <message key="error.field.required"/>
    </validator>
     <validator type="stringlength">
        <param name="trim">true</param>
        <param name="minLength">4</param>
        <param name="maxLength">10</param>
        <param name="fieldName">password</param>
        <message>password should be ${minLength} to ${maxLength} characters long.</message>
     </validator>        

</validators>


示例很简单,第一个validator是校验“不为空的字符串”,校验“用户名字段,第二个校验器校验“字符串长度6-10”,校验“密码两个字段。

很明显,如果页面中存在一些共性的验证要求,用这种方式就比针对字段的验证要方便。但这种方式可能不如前一种方式清晰易读。
上面这段话是错误的。
我原以为第二种验证器优先的方式可以一次验证多个field,但经验证struts(ver2.1.6)并不支持多个field的批量验证,只能一个一个写,比较遗憾。
两种验证方式可以混用。

三、其他问题
1、对多验证和跳转逻辑的支持
和《Struts2 数据输入校验(1) —— 函数验证 》中所说内容一样,校验框架也支持多验证和跳转逻辑。比如说在struts.xml文件中配置了
<action name="XXXAction" class="com.myspace.myname.XXXAction" method="newExcuteName">
      <result>success.jsp</result>
</action>
则校验文件的名字为XXXAction-newExcuteName-validation.xml
当然,在执行了上面的校验之后,如果存在XXXAction-validation.xml,则还会执行这个文件中定义的校验。

同时需要注意的是,如果该Action存在父类,则会先行执行父类的相应校验。

2、客户端校验
客户端校验是不安全的,但struts仍然提供了客户端的校验
方法是在<s:form>中设置validate属性为true,如果该属性被设置,则struts不会在服务器端验证,取而代之的是在客户端生成Javascript代码。但这些Js代码功能较弱,灵活度也比较低,且不会刷新。因此不推荐使用。
其实struts的控件本身和一般的HTML控件一样,如果想做客户端验证,可以触发它们的onXXX()事件,和通常的HTML页面做法一样。
分享到:
评论

相关推荐

    Struts2 in action中文版

    10.3.2 使用自定义数据验证器 229 10.4 验证框架的高级主题 230 10.4.1 在域对象级别验证 231 10.4.2 使用验证上下文优化验证 233 10.4.3 验证继承 235 10.4.4 验证短路效应 236 10.4.5 使用注解声明验证 237 10.5 ...

    struts2讲义_吴峻申

    5.7 Struts2自定义标签实现图形验证功能 121 第6章 Struts2非JSP视图技术 125 6.1 velocity视图技术使用介绍 125 6.2 freemarker视图技术使用介绍 128 6.3 JasperReports报表视图技术使用介绍 130 第7章 Struts2类型...

    深入浅出Struts2(附源码)

    作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听...

    struts2.1+spring2+hibernate3简单的增删查改,分页查询,还有国际化,数据验证框架等

    因为上传时文件不能大于15MB,所以我删掉了一些jar包,要是出错了,请自己添加jar包,但是源码是不会出错的。

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    (2.0版本)自己写的struts2+hibernate+spring实例

    主要是为了引入时间等字段,来试验一下struts2的时间标签是否好用.这次为了做成一个好点的实例.所以换掉了表结构.为歌词表.并附带2万首歌词的数据库.因为歌词插入数据太大.所以单另上传了.如果不需要这两万条数据的...

    低清版 大型门户网站是这样炼成的.pdf

    2.1 初识mvc新秀struts 2 33 2.1.1 mvc概述 33 .2.1.2 struts 2的mvc实现 35 2.1.3 struts 2的基本组成 36 2.1.4 struts 2的常用类介绍 38 2.1.5 struts 2的业务控制器action实现 39 2.1.6 struts 2的处理...

    structs程序设计从入门到精通word文档

    2.1人介绍应用框架 mvc和model2 8 2.2 Struts原理、开发及项目实施 8 2.3使用STRUST控制流 8 2.4讨论STRUTS的优缺点 9 2.5 Struts入门经验 9 2.6用strtus制作登陆页面: 9 第3章Struts 基础学习 9 3.1Struts标记库 9...

    Eclipse开发入门与项目实践 源代码

    案例5-6 使用Validator验证框架实现注册表单的数据验证 201 5.4.4 Struts标记库 206 案例5-7 采用Struts标记库实现身份验证应用相关页面 207 第6章 Eclipse中Hibernate的开发 211 6.1 Hibernate概述 211 ...

    AnyFo - Struts 2_1爆胎易筋丸.pdf

    5 数据验证...........................................................................................................................14 5.1 validate 方法验证..............................................

    JAVA WEB典型模块与项目实战大全

    第20章 数据格式转换(struts 2.x+hibernate+dom4j)  20.1 关于xml文件基础知识  20.2 下载dom4j  20.3 数据格式转换功能前期准备  20.4 数据格式转换功能具体开发  20.5 多学两招——其他操作xml文件...

    java web技术开发大全(最全最新)

    提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例和4...

    Spring in Action(第二版 中文高清版).part2

    16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

    java web开发技术大全

    提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例...

    Spring in Action(第2版)中文版

    16.2协同使用spring和webwork2/struts2 16.3集成spring和tapestry 16.3.1集成spring和tapestry3 16.3.2集成spring和tapestry4 16.4协同使用spring和jsf 16.4.1解析jsf管理的属性 16.4.2解析springbean 16.4.3...

    JSP实习报告完美版

    2.1 数据库新技术 3 2.2 物联网技术 3 2.3 不确定数据管理 4 2.4 非PC\Windows下的计算机应用 4 3. 企业参观体会 6 4. 基于JSP的美文欣赏查询系统设计与实现 8 4.1 系统需求分析 8 4.1.1 用例分析 8 4.1.2 数据逻辑...

    Spring in Action(第二版 中文高清版).part1

    16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...

Global site tag (gtag.js) - Google Analytics