Struts 2 - 验证框架
在本章中,我们将深入了解 Struts 验证框架。在 Struts 核心中,我们有一个验证框架,它帮助应用程序在执行操作方法之前运行规则以执行验证。
客户端验证通常使用 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 标签打印一个提交按钮。我们为每个标签使用了 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 类,否则您的验证方法将不会被执行。
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 http://localhost:8080/HelloWorldStruts2/index.jsp。这将产生以下屏幕 −

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

输入所需信息,但输入错误的发件人字段,假设姓名为"test",年龄为 30,最后单击Submit按钮。您将看到以下结果 −

此验证如何工作?
当用户按下提交按钮时,Struts 2 将自动执行验证方法,如果方法中列出的任何"if"语句为真,Struts 2 将调用其 addFieldError 方法。如果添加了任何错误,则 Struts 2 将不会继续调用执行方法。相反,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 中。让我们拥有如下员工操作类,而无需 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 的验证器。