Struts2的输入验证(一)-声明式验证之字段验证

一、概述

Struts2 的输入验证分为两种方式

1)基于 XWork Validation Framework 的声明式验证:Struts2 提供了一些基于 XWork Validation Framework 的内建验证程序,使用这些验证程序不需要编程,只要在一个 XML 文件里对验证程序应该如何工作作出声明就可以了。需要声明的内容包括:

>对哪个 Action 或 Model 的那个字段进行验证;

>使用什么验证规则;

>在验证失败时应该把什么样的出错消息发送到浏览器端。

2)编程式验证:通过编写代码来验证用户输入。

其中声明式验证程序可以分为两类:

1)字段验证:判断某个字段属性的输入是否有效。
 

2)非字段验证:不只针对某个字段,而是针对多个字段的输入值之间的逻辑关系进行校验。例如:对再次输入密码的判断。

二、声明式验证的HelloWord

1、示例一:字段验证

  1)JSP页面主要代码(JSP页面名称为:validation.jsp)如下:

1 <!-- 要求年龄必须在 20-60 之间 -->
2 <s:form action="testValidation" theme="simple">
3     Age: <s:textfield name="age" label="Age"></s:textfield> 
4     ${fieldErrors.age[0] }
5     <s:fielderror fieldName="age"></s:fielderror>
6     <s:submit></s:submit>
7 </s:form>

  2)Action类的代码如下:

 1 package com.atguigu.struts2.validation.app;
 2 import com.opensymphony.xwork2.ActionSupport;
 3 public class TestValidationAction extends ActionSupport {
 4     private Integer age;
 5     public Integer getAge() {
 6         return age; 
 7     }
 8     public void setAge(Integer age) {
 9         this.age = age;
10     }
11     public String execute() throws Exception {
12         System.out.println("age: " + age);
13         return SUCCESS;
14     }
15 }

  3)struts.xml中的基本配置如下: 

<action name="testValidation" class="com.atguigu.struts2.validation.app.TestValidationAction">
    <result>/success.jsp</result>            
    <!-- 若验证失败转向的 input -->
    <result name="input">/validation.jsp</result>
</action>

  4)★★★编写验证程序配置文件,其名称为:TestValidationAction-validation.xml,配置内容如下:

<validators>
    <!-- 针对 age 属性进行验证. 基于字段的验证 -->
    <field name="age">
        <field-validator type="int">
            <param name="min">20</param>
            <param name="max">60</param>
            <message>Age needs to be between ${min} and ${max}</message>
        </field-validator>
    </field>
</validators>

  在Tomcat中部署后的运行结果如下图:

(由于在JSP页面中分别使用了EL表达式 ${fieldErrors.age[0] }和标签 <s:fielderror fieldName="age"></s:fielderror>输出验证失败的消息,因此会有两个提示信息。):

  

2、HelloWord总结

1)使用一个声明式验证程序的步骤★★★

Ⅰ. 先明确对哪一个 Action 的哪一个字段进行验证: age

Ⅱ. 编写一个验证程序配置文件

> 把 struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example 下的 Login-validation.xml 文件复制到当前 Action 所在的包下;

> 修改该配置文件的名称:把 Login 改为当前 Action 的名字; 

> 编写验证规则:参见 struts-2.3.15.3/docs/WW/docs/validation.html 文档即可;

> 在配置文件中可以定义错误消息,如下格式: 

<field name="age"><!--需验证的字段名称-->
  <field-validator type="int">
    <param name="min">20</param>
    <param name="max">50</param>
    <message>Age needs to be between ${min} and ${max}</message>
  </field-validator>
</field>

图解:

Ⅲ. 确定验证失败时的响应页面:若验证失败,则转向 name=input 的那个 result,所以需要配置在 struts.xml 文件中定义一个 <result name=“input”> 的元素。


2)验证错误错误消息可以国际化吗?

可以,方法如下:

Ⅰ. 将验证程序配置文件中的<message>节点中添加key属性:<message key="error.int"></message>

Ⅱ. 再在国际化资源文件中加入一个键值对:error.int=Age needs to be between ${min} and ${max} 。

3)如何显示错误消息呢 ?

> 若使用的是非simple主题,则自动显示错误消息。

> 若使用的是simple 主题,则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)

${fieldErrors.age[0] }  OR <s:fielderror fieldName="age"></s:fielderror>

三、若一个 Action 类可以应答多个 action 请求, 多个 action 请求使用不同的验证规则, 怎么办 ?

 1、示例:

  要求:同一个Action类响应两个action请求,每个action请求都对age字段进行验证,但是age的范围不一样

  1)JSP页面一个与HelloWord中的相同,另一个的form的action路径改为:testValidation2。

  2)Action代码与HelloWord中相同。

  3)struts.xml配置文件中添加一个action节点,其name属性值为:testValidation2,其它与HelloWord中testValidation相同。

  4)★★★编写验证程序配置文件:每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName-validation.xml,因此,两个action请求对应的文件名分别为:TestValidationAction-testValidation-validation.xml 和 TestValidationAction-testValidation2-validation.xml。

  5)配置文件的内容:

  >TestValidationAction-testValidation-validation.xml的内容与HelloWorld中的相同(修改为国际化后的格式);

  >TestValidationAction-testValidation2-validation.xml的内容中要求age的范围是“1~130”。  

<validators>      
    <!-- 针对 age 属性进行验证. 基于字段的验证 -->
     <field name="age">
         <field-validator type="int">
             <param name="min">1</param>
             <param name="max">130</param>
             <message key="error.int"></message><!--对验证失败消息进行国际化处理-->
         </field-validator>
     </field>          
</validators>

  因此部署后运行,当验证失败时,两个action分别对应各自的提示消息。

2、总结:验证程序配置文件的格式★★★

验证程序配置文件的文件名必须是以下两种格式之一:

>若一个 Action 类的多个 action 请求使用同样的验证规则: ActionClassName-validation.xml

>若一个 Action 类的多个 action 请求使用不同的验证规则: ActionClassName-alias-validation.xml, 例如 UserAction-User_create-validation.xml

注意:不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用。 可以把各个 action 公有的验证规则配置在其中,但需要注意的是,只适用于某一个 action 的请求的验证规则就不要在这里配置了。

  

posted @ 2014-08-22 16:12  KnightKitt  阅读(503)  评论(0编辑  收藏  举报