离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-11-28 11:00:43

验证

现在我们将观察 Struts 验证框架如何。在 Struts 的核心中,我们有验证框架,它能在动作方法执行之前协助应用程序运行规则来执行验证。

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

这里我们将举一个 Employee 的例子,使用一个简单的页面来捕获它们的姓名和年龄,我们提出两个验证用来确保总是输入一个名字而且年龄应该是在 28 和 65 之间。所以,让我们从例子的主 JSP 页面开始。

创建主页面

让我们编写主页面 JSP 文件 index.jsp,它将被用来收集 Employee 上面提到的相关信息。

<%@ 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 属性,而且每个标签都建立了 label。

创建视图

我们将使用 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,然后如下所示在 Employee.java 文件中添加一个方法,称为 validate()。确保你的动作类扩展了 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");
      }
   }
}

如在上面的例子所示,验证方法检查 “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.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>

现在,右键点击项目名称,并单击 Export > WAR File 创建一个 WAR 文件。然后在 Tomcat 的 webapps 目录下部署此 WAR 。最后,启动 Tomcat 服务器和尝试访问 URL http://localhost:8080/HelloWorldStruts2/index.jsp. 这会给出以下画面:

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

输入必需的信息,但是输入了错误的 From 字段,假如说 name 为 “test” 和年龄为 30,最后单击 Submit 按钮。你将看到下面的结果:

验证是如何工作的?

当用户按下提交按钮时,Struts2 会自动执行验证方法,如果任何列出的 if 语句内部的方法都是 true,那么 Struts 2 调用它的 addFieldError 方法。如果已添加任何错误,那么 Struts 2 将不会继续调用 execute 方法。而 Struts 2 框架将返回输入作为调用这个行动的结果。

所以当验证失败和 Struts2 返回输入时,Struts 2 框架将重新显示 index.jsp 文件。由于我们使用了 Struts 2 的表单标签,Struts2 将会自动添加只是上述表单字段的错误信息。

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

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

为了处理输入的返回值,我们需要在 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 中。让我们有不包含 validate() 方法的 Employee 动作类,如下所示:

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 的验证器。常见的验证器包括日期验证器,正则表达式验证器和字符串长度验证器。

上一篇: 发送电子邮件 下一篇: 本地化