Struts2的校验器详解/验证框架详解/校验框架详解

简介

Struts2 的校验器是在后端对前端提交的数据进行校验,在调用 Action 的指定方法前会先调用校验器的有关方法,校验通过才会调用 Action 指定的方法,校验不通过则会调用 Action 的方法 input(),该方法返回字符串“input”。

校验不通过会将有关的提示信息存储到 Action 对象中的成员变量 validationAware 中(这个成员变量继承自 ActionSupport),然后再调用 Action 的方法 input()(这个方法继承自 ActionSupport),该方法返回字符串“input”。

控制器再将请求转发给名为“input”的 JSP 页面。

使用校验器步骤

1.先写前端页面 JSP

写页面时要确定哪些字段的数据需要校验,在需要校验的字段旁边添加标签 <s:fielderror/>,如下所示:

 <tr>
	td>邮箱:</td>
	<td><input type="text" name="email"/></td>
	<%--使用<s:fielderror/>标签输出对应字段的错误信息,属性fieldName指定出现错误信息的字段名称--%>
	<td><s:fielderror fieldName="email"/></td>
</tr>

2.写 Action

Action 的属性名称要和前端页面的字段名称保持一致。自定义的 Action 必须继承自 ActionSupport。

3.struts.xml 对 Action 配置

 <action name="register" class="priv.lwx.struts2.validator.web.RegisterAction">
	<result name="success">success.jsp</result>
	<!--校验失败后,struts2会把页面转到名为"input"的页面中-->
	<result name="input">register.jsp</result>
</action>

4.创建校验器配置文件

首先确定调用哪个 Action 需要校验请求参数的数据。

例如,调用名称为 register 的 Action 需要校验页面表单项的数据,那么就需要在 Action 所在的包目录下创建一个校验器配置文件,并且该配置文件的取名规则为:Action 类的名称-Action 的名称-validation.xml

Action 的名称:struts.xml 文件中标签 <action/> 的属性 name 的值

例如,下面的 action:

<action name="register" class="priv.lwx.struts2.validator.web.RegisterAction">
	<result name="success">success.jsp</result>
    <!--校验失败后,struts2会把页面转到名为"input"的页面中-->
	<result name="input">register.jsp</result>
</action>

访问 register,需要校验表单数据,那么就可以创建名为 RegisterAction-register-validation.xml 的配置文件。并将该配置文件存放在 RegisterAction 所在的包目录下。Maven 项目在开发时,只能将配置文件存放在目录 resources 下,因此需要将该配置文件存放在目录 resources 中相对应的包目录下,所以你要先在目录 resources 目录下创建和 RegisterAction 的包目录结构相同的目录,再将配置文件存放在对应的包目录下,如下图所示:
在这里插入图片描述

如果配置文件命名为 RegisterAction-validation.xml,则只要访问类 RegisterAction 就会去调用校验器。

校验器调用顺序:
按下面的顺序加载解析校验器配置文件,调用相应的校验器。
先加载 action类名-validation.xml,然后加载 action类名-name属性值-validation.xml 文件。

5.校验器配置

先指定被校验的字段,再指定校验器。谁被校验,由谁来校验!这是【字段 → 校验器】配置风格

例如:

  <!-- 属性name指定被校验的字段名称,这里对字段email进行校验 -->
    <field name="email">
        <!-- 属性type指定校验器名,requiredstring:非空字符串校验器 -->
        <field-validator type="requiredstring">
            <!--校验不通过,标签<message/>中的文本会作为标签<s:fielderror/>所输出的HTML标签的文本,显示在页面中-->
            <message>邮箱不能为空</message>
        </field-validator>
        <!-- 一个字段可以配置多个校验器,email:邮箱格式校验器 -->
        <field-validator type="email">
            <message>邮箱格式不正确</message>
        </field-validator>
    </field>

先指定校验器,再指定被校验的字段。由谁来校验,来校验谁!这是【校验器 → 字段】配置风格。

例如:

<validator type="校验器名">
    <param name="fieldName">需要被校验的字段</param>
    <param name="参数名">参数值</param>
    <!--校验不通过在页面显示的提示信息 -->
    <message>提示信息</message>
</validator>

演示案例

项目结构图如下:
在这里插入图片描述

register.jsp的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--引用struts2标签库--%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <s:head/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>注册</title>
</head>
<body>
<form action="register1.action" method="post">
    <table>
        <tr>
            <td>邮箱:</td>
            <td><input type="text" name="email"/></td>
            <%--使用<s:fielderror/>标签输出对应字段的错误信息,属性fieldName指定出现错误信息的字段名称--%>
            <td><s:fielderror fieldName="email"/></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"/></td>
            <td><s:fielderror fieldName="password"/></td>
        </tr>
        <tr>
            <td>重复密码:</td>
            <td>
                <input type="password" name="repassword"/></td>
            <td><s:fielderror fieldName="repassword"/></td>
        </tr>
        <tr>
            <td>电话:</td>
            <td><input type="text" name="phone"/></td>
            <td><s:fielderror fieldName="phone"/></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"/></td>
            <td></td>
            <td></td>
        </tr>
    </table>
</form>
</body>
</html>

success.jsp的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>注册成功</title>
</head>
<body>
欢迎你 ${email}
</body>
</html>

RegisterAction 的代码如下:

package priv.lwx.struts2.validator.web;

import com.opensymphony.xwork2.ActionSupport;

/**
 * description
 *
 * @author liaowenxiong
 * @date 2022/5/31 18:43
 */

