Struts - 验证框架

  • 简述

    在本章中,我们将深入研究 Struts 验证框架。在 Struts 核心,我们有验证框架,可以帮助应用程序在执行 action 方法之前运行规则以执行验证。
    客户端验证通常使用 Javascript 来实现。但是,不应仅依赖客户端验证。最佳实践建议应在应用程序框架的所有级别引入验证。现在让我们看看向 Struts 项目添加验证的两种方法。
    在这里,我们将举一个例子 Employee 应该使用一个简单的页面捕获其姓名和年龄,我们将进行这两个验证以确保用户始终输入的姓名和年龄应在 28 到 65 之间的范围内。
    让我们从示例的主 JSP 页面开始。
  • 创建主页

    让我们编写主页面 JSP 文件 index.jsp,将用于收集上述员工相关信息。
    
    <%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
       pageEncoding = "ISO-8859-1"%>
    <%@ taglib prefix = "s" uri = "/struts-tags"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd">
    <html>
       <head>
          <title>Employee Form</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 language = "java" contentType = "text/html; charset = ISO-8859-1"
       pageEncoding = "ISO-8859-1"%>
    <%@ taglib prefix = "s" uri = "/struts-tags"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd">
    <html>
       <head>
          <title>Success</title>
       </head>
       
       <body>
          Employee Information is captured successfully.
       </body>
    </html>
    
  • 创建动作

    所以让我们定义一个小的动作类 Employee,然后添加一个名为 validate() 如下图所示 Employee.java文件。确保您的操作类扩展了ActionSupport 类,否则您的验证方法将不会被执行。
    
    package com.jc2182.struts2;
    import com.opensymphony.xwork2.ActionSupport;
    public class Employee extends ActionSupport {
       private String name;
       private int age;
       
       public String execute() {
           return SUCCESS;
       }
       
       public String getName() {
           return name;
       }
       
       public void setName(String name) {
           this.name = name;
       }
       
       public int getAge() {
           return age;
       }
       
       public void setAge(int age) {
           this.age = age;
       }
       public void validate() {
          if (name == null || name.trim().equals("")) {
             addFieldError("name","The name is required");
          }
          
          if (age < 28 || age > 65) {
             addFieldError("age","Age must be in between 28 and 65");
          }
       }
    }
    
    如上例所示,验证方法检查“名称”字段是否有值。如果未提供任何值,我们会为“名称”字段添加一个字段错误,并带有自定义错误消息。其次,我们检查“年龄”字段的输入值是否在 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.jc2182.struts2.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:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xmlns = "http://java.sun.com/xml/ns/javaee"
       xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
       xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
       id = "WebApp_ID" version = "3.0">
       <display-name>Struts 2</display-name>
       
       <welcome-file-list>
          <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
       <filter>
          <filter-name>struts2</filter-name>
          <filter-class>
             org.apache.struts2.dispatcher.FilterDispatcher
          </filter-class>
       </filter>
       <filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>/*</url-pattern>
       </filter-mapping>
    </web-app>
    
    现在,右键单击项目名称并单击 Export > WAR File创建一个战争文件。然后将此 WAR 部署到 Tomcat 的 webapps 目录中。最后,启动Tomcat服务器并尝试访问URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. 这将产生以下屏幕 -
    电子邮件用户输入
    现在不要输入任何必需的信息,只需单击 Submit按钮。您将看到以下结果 -
    错误
    输入必填信息但输入错误的发件人字段,让我们说姓名为“test”,年龄为30,最后点击 Submit按钮。您将看到以下结果 -
    成功
  • 此验证如何工作?

    当用户按下提交按钮时,Struts 2 将自动执行验证方法,如果有任何 “if”如果方法中列出的语句为真,Struts 2 将调用其 addFieldError 方法。如果添加了任何错误,则 Struts 2 将不会继续调用 execute 方法。而是 Struts 2 框架将返回input 作为调用操作的结果。
    因此,当验证失败并且 Struts 2 返回时 input,Struts 2 框架将重新显示 index.jsp 文件。由于我们使用了 Struts 2 表单标签,因此 Struts 2 会自动在提交的表单上方添加错误消息。
    这些错误消息是我们在 addFieldError 方法调用中指定的。addFieldError 方法接受两个参数。第一个,是form 错误适用的字段名称,第二个是显示在该表单字段上方的错误消息。
    
    addFieldError("name","The name is required");
    
    处理返回值 input 我们需要将以下结果添加到我们的动作节点中 struts.xml.
    
    <result name = "input">/index.jsp</result>
    
  • 基于 XML 的验证

    进行验证的第二种方法是在操作类旁边放置一个 xml 文件。基于 Struts2 XML 的验证提供了更多的验证选项,如电子邮件验证、整数范围验证、表单验证字段、表达式验证、正则表达式验证、必需验证、必需字符串验证、字符串长度验证等。
    xml文件需要命名 '[action-class]'-validation.xml. 所以,在我们的例子中,我们创建了一个名为Employee-validation.xml 具有以下内容 -
    
    <!DOCTYPE validators PUBLIC 
       "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
       "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
    <validators>
       <field name = "name">
          <field-validator type = "required">
             <message>
                The name is required.
             </message>
          </field-validator>
       </field>
       <field name = "age">
         <field-validator type = "int">
             <param name = "min">29</param>
             <param name = "max">64</param>
             <message>
                Age must be in between 28 and 65
             </message>
          </field-validator>
       </field>
    </validators>
    
    理想情况下,上面的 XML 文件将与类文件一起保存在您的 CLASSPATH 中。让我们的 Employee 操作类如下所示,而无需validate() 方法 -
    
    package com.jc2182.struts2;
    import com.opensymphony.xwork2.ActionSupport;
    public class Employee extends ActionSupport{
       private String name;
       private int age;
       
       public String execute() {
           return SUCCESS;
       }
       
       public String getName() {
           return name;
       }
       
       public void setName(String name) {
           this.name = name;
       }
       
       public int getAge() {
           return age;
       }
       
       public void setAge(int age) {
           this.age = age;
       }
    }
    
    其余的设置将保持与前一个示例相同,现在如果您将运行该应用程序,它将产生与我们在前一个示例中收到的结果相同的结果。
    使用 xml 文件来存储配置的优势允许将验证与应用程序代码分离。您可以让开发人员编写代码,让业务分析师创建验证 xml 文件。另一件需要注意的是默认情况下可用的验证器类型。
    默认情况下,Struts 有更多的验证器。常见的验证器包括日期验证器、正则表达式验证器和字符串长度验证器。