Struts 2 验证框架

在本章中,我们将深入研究 Struts 验证框架。 在 Struts 内核中,有一个验证框架,它可以帮助应用程序运行规则从而在执行操作方法之前执行验证。

客户端验证通常使用 Javascript 实现。 但是,不应仅依赖客户端验证。 最佳实践建议应在应用程序框架的所有级别引入验证。 现在让我们看看向我们的 Struts 项目添加验证的两种方法。

在这里,我们将举一个员工的例子,其姓名和年龄应该使用一个简单的页面来捕获,我们将使用这两个验证来确保用户的姓名不为空,并且年龄在28 到 65 之间。

让我们从示例的主 JSP 页面开始。

让我们编写主页 JSP 文件 index.jsp,该文件将用于收集上述 Employee 相关信息。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<html>
  <head>
    <title>Employee 表单</title>
  </head>
  <body>
  <s:form action = "empinfo" method = "post">
    <s:textfield name = "name" label = "Name" size = "20" />
    <s:textfield name = "age" label = "Age" size = "20" />
    <s:submit name = "submit" label = "Submit" align="center" />
  </s:form>
  </body>
</html>

index.jsp 使用了 Struts 标签,我们还没有介绍,但我们将在标签相关的章节中研究它们。 但是现在,只假设 s:textfield 标记打印一个输入字段,而 s:submit 打印一个提交按钮。 我们为每个标签使用了标签属性,为每个标签创建标签。

创建视图

我们将创建 JSP 文件 success.jsp,如果定义的操作返回 SUCCESS,将调用该文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功</title>
</head>
<body>
Employee 信息获取成功
</body>
</html>

创建 Action

因此,让我们定义一个 Action 类 Employee,然后在 Employee.java 文件中添加一个名为 validate() 的方法,如下所示。 确保 Action 类继承了 ActionSupport 类,否则验证方法将不会被执行。

package com.jiyik.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport {
    private String name;
    private int age;

    @Override
    public String execute() {
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void validate() {
        if (name == null || name.trim().equals("")) {
            addFieldError("name", "姓名不能为空");
        }

        if (age < 28 || age > 65) {
            addFieldError("age", "年龄必须在 28 和 65 之间");
        }
    }
}

如上例所示,validate 方法检查“name”字段是否有值。 如果未提供任何值,我们将使用自定义错误消息为“name”字段添加字段错误。 其次,我们检查“age”字段的输入值是否在 28 到 65 之间,如果不满足此条件,我们会在验证字段上方添加错误。

配置文件

最后,让我们使用 struts.xml 配置文件将所有内容放在一起,如下所示

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name = "struts.devMode" value = "true" />

    <package name = "helloworld" extends = "struts-default">
        <action name="empinfo" class="com.jiyik.struts2.action.Employee" method="execute">
            <result name = "input">/index.jsp</result>
            <result name = "success">/success.jsp</result>
        </action>
    </package>
</struts>

以下是 web.xml 文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

启动服务

在上面文件都编辑完成之后,下面我们使用IDEA启动我们的项目。

项目启动之后我们在浏览器中访问 http://localhost:8080

Struts 验证框架表单页面

现在不要输入任何必需的信息,只需单击提交按钮。 我们将看到以下结果

Struts 验证框架未通过验证界面

让我们输入 name 为“jiyik”,age 为 30,最后点击 Submit 按钮。 将看到以下结果

Struts 验证表单验证通过界面


验证的原理

当用户按下提交按钮时,Struts 2 将自动执行 validate 方法,如果该方法中列出的任何“if”语句为真,Struts 2 将调用其 addFieldError 方法。 如果添加了任何错误,那么 Struts 2 将不会继续调用 execute 方法。 相反,Struts 2 框架将返回输入作为调用动作的结果。

因此,当验证失败并且 Struts 2 返回输入时,Struts 2 框架将重新显示 index.jsp 文件。 由于我们使用了 Struts 2 表单标签,Struts 2 会自动在表单字段的上方添加错误消息。

这些错误消息是我们在 addFieldError 方法调用中指定的。 addFieldError 方法有两个参数。 第一个是错误适用的表单字段名称,第二个是显示在该表单字段上方的错误消息。

addFieldError("name","姓名不能为空");

要处理输入的返回值,我们需要将以下结果添加到 struts.xml 中的操作节点。

<result name = "input">/index.jsp</result>

基于 XML 的验证

进行验证的第二种方法是在 Action 类旁边放置一个 xml 文件。 Struts2 基于 XML 的验证提供了更多的验证选项,如电子邮件验证、整数范围验证、表单验证字段、表达式验证、正则表达式验证、必需验证、必需字符串验证、字符串长度验证等。

xml 文件需要命名为“[action-class]”-validation.xml 。 因此,在我们的例子中,我们创建一个名为 Employee-validation.xml 的文件,其内容如下

<!DOCTYPE validators PUBLIC
          "-//Apache Struts//XWork Validator 1.0.3//EN"
          "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>
   <field name = "name">
      <field-validator type = "required">
         <message>
            姓名不能为空
         </message>
      </field-validator>
   </field>

   <field name = "age">
     <field-validator type = "int">
         <param name = "min">29</param>
         <param name = "max">64</param>
         <message>
            姓名必须在 28 和 65 之间
         </message>
      </field-validator>
   </field>
</validators>

理想情况下,上述 XML 文件将与类文件一起保存在我们的 CLASSPATH 中。 让我们在没有 validate() 方法的情况下拥有如下的 Employee 操作类

package com.jiyik.struts2.action;

import com.opensymphony.xwork2.ActionSupport;

public class Employee extends ActionSupport {
    private String name;
    private int age;

    @Override
    public String execute() {
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void validate() {
        if (name == null || name.trim().equals("")) {
            addFieldError("name", "姓名不能为空");
        }

        if (age < 28 || age > 65) {
            addFieldError("age", "年龄必须在 28 和 65 之间");
        }
    }
}

其余设置将保持与上一个示例相同,现在如果我们运行该应用程序,最终的效果将与上一个示例中的结果相同。

使用 xml 文件来存储配置的优点是可以将验证与应用程序代码分开。 我们可以让开发人员编写代码并让业务分析师创建验证 xml 文件。 另一件需要注意的是默认可用的验证器类型。

Struts 默认提供了更多的验证器。 常见的验证器包括日期验证器、正则表达式验证器和字符串长度验证器。 访问 Struts - 基于 XML 的验证器 来获取更多详细信息 。

查看笔记

扫码一下
查看教程更方便