Struts2框架xml验证

2023-11-09

struts2框架验证(xml方式)

  • 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法

    • 创建一个xml格式验证文件:

      • 命名方式:ActionClassName-validation.xml,ActionClassName指的是动作类action的名称
      • 标签:根元素
      • field:指定action中要校验的属性,实际上就是页面中表单的name属性的值
        • name:指定页面中表单的name属性的值
      • field-validator:指定验证规则
        • type:指定验证规则名称,
          struts2框架提供的验证规则放在xwork-core-xxx.jar
          下的com\opensymphony\xwork2\validator\validators
          的default.xml配置文件。
      • param:向底层的验证规则传递的参数
      • message:验证失败时,提供的错误提示信息
    • 如果要对指定方法进行验证的话:

      • xml验证文件的命名方式:ActionClassName-ActionName-validation.xml,
        ActionName对应的是struts.xml文件对应的action标签的name属性的值

基于XML配置方式实现输入校验

1、建立Jsp页面,定义需求

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>    
    <title>My JSP 'login.jsp' starting page</title>
  </head>
  <body>xml页面
  <br>
      <s:fielderror/>
      <s:form name="loginForm" method="post" namespace="/validate"  
              action="validateXmlAction_login.action" theme="simple" >
         <table border="1">
           <tr>
              <td>用户名</td>
              <td> <s:textfield name="username" /></td>
           </tr>
           <tr>
              <td>密码</td>
              <td><s:password name="psw" /></td>
           </tr>
            <tr>
              <td>年龄(不能小于0)</td>
              <td> <s:textfield name="age" /></td>
           </tr>
           <tr>
              <td>&nbsp;</td>
              <td><s:submit value="登陆"/></td>
           </tr>
         </table>
     </s:form>

     <a href="${pageContext.request.contextPath}/validate/validateXmlAction_test.action">test其他的方法</a>
  </body>

</html>

这里写图片描述

2、定义Action

要继承ActionSupport或者实现Validateable接口:
package cn.itcast.validate;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class ValidateXmlAction extends ActionSupport {

    private String username;

    private String psw;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPsw() {
        return psw;
    }

    public void setPsw(String psw) {
        this.psw = psw;
    }

    public String login(){
        System.out.println("ValidateXmlAction ********** login()");
        return "success";
    }

    public String test(){
        System.out.println("ValidateXmlAction ********** test()");
        return "success";
    }

}

3、配置struts_validate.xml文件

验证出错转向的页面
<action name="validateXmlAction_*" class="cn.itcast.validate.ValidateXmlAction" method="{1}">
            <result name="success">/validate/success.jsp</result>
            <result name="input">/validate/loginxml.jsp</result>
        </action>

4、配置验证的xml文件

  • 验证的xml文件的规范在xwork-core-2.1.6.jar包下的:xwork-validator-1.0.3.dtd
  • 验证文件的命名
    • 在这个校验文件中,对action中字符串类型的username属性进行验证, 首先要求调用trim()方法去掉空格,然后判断用户名是否为空。
    • 该文件需要和action类放在同一个包下,文件的取名应遵守
      ActionClassName-validation.xml规则,其中ActionClassName为action的简单类名,-validation为固定写法。
    • 例如:如果Action类为cn.itcast.validate.ValidateXmlAction.
      那么该文件的取名应为:ValidateXmlAction-validation.xml
  • 如果要对指定方法进行验证的话:
    • xml验证文件的命名方式:ActionClassName-ActionName-validation.xml,ActionName对应的是struts.xml文件对应的action标签的name属性的值
    • ValidateXmlAction-validateXmlAction_login-validation.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <!-- 
        field:指定action中要校验的属性
            * name:指定将被验证的表单字段的名字
     -->
    <field name="username">
        <!-- 
            field-validator:指定验证规则
                * type:指定验证规则的名称
         -->
        <field-validator type="requiredstring">
            <!-- 
                param:向验证器传递的参数
                    * requiredstring验证器的参数是"trim",设置为"true"的作用是去空格
             -->
            <param name="trim">true</param>
            <!-- 
                message:验证失败时,提示的错误信息
                    * <![CDATA[]]>:保证按原文输出
                    * 里面的文本:错误提示信息
             -->
            <message><![CDATA[用户名不能为空!]]></message>
        </field-validator>
    </field>
    <field name="psw">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message><![CDATA[密码不能为空!]]></message>
        </field-validator>
        <!-- 使用正则表达式验证规则来做"regex" -->
        <field-validator type="regex">
            <param name="trim">true</param>
            <param name="regex"><![CDATA[^[0-9a-zA-Z]{6,12}$]]></param>
            <message><![CDATA[密码的长度必须在6至12之间!]]></message>
        </field-validator>
    </field>
</validators>
<validators>: 根元素
<field>:指定action中要校验的属性,name属性指定将被验证的表单字段的名字
<field-validator>:指定校验器, type 指定验证规则
     上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求
      的校验器,这些校验器的定义可以在xwork-2.x.jar中的
      com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<param>:子元素可以向验证程序传递参数
<message>:子元素为校验失败后的提示信息,如果需要国际化,可以为message
                   指定key属性,key的值为属性文件中的key。

这里写图片描述
这里写图片描述
这里写图片描述

