Struts 2 - 验证框架



本章我们将深入探讨Struts验证框架。在Struts核心,我们有一个验证框架,它帮助应用程序在执行action方法之前运行规则进行验证。

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

这里,我们将以一个员工为例,其姓名和年龄应使用一个简单的页面捕获,我们将进行这两个验证,以确保用户始终输入姓名和年龄,年龄应在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打印一个提交按钮。我们为每个标签使用了label属性,它为每个标签创建标签。

创建视图

我们将使用JSP文件success.jsp,如果定义的action返回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>

创建Action

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

package com.tutorialspoint.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.tutorialspoint.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>

现在,右键单击项目名称,然后单击导出 > WAR文件以创建WAR文件。然后将此WAR部署到Tomcat的webapps目录中。最后,启动Tomcat服务器并尝试访问URL https://:8080/HelloWorldStruts2/index.jsp。这将产生以下屏幕:

Email User Input

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

Error

输入所需信息,但输入错误的字段,例如姓名为“test”年龄为30,最后单击提交按钮。你将看到以下结果:

Success

此验证如何工作?

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

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

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

addFieldError("name","The name is required");

为了处理input的返回值,我们需要在struts.xml中的action节点中添加以下结果。

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

基于XML的验证

进行验证的第二种方法是将xml文件放在action类旁边。Struts 2基于XML的验证提供了更多验证选项,例如电子邮件验证、整数范围验证、表单验证字段、表达式验证、正则表达式验证、必需验证、requiredstring验证、stringlength验证等。

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 action类设置为如下所示,没有validate()方法:

package com.tutorialspoint.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默认提供了许多其他验证器。常见的验证器包括日期验证器、正则表达式验证器和字符串长度验证器。请查看以下链接了解更多详情 Struts - 基于XML的验证器

广告
© . All rights reserved.