public class RegisterAction extends ActionSupport {
    
    
  // 页面中需要校验的字段必须和Action的属性一一对应
  private String email;
  private String password;
  private String repassword;
  private String phone;

  public String execute() throws Exception {
    
    
    return SUCCESS;
  }

  public String getEmail() {
    
    
    return email;
  }

  public void setEmail(String email) {
    
    
    this.email = email;
  }

  public String getPassword() {
    
    
    return password;
  }

  public void setPassword(String password) {
    
    
    this.password = password;
  }

  public String getRepassword() {
    
    
    return repassword;
  }

  public void setRepassword(String repassword) {
    
    
    this.repassword = repassword;
  }

  public String getPhone() {
    
    
    return phone;
  }

  public void setPhone(String phone) {
    
    
    this.phone = phone;
  }
}

struts.xml 的配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <package name="default" namespace="/" extends="struts-default">
        <!-- http://localhost:8080/sv/register.jsp -->
        <action name="register" class="priv.lwx.struts2.validator.web.RegisterAction">
            <result name="success">success.jsp</result>
            <!--校验失败后,struts2会把页面转到名为"input"的页面中-->
            <result name="input">register.jsp</result>
        </action>
    </package>
</struts>

RegisterAction-validation.xml 的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!--配置校验器-->
<validators>
    <!-- 属性name指定被校验的字段名称,这里对字段email进行校验 -->
    <field name="email">
        <!-- 属性type指定校验器名,requiredstring:非空字符串校验器 -->
        <field-validator type="requiredstring">
            <!--校验不通过,标签<message/>中的文本会作为标签<s:fielderror/>所输出的HTML标签的文本,显示在页面中-->
            <message>邮箱不能为空</message>
        </field-validator>
        <!-- 一个字段可以配置多个校验器,email:邮箱格式校验器 -->
        <field-validator type="email">
            <message>邮箱格式不正确</message>
        </field-validator>
    </field>

    <field name="password">
        <field-validator type="requiredstring">
            <message>密码不能为空</message>
        </field-validator>
        <!-- stringlength:字符串长度校验器 -->
        <field-validator type="stringlength">
            <!-- 通过校验器参数来添加和设置校验规则,minlength:最小长度 -->
            <param name="minLength">6</param>
            <message>密码长度不能少于6位</message>
        </field-validator>
    </field>

    <!-- 校验两次密码是否一致,使用fieldexpression校验器。expression参数指定判断用的表达式-->
    <field name="repassword">
        <field-validator type="fieldexpression">
            <!-- 表达式要写在<![CDATA[]]>内 -->
            <param name="expression"><![CDATA[repassword==password]]></param>
            <message>两次密码不一至</message>
        </field-validator>
    </field>

    <!-- 校验电话格式,使用regex正则表达式校验器,regexExpression参数指定正则表达式 -->
    <field name="phone">
        <field-validator type="regex">
            <!-- 注意!2.3.15前的版本使用expression参数 -->
            <param name="regexExpression"><![CDATA[\d{11}]]></param>
            <message>电话号码格式不正确</message>
        </field-validator>
    </field>
</validators>

常用校验器

Struts2 提供了大量的内置校验器,你可以在 xwork-core-2.1.6.jar 的 com.opensymphony.xwork2.validator.validators 下的 default.xml 中查看所有的内置校验器。

required

必填校验器,要求field的值不能为null。

requiredstring

必填字符串校验器,要求field的值不能为null,并且长度大于0

参数 说明
trim 指定在校验字符串长度之前是否去除字符串前后的空格。

stringlength

字符串长度校验器,要求field的值的长度必须在指定的范围内,否则校验不通过。

参数 说明
minLength 指定最小长度。
maxLength 指定量大长度。
trim 指定在校验字符串长度之前是否去除字符串前后的空格。

regex

正则表达式校验器,校验field的值是否与指定的正则表达式相匹配。

参数 说明
expression 指定正则表达式(2.3.15版用regexExpression)。
caseSensitive 指定进行正则表达式匹配时是否区分大小写。

int

整数校验器,要求field的值必须是整型数值,且数值必须在指定的范围内。

参数 说明
min 指定最小值。
max 指定最大值。

double

双精度浮点数校验器,要求field的值必须是double数值,并且数值必须在指定范围内。

参数 说明
min 指定最小值。
max 指定最大值。

fieldexpression

OGNL 表达式校验器。要求 field 的值满足一个 ognl 表达式。

参数 说明
expression 指定ognl表达式(表达式要写在 <![CDATA[]]>内)。

email

邮件地址校验器。如果field的值非空,则必须符合邮箱地址格式的要求(即必须是合法的邮箱地址)

url

网址校验器。如果field的值非空,则必须符合url格式的要求(即必须是合法的URL地址)

date

日期校验器,要求field的值必须是日期类型的,且日期值必须在指定范围内

参数 说明
min 指定最小值。
max 指定最大值。

conversion

转换校验器,指定在类型转换失败时,提示错误信息。

visitor

用于校验action中的复合属性。它指定一个校验文件用于校验复合属性中的属性。

expression

OGNL表达式校验器。要求 field 满足一个ognl表达式。该校验器不可用在【字段 → 校验器】风格的配置中!

参数 说明
expression 指定ognl表达式(表达式要写在 <![CDATA[]]> 内)。

参考

1.https://www.cnblogs.com/likailan/p/3302284.html

猜你喜欢

转载自blog.csdn.net/liaowenxiong/article/details/125073858