现在,我们将研究如何Struts的验证框架。在Struts的核心,我们的验证框架,用于帮助应用运行规则的操作方法执行之前执行验证。
客户端验证通常是使用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打印一个提交按钮。我们使用的标签属性标签,每个标签每个标签创建。
我们将使用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.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>
现在,右键点击项目名称,并单击“导出”> WAR文件创建一个WAR文件。然后,这WAR部署在Tomcat的webapps目录下。最后,启动Tomcat服务器,并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。这会给你以下画面:
现在不输入任何所需的信息,只需点击submit按钮。你会看到下面的结果:
输入所需的信息,但From字段输入了错误,让我们测试名字为 "test" 而年龄为:30, 最后点击“提交”按钮。你会看到下面的结果:
当用户按下“提交”按钮,在Struts 2会自动执行的验证方法,如果任何一个if语句内列出的方法是true,Struts 2中调用它的addFieldError方法。如果有任何错误已加入Struts 2中不会进行调用execute方法。而Struts 2框架将返回输入调用动作的结果。
因此,在验证失败时和Struts2返回输入,Struts 2框架将重新显示的index.jsp文件。由于我们使用了Struts 2的表单标签,Struts 2中会自动添加错误消息,只是上面的形式提交。
这些错误消息是我们addFieldError方法调用中指定的。 addFieldError方法有两个参数。首先是表单字段名的错误,第二个是该表单字段上面显示的错误消息。
addFieldError("name","The name is required");
要处理输入的返回值,我们需要添加下面的结果对我们的动作节点在struts.xml中。
<result name="input">/index.jsp</result>
做验证的第二个方法是通过将一个xml文件下的动作类。基于Struts2的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的理想与类文件一起。我们有我们的员工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验证器