• 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.3appsstruts2-blankWEB-INFclassesexample 下的 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 的请求的验证规则就不要在这里配置了。

      

  • 相关阅读:
    漫谈grpc 3:从实践到原理,带你参透 gRPC
    有关CPU合并写的一个java小实验
    瞎几*把idea中的快捷键,整乱了,恢复默认快捷键
    python创建mysql数据库中文编码问题
    python2.x print打印不换行
    解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
    uniGUI学习之Cookie(54)
    博客园自定义标题背景颜色条【自用】
    亲测解决 github 访问慢的问题
    转: JVM规范系列第1章:引言
  • 原文地址:https://www.cnblogs.com/KnightKitt/p/3928847.html
Copyright © 2020-2023  润新知