Struts验证的两种方式
在Struts框架中,使用ActionForm Bean来实现应用程序系统的非持久性数据存储和维护功能,它采用了自动填充属性和调用的机制。所以必须继承ActionForm类,并且包涵用户表单输入的属性,以及相应的get方法和set方法。另外,还可以根据需要重写父类的reset()和validate()方法,实现属性的重置和表单数据验证功能。
一:validate()方法
这个方法主要负责检查数据的格式和语法,而不负责检查数据是否符合业务逻辑。
ActionForm基类中的validate()方法在默认情况下将返回null。如果创建了ActionForm的子类,那么应该在子类覆盖validate()方法。
reset()方法
这个方法用于恢复ActionForm Bean 的属性的默认值。例如:把字符串属性设为null或某个初始值。
1、 修改前面我们写的LoginActionForm,如果你不清楚的话,请您先看前几个实例,具体代码如下:
public ActionErrors validate(ActionMapping actionMapping,
HttpServletRequest httpServletRequest) {
ActionErrors errors = new ActionErrors();
if (username == null|| username.equals("")) {
errors.add(ActionErrors.GLOBAL_MESSAGE,
new ActionError("loginform.error.username"));
}
if (userpass == null||userpass.equals("")) {
errors.add(ActionErrors.GLOBAL_MESSAGE,
new ActionError("loginform.error.password"));
或者
ActionMessage message=new ActionMessage("loginform.error.password","请输入密码");
errors.add("password", message);
}
return errors;
}
这个方法返回ActionErrors对象,如果返回的ActionErrors对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,此时就回把请求转发到你struts.xml里面元素input属性指定的web资源。
new ActionError("loginform.error.username");取得资源文件里面的键值,用于页面的输出。
2、 打开applicationResource.properties,加入如下信息:
loginform.error.username=please enter your username
loginform.error.password=please enter your password
因为我们前面做了国际化,所以打开applicationResource_zh_CN.properties文件,添加如下:
loginform.error.username=请输入用户名
loginform.error.password=请输入密码
3、 修改struts-config.xml文件
path="/login"
name="loginActionForm"
scope="request"
type="actions.LoginAction"
validate="true"
input="/login.jsp">
在元素中,name和scope属性分别指定ActionForm的名字和它的范围,valudate属性指定是否执行表单验证,而input属性表示验证失败,所要显示用户的内容。
4、 修改login.jsp,在元素添加,目的是显示错误信息,具体代码片段如下:
:用于输出消息。属性介绍如下:
n name:指定ActionMessages对象存放在request或session范围内的属性key。标签处理类将根据这一属性key来检索request或session范围的ActionMessages对象。
n message属性:指定消息的来源。如果为true,则从request或session范围内检索出属性key为Globals.MESSAGE_KEY的ActionMessages对象,此时name属性无效;如果为false,则根据name属性来检索ActionMessage对象,如果此时没有设置name属性,将采取默认值Globals.ERROR_KEY.message属性的默认值为false。
n id属性:用来命名从消息中检索出来的每个ActionMessage对象,它和标签的name属性匹配。
:表示显示javaBean或其属性的内容。
5、 运行
打开IE,键入如下地址:http://localhost:8080/Struts1_Login/login.jsp
不输入任何东西,我们直接点几击“确定”,如下:
二:Validator验证框架
1、Validator框架的优势
Validator框架是一个Struts插件,最初由David Winterfeldt设计并实现。Validator框架从Struts 0.5时代就可以使用,但那时Validator框架只是被捐助的一个jar包。Apache组织为了使开发人员更方便地使用Validator框架,决定从Struts1.1开始,将Validator框架作为Struts的一部分同Struts一起发布。
Validator框架可以在XML文件中配置验证规则和验证对象。因此,使用Validator框架可以无需在ActionForm的子类中覆盖validate方法就可以很方便地验证客户端的提交数据。由于Validator框架内置了很多预定义的验证机制,如验证某个属性是否存在,验证EMail是否合法等。所以在一般情况下,只需要配置XML文件就可以满足我们的验证需求。
在使用Validator框架时,就会发现这种方式要比直接使用validate方法进行验证会给我们带来如下的好处:
1. 更容易维护。 由于验证信息可以被放置在同一个配置文件中,因此,我们可以更容易地来维护这些验证信息。
2. 标准化。由于很多简单的验证都是相同的。如用户名和密码都要求由字母、数字以及下划下组成。如果将这些验证都写在validate方法中,对这些验证进行标准化非常困难。而在Validator框架中的这些验证机制都是预先定义的,因此,标准化相同的验证对于Validator框架来说将是一件非常轻松的事。
3. 避免重造轮子。虽然一些验证很简单,但如果想正确实现它们也是非常困难的。一个典型的例子是验证EMail地址的格式。如果这个验证要想完美无缺,就必须按着RFC-2822规范的要求来验证EMail地址。而如果我们使用Validator框架,就无需再重造轮子来验证EMail地址了。
4. 减少重复代码的数量。由于Validator框架提供了很多预定义的验证,因此,我们可以避免自己写很多重复的代码进行验证。当然,我们也可以将大量使用的验证封装在类的方法中,这些虽然可以避免大量的重复劳动,但这就意味着我们团队的新成员要使用这些被封装的验证方法之前必须先学习它们。而最糟糕的情况是很多开发人员可能会忘记使用这些由其他成员实现的验证库,而自己重新编写具有同样功能的验证库。当然,这一切如果使用Validator框架就都可以得到解决。
5. 客户端和服务端验证自动切换。我们只需要简单地在JSP页面中放一个单独的<html::javascript/>元素就可以将服务端的验证转换为客户端验证(基于JavaScript的验证)
虽然Validator框架的预定义验证已经可以满足大多数的验证需求了,但在某些特殊情况下,这些预定义验证就无法满足我们的需求了,为此,Validator框架也为开发人员提供了扩展验证机制的功能。这也使得Validator框架可以完成更复杂的验证工作。
二、配置和使用Validator框架
1. 安装Validator框架
由于Validator是Struts的一个插件,因此,就需要在struts-config.xml文件中按着Struts插件的方式来安装Validator框架。打开struts-config.xml文件,在<struts-config>元素中加入一个<plug-in>子元素,如下面的代码所示:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validator.xml" /> </plug-in>
|
其中<set-property>元素设置了插件中使用的pathnames属性的值。在pathnames属性值中包含了两个xml文件。
(1)validator-rules.xml:在这个文件中声明了Validator框架的预定义验证。这个文件可以在Struts的发行包的lib目录中可以找到这个文件。在使用MyEclipse为Web工程添加Struts功能后,会自动将这个文件加到WEB-INF目录中。
(2)validator.xml:这个文件定义了要验证的对象。实际上,在这个文件中,包含了一个或多个ActionForm的子类及其要验证的属性和验证规则。因此,这个文件就相当于validate方法。在Validator框架中,可以有多个定义验证对象的xml文件(可以将不同的ActionForm的子类分散到不同的xml文件中),中间用逗号(,)隔开,如下面的代码所示:<!——[endif]——>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validator1.xml, /WEB-INF/validator2.xml, /WEB-INF/validator3.xml" />
|
2. 使用Validator框架的一个例子
在本节将举一个例子来演示如何使用Validator框架来验证数据。我们需要按着如下的六步来完成这个例子:
【第1步】建立FirstValidatorForm类(ValidatorForm的子类)
在<samples工程目录>\src\actionform目录中建立一个FirstValidatorForm.java文件,代码如下:
package actionform; import org.apache.struts.validator.ValidatorForm; public class FirstValidatorForm extends ValidatorForm // 必须从ValidatorForm继承 { private String name; private String age; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
|
要注意的是,要想使用Validator框架验证数据,Form类就必须从ValidatorForm继承,而不能从ActionForm继承。这是因为ValidatorForm类是从ActionForm继承的,在ValidatorForm类中已经覆盖了validate方法来自动进行验证工作,因此,我们在ValidatorForm的子类中就不用写validate方法了。
<!——[endif]——>
【第2步】建立ValidatorAction类(Action的子类)
在<samples工程目录>\src\action目录中建立一个ValidatorAction.java文件,代码如下:
package action; import javax.servlet.http.*; import org.apache.struts.action.*; public class ValidatorAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { response.setCharacterEncoding("GBK"); try { response.getWriter().println("验证成功!"); } catch (Exception e) { } return null; } }
|
ValidatorAction类是一个空的Struts动作类(除了输出一行“验证成功!”字符串)。这个动作是为了正常运行含有Struts元素的JSP程序所编写的。在以后的代码中会经常使用到这个Struts动作类。
【第3步】配置struts-config.xml文件
配置FirstValidatorForm和ValidatorAction的代码如下所示
<form-bean name="firstValidatorForm" type=" actionform.FirstValidatorForm" /> <action name="firstValidatorForm" path="/firstValidator" scope="request" type=" action.ValidatorAction" input="/firstValidator.jsp" validate=”true”/>
|
其中firstValidator.jsp是用户录入信息的界面,也是显示错误信息的界面。
【第4步】建立firstValidator.jsp在Web根目录建立一个firstValidator.jsp文件,代码如下:<!——[endif]——>
<%@ page pageEncoding="GBK"%> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%> <html> <head> <title>第一个Validator程序</title> </head> <body> <html:form action="firstValidator" > 姓 名: <html:text property="name" /> <font color="red"><html:errors property="name"/></font><p> 年 龄: <html:text property="age"/> <font color="red"><html:errors property="age"/></font><p> EMail: <html:text property="email"/> <font color="red"><html:errors property="email"/></font><p> <html:submit value="提交"/> </html:form> </body> </html>
|
从firstValidator.jsp中可以看出,不管是否使用Validator框架进和验证,对于JSP代码来说是完全一样的。仍然是使用<html:errors>元素来显示错误信息。但要注意,在使用Validator框架时,<html:errors>标签的property属性的值就是所对应ValidatorForm的子类的属性名。
【第5步】配置validator.xml文件在本例中只使用了一个XML文件(validator.xml)来配置要验证的对象。validator.xml的代码如下:<!——[endif]——>
<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN" "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"> <form-validation> <formset> <form name="firstValidatorForm"> <field property="name" depends="required,maxlength,minlength,mask"> <msg name="required" key="error.name.blank" /> <msg name="minlength" key="error.name.minLength" /> <msg name="maxlength" key="error.name.maxLength" /> <msg name="mask" key="error.name.alphanum" /> <arg name="minlength" key="${var:minlength}" position="0" resource="false" /> <arg name="maxlength" key="${var:maxlength}" position="0" resource="false" /> <var> <var-name>minlength</var-name> <var-value>5</var-value> </var> <var> <var-name>maxlength</var-name> <var-value>10</var-value> </var> <var> <var-name>mask</var-name> <var-value>^[a-zA-Z0-9]*$</var-value> </var> </field> <field property="age" depends="required,integer,intRange"> <msg name="required" key="error.age.blank" /> <msg name="integer" key="error.age.integer" /> <msg name="intRange" key="error.age.intRange" /> <arg name="intRange" key="${var:min}" position="0" resource="false" /> <arg name="intRange" key="${var:max}" position="1" resource="false" /> <var> <var-name>min</var-name> <var-value>18</var-value> </var> <var> <var-name>max</var-name> <var-value>60</var-value> </var> </field> <field property="email" depends="required,email"> <msg name="required" key="error.email.blank" /> <msg name="email" key="error.email.invalid" /> </field> </form> </formset> </form-validation>
|
validator.xml文件中的所有配置都放到<form-validation>元素中。在<form-validation>元素中有一个<formset>子元素,这个元素可以定义多个<Form>元素,这个元素用来定义要验证的ValidatorForm类的子类。其中name属性值就是<form-bean>元素中的name属性值。
<field>元素用来定义某个属性的约束条件,如第一个<field>元素定义了name属性必须存在(required)、必须要满足最小长度(minlength)和最大长度(maxlength)以及还要通过mask所指的正则表达式的验证。
<msg>元素用来定义出错信息在属性文件中的Key(所有的出错信息都在属性文件中)。<arg>元素用来向出错信息中的参数传递参数值。<var>元素用来定义变量名和变量值。
【第6步】在ErrorDescription.properties文件中添加错误信息
打开ErrorDescription.properties文件,在文件的后面添加如下的内容:
error.name.blank = 姓名不能为空 error.name.minLength = 姓名的长度不能小于{0} error.name.maxLength = 姓名的长度不能大于{0} error.name.alphanum = 姓名必须由字母和数字组成 error.age.blank = 年龄不能为空 error.age.integer = 年龄必须为数字 error.age.intRange = 年龄必须在{0}和{1}之间
|
启动Tomcat,在IE中输入如下的URL来测试程序:
http://localhost:8080/samples/%20firstValidator.jsp
在输入一些错误信息后,点击“提交”按钮,将出现类似下图的效果。
分享到:
相关推荐
总结,Struts1.x的验证框架为Java Web开发者提供了一套方便的数据验证机制,能够有效提升应用的安全性和用户体验。虽然在现代开发中,Struts1.x已经逐渐被Spring MVC等更现代的框架取代,但了解和理解其验证框架仍然...
Validator框架则是Struts 1.x中的增强功能,允许更灵活的XML配置和可重用的验证规则。 4. **Validator框架** - **ValidatorConfig**:配置文件(如struts-validator.xml或struts-config.xml)定义了验证规则和错误...
1. 拦截器是Struts2的一个重要特性,它们可以实现预处理和后处理逻辑,如日志记录、权限验证、事务管理等。常见的内置拦截器有Params(参数处理)、Validation(表单验证)、StackTrace(堆栈跟踪)等。 2. 自定义...
1. **XML配置**:在`struts.xml`或特定的验证配置文件中定义验证规则。例如: ```xml <package name="default" extends="struts-default"> <param name="excludeMethods">input,back,cancel,browse ...
总结起来,Struts提供了多种验证方式,包括ActionForm验证、XML配置的Validation框架、动态验证、Tiles验证、拦截器验证、第三方验证库集成以及客户端的AJAX验证。选择合适的方式取决于项目需求和团队偏好,重要的是...
### Struts 1.x 总结 #### 一、Struts 框架概述 Struts 是一个基于 Java 的开源框架,它实现了 Model-View-Controller (MVC) 设计模式,帮助开发者构建可扩展、易于维护的 Web 应用程序。在 Struts 1.x 版本中,其...
总结,Struts表单验证是保证Web应用数据安全性和用户体验的重要手段。通过这个视频教程,你可以深入理解Struts框架的验证机制,提高你在开发过程中对用户输入数据的管理能力。务必花时间学习和实践,以提升你的开发...
总结起来,Struts2的XML表单验证是通过创建XML文件定义验证规则,然后在Action类中处理数据,通过框架自动进行验证并返回错误信息。这种方式使得验证逻辑与业务逻辑分离,提高了代码的可维护性和复用性。对于大型...
##### 总结1:Struts2 onsubmit 无法返回JavaScript进行验证 **问题描述**:在Struts2框架中,尝试使用`onsubmit`事件调用JavaScript进行表单验证时发现无效。 **原因分析**:`onsubmit`事件默认情况下并不会阻止...
- **Struts1**中的表单验证主要依赖于ActionForm对象及其验证规则,这使得表单验证与业务逻辑紧密耦合。 - **Struts2**提供了一套更加灵活的验证机制,支持注解、XML配置等多种验证方式,并且能够与业务逻辑分离,...
1. **验证框架概述** Struts Validator框架通过定义验证规则,对用户输入进行检查,防止无效或不安全的数据进入系统。它提供了XML配置文件和JavaBeans属性文件来声明验证规则,以及一组自定义标签库(JSP Tags)来...
#### 二、Struts验证框架概述 Struts提供了多种验证机制,用于确保用户输入的数据符合预期格式和规则。这些验证机制包括内置验证器和自定义验证器,可以通过配置文件或注解的方式应用到表单字段上。本文将详细介绍...
1. **方法命名**:待验证的方法名称不能命名为`input`,因为`input`是Struts2中用于指定错误页面返回的特殊名称。 2. **表单提交**:在表单提交时,必须明确指定验证方法的完整名称,例如`validate_add`,而不能使用...
ActionForm是Struts1中处理用户输入的核心组件,它负责接收、验证和封装来自表单的数据。在本文中,我们将深入探讨如何利用ActionForm实现表单验证,并在验证失败时追加错误信息。 1. **ActionForm介绍** ...
### Struts2 自定义验证程序的实现方法详解 #### 一、Struts2 内建验证程序实现的分析 在探讨如何实现自定义验证程序之前,我们先来了解一下 Struts2 的内置验证机制。Struts2 提供了丰富的内置验证器(Validator...
### Struts2验证机制详解 #### 一、引言 在Web应用开发中,数据验证是确保应用程序稳定性和安全性的重要环节。Struts2框架提供了一套完善的验证机制,能够帮助开发者轻松实现对用户输入数据的有效性检查。本文将...
本总结将深入探讨Struts2的核心概念、关键功能和实用技术,以帮助开发者全面理解并熟练运用这一框架。 一、Servlet模板 在Struts2中,Servlet模板是一种处理请求和响应的方式。它通过拦截器链对请求进行处理,然后...
总结,Struts1作为早期的Web框架,虽然现在已经被Struts2和Spring MVC等新框架所替代,但它在Java Web开发历史上的地位不容忽视,其设计理念和模式对理解现代框架仍有启发意义。通过学习Struts1,开发者能够更好地...