现在,我们将看看如何的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,然后添加一个方法称为validate(),如下所示在employee.java文件。请确保操作类扩展actionsupport类,否则validate方法将不会被执行。
package com.h3.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”字段的验证方法检查是否有一个值,或不。如果没有值已经提供,我们添加一个带有自定义错误消息“age”字段的字段错误。其次,我们检查,如果输入的值是在28和65之间或不为“age”字段,如果这个条件不符合我们以上验证字段添加一个错误。
最后,让我们把所有东西一起使用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.h3.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文件。然后部署此war在tomcat的webapps目录下。最后,启动tomcat服务器和尝试访问url http://localhost:8080/helloworldstruts2/index.jsp。这会给出以下画面:
现在不输入任何所需信息,只需点击“submit ”按钮。将看到以下结果:
输入所需的信息,但输入了错误的from字段,让我们说“test”和年龄为30,最后点击“submit ”按钮。将看到以下结果:
当用户按下提交按钮时,struts2会自动执行的验证方法,如果任何一个if语句里面的方法列出,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文件的动作类。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.h3.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的校验.