Struts2 内建的验证程序

  • required: 确保某给定字段的值不是空值 null
  • requiredstring: 确保某给定字段的值既不是空值 null, 也不是空白.
    • trim 参数. 默认为 true, 表示 struts 在验证该字段值之前先剔除前后空格.
  • stringlength: 验证一个非空的字段值是不是有足够的长度.
    • minLength: 相关字段的最小长度. 若没有给出这个参数, 该字段将没有最小长度限制
    • maxLength:相关字段的最大长度. 若没有给出这个参数, 该字段将没有最大长度限制
    • trim: 在验证之前是否去除前后空格
  • int: 检查给定字段的值是否可以被转换为一个整数
    • min: 相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制
    • max: 相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
  • date: 确保某给定日期字段的值落在一个给定的范围内
    • max:相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
    • min:相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制
  • email: 检查给定 String 值是否是一个合法的 email
  • url: 检查给定 String 值是否是一个合法的 url
  • regex: 检查某给定字段的值是否与一个给定的正则表达式模式相匹配.
    • expresssion*: 用来匹配的正则表达式
    • caseSensitive: 是否区分字母的大小写. 默认为 true
    • trim: 是否去除前后空格. 默认为 true
  • conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
    visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)
  • expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)
  • double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

校验器案例

required  必填校验器
<field-validator type="required">
       <message>性别不能为空!</message>
</field-validator>

requiredstring  必填字符串校验器
<field-validator type="requiredstring">
       <param name="trim">true</param>
       <message>用户名不能为空!</message>
</field-validator>

stringlength:字符串长度校验器
<field-validator type="stringlength">
    <param name="maxLength">10</param>
    <param name="minLength">2</param>
    <param name="trim">true</param>
    <message><![CDATA[产品名称应在2-10个字符之间]]></message>
</field-validator>

int:整数校验器
<field-validator type="int">
    <param name="min">1</param>
    <param name="max">150</param>
    <message>年龄必须在1-150之间</message>
</field-validator>

字段OGNL表达式校验器
<field name="imagefile">
    <field-validator type="fieldexpression">
        <param name="expression"><![CDATA[imagefile.length() <= 0]]></param>
        <message>文件不能为空</message>
    </field-validator>
</field>

基于XML配置方式对指定action方法实现输入校验

当校验文件的取名为ActionClassName-validation.xml时,会对 action中的所有处理方法实施输入验证。如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称。例如:在实际应用中,常有以下配置:

<action name="user_*" class="cn.itcast.action.UserAction" method="{1}">
    <result name="success">/WEB-INF/page/message.jsp</result>
    <result name="input">/WEB-INF/page/addUser.jsp</result>
</action>

UserAction中有以下两个处理方法:
public String add() throws Exception{
….
}
public String update() throws Exception{
….
}
要对add()方法实施验证,校验文件的取名为: UserAction-user_add-validation.xml
要对update()方法实施验证,校验文件的取名为: UserAction-user_update-validation.xml

基于XML校验的一些特点

当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:
1。AconClassName-validation.xml
2。ActionClassName-ActionName-validation.xml
系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于处理方法的校验。如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则。

当action继承了另一个action,父类action的校验文件会先被搜索到。假设UserAction继承BaseAction, UserAction在struts.xml的配置如下:

<action name="user" class="cn.itcast.action.UserAction" method="{1}">
    .....
</action>

访问上面名为user的action,系统先搜索到BaseAction-validation.xml, BaseAction-user-validation.xml,接着搜索到UserAction-validation.xml, UserAction-user-validation.xml。校验规则是这四个文件的总和。

自定义验证规则

  • 自定义验证程序必须实现 Validator 接口.
  • Validation 拦截器负责加载和执行各种验证程序. 在加载了一个验证程序之后, 这个拦截器将调用那个验证程序的
    setValidatorContext 方法, 把当前的 ValidatorContext 对象传递给它, 这使程序员可以访问当前
    Action. 接下来, Validation 拦截器将调用 validate 方法并把需要验证的对象传递给它. validate
    方法是编写一个自定义的验证程序时需要覆盖的方法.
  • ValidatorSupport 和 FieldValidatorSupport 实现了 Validator 接口
    • 若需要普通的验证程序, 可以继承 ValidatorSupport 类
    • 若需要字段验证程序, 可以继承 FieldValidatorSupport 类
    • 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性
  • 注册验证程序: 自定义验证器需要在类路径里的某个 validators.xml
    文件里注册:验证框架首先在根目录下找validators.xml文件,没找到validators.xml文件,
    验证框架将调用默认的验证设置,即default.xml里面的配置信息.
  • 位于com.opensymphony.xwork2.validator 包下

需求:自定义一个 age 的验证器, 使 age 不能小于 0
1、 在jsp页面增加一个组件

        <s:textfield name="age" />

2、在action中增加private Integer age属性
3、自定义验证规则

public class AgeValidate extends FieldValidatorSupport {
/**
 * object 表示当前执行的action对象
 *     object  cn.itcast.validate.ValidateXmlAction@12dcb8c
 */
public void validate(Object object) throws ValidationException {
  System.out.println("object  "+object);
  //获取字段的名称  age
  String fieldName=this.getFieldName();
  //获取字段的值
  Object fieldValue=this.getFieldValue(fieldName, object);
  System.out.println(fieldName  +"  "+fieldValue);
  if(fieldValue instanceof Integer){
  Integer age=(Integer)fieldValue;
  if(age<0){
         this.addFieldError(fieldName, object);
  } }}}

4、在工程的src下新建validators.xml文件,在文件中增加如下内容
该xml文件采用的规范在xwork-core-2.1.6.jar包下的xwork-validator-config-1.0.dtd

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Struts2框架xml验证 的相关文章

随机推荐