`
walsh
  • 浏览: 432678 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

struts的验证框架详细介绍

阅读更多
引言
     数据校验也称为输入校验,指导对用户的输入进行基本的过滤,包括必填的字段,字段必须为数字及两次输入的密码必须匹配等。本文重点介绍了struts的校验框架。


1、struts的数据校验大致有如下几种方式:
  
  1. ActionForm的代码校验
  2. Action里的代码校验
  3. 结合commons-validator.jar的校验



1.1 ActionForm的代码校验
   ActionForm的代码校验是最基本的校验方式。这种校验方式是重写ActionForm的validate方法,在该方法内对所有的字段进行基本的校验。如果出现不符合要求的输出,则将出错提示封装在ActionError对象里,最后将多个ActionError组合成ActionErrors对象,给对象里封装了全部的出错信息。
    以登陆页面为例,下面是重写了Validate方法的ActionForm的代码:

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class LoginActionForm extends ActionForm {
	
	private static final long serialVersionUID = 1L;
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	//重写validate方法,完成数据校验
	@SuppressWarnings("deprecation")
	@Override 
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {
		//ActionErrors用于包装所有的出错信息
		ActionErrors  errors = new ActionErrors();
		//如果用户名为空
		if((username == null)||(username.equals(""))) {
			//error.username对应资源文件中的key,用户名是对应资源文件的第一个参数
			errors.add("username", new ActionError("error.username","用户名"));
		}
		//如果密码为空
		if((password == null )||(password.equals(""))) {
			errors.add("password", new ActionError("error.password","密码"));
		}
		//返回封装了所有的出错信息
		return errors;
	}
}


在JSP页面中值需要更改一处即可****之间的部分:
<%@ page language="java" contentType="text/html; charset=GB2312" errorPage="error.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>  
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>  
<html>
  <head>
    <!-- 使用国际化资源文件的key输出标题 -->
    <title><bean:message key="login"/></title>
  </head>
  <!-- 下面的标签用于输出出错信息 -->
  <!-- *******************************************-->
  <html:errors/>
  <!-- ******************************************* -->
  <body>
	<font color="red">
	<%
	//用于输出出错信息,出错信息保存在request的err属性中
		if(request.getAttribute("err")!=null) {
			out.println(request.getAttribute("err"));
		}
	%>
	</font>
	<br><br>
	<!-- 下面是登陆表单 -->
	请输入用户名和密码:<hr>
		<html:form action="login.do" method="post">
			<bean:message key="username" />:<html:text property="username" />
			<br>
			<bean:message key="password" />:<html:text property="password" />
			<br>
			<html:submit>
				<bean:message key="login"/>
			</html:submit>
			<br>
		</html:form>
	</body>
</html>


由于在本项目中用到了资源文件,因为有了资源文件的支持,JSP页面只需要简单的<html:errors/>标签就可以生成全部的出错信息,下面是资源文件:
# -- standard errors --
username=用户名
password=密码
login=登陆
noname=请输入用户名,然后在登陆
nopassword=请输入密码,然后在登陆
#html:errors将自动加载errors.header作为出错提示标题
errors.header=<h3><font color="red">验证出错</font></h3>你必须按以下提示修改你的输入才能继续....
error.username={0} 必须填写.<br>
error.password={0} 必须填写.<br>
#html:errors将自动加载errors.footer作为出错的最后一行
errors.footer=<h3><font color="green">你完成上面提示部分</font></h3>


注:上述资源文件还不能直接在项目中应用,在使用前需要转换成unicode格式。
命令:native2ascii MessageResources_zh_CN.properties MessageResources.properties


以上是使用ActionForm进行数据验证的方法,但是使用ActionForm的数据验证有个显著的问题:ActionErrors和ActionError都是struts不在推荐使用的类,因此,应尽量避免使用这种验证方法。

1.2  Action的代码验证
     在Action里通过代码完成输入验证,是最基本,也是最容易使用的方法。与当初的MVC设计相似,在调用业务逻辑组件之前,先对数据进行基本的验证,这是最传统也是最原始的方法。
      在Action里面完成数据验证,实际上就是在execute方法前面增加数据验证的部分代码。下面是增加了数据验证Action代码:

import java.sql.ResultSet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import cn.com.newcom.dao.DbDao;

public class LoginAction extends Action {

	@Override
	//必须重写核心方法,该方法负责处理用户的请求
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		//解析用户请求参数
		LoginActionForm  laf = (LoginActionForm)form;
		String username = laf.getUsername();
		System.out.println(" 您输入的用户名是:"+username);
		String password = laf.getPassword();
		//出错提示
		String errMsg = "";
		// 完成服务器端的校验
		if (username == null || username.equals("")) {
			errMsg += "您的用户名丢失或没有输入,请重新输入!";
		} else if (password == null || password.equals("")) {
			errMsg += "您的密码丢失或是没有输入密码,请重新输入!";
		} else {
                   //如果通过校验,则开始调用业务逻辑
		}
	}
	
}


    这种校验方式非常容易理解,所有的代码都需要程序员自己控制,相当灵活。但有几个不方便的地方:

  • 需要书写大量的验证代码,是程序变得繁琐
  • 数据验证应该在填充ActionForm里完成,最好能在客户端完成检验,而不是推迟到Action里才完成数据校验。


注意:在实际的使用中,这种校验方式不仅使程序开发变得复杂,且性能也不高。



1.3  Validator验证框架
    利用Struts的提供的Validator验证框架可实现客户端和服务器端双验证。Struts的Validator验证框架定义了常用的十几个验证规则,如:required(验证非空)、minlength(验证最小长度)、maxlength(验证最大长度)、intRange(验证整形范围)、email(验证电子邮件地址)、date(验证日期)等,并且实现了客户端的Javascript验证和服务器端验证,以下是在myeclipse环境下使用Validator验证框架的步骤:
  1. 配置
目前使用的版本是Struts1.2.9(下载地址:http://struts.apache.org/download.cgi),里面有validator-rules.xml和validator.xml两个文件,在使用Validator之前,需要先配置一些东西。
  1)必要的包:
   将Struts发行包中的commons-validator.jar和jakarta-oro.jar这两个文件放到Web应用的WEB-INF/lib目录中。
  2)自己定义的FormBean需要继承ValidatorForm,代码如下
import org.apache.struts.validator.ValidatorForm;

public class LoginActionForm extends ValidatorForm {
	
	private static final long serialVersionUID = 1L;
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}


注:Validator框架不能用于验证标准的org.apache.struts.action.ActionForm类。如果要使用Validator框架应该采用ActionForm类的两个子类:DynavalidatorForm和ValidatorForm。

3)编写表单域时必须满足的校验规则。校验规则都由规则文件控制,规则文件有以下两个:  
  1. validator-rules.xml文件
  2. validation.xml文件


   第一个文件可在struts的解压缩后的文件夹lib下找到,只需将该文件复制到WEB-INF路径下,该文件是通用文件,一般不需要修改。除非打算修改或扩展这组规则,否则无需修改这个文件!
注意1:需要在资源包(ApplicationResources.properties)中加上一下的“键-值”:
# -- standard errors --
username=username
password=password
login=submit
noname=please enter name
nopassword=please  enter password

# Struts Validator Error Messages
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.

errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.

errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.

#loginForm 
loginActionForm.login=username


因为,验证出错的时候,系统会自动在资源包中查找对应的错误消息, 比如:required验证规则出现错误时,就会输出“errors.required”的值。

注意2:在Struts 1.2.9中,验证类使用的是:“org.apache.struts.validator.FieldChecks”,
以前使用的是“org.apache.struts.util.StrutsValidtor”,
只要是从struts 1.2.x发行包中拷贝的“validation-rules.xml”文件,就可以保证是正确的。
    而第二个validation.xml文件则是属于你自己项目的校验文件,负责每个表单域必须满足的规则,同样也要放在WEB-INF路径下面:
下面是本示例程序的validation.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0.1//EN" 
"validator_1_0_1.dtd" >
<!-- 检验规则文件的根元素 -->
<form-validation>
	<!-- 所需要校验的form都放在formset元素里面 -->
	<formset>
		<!-- 定义需要校验的表单,此处的name必须与struts-config.xml中定义的FormBean的名字一致 -->
		<form name="loginActionForm">
			<!-- 每个field元素定义一个表单域,即要验证的字段;必须满足怎样的规则 -->
			<field property="username" depends="required">
				<!-- field:要验证的字段,即属性,depends:依赖的验证规则 -->
				<arg0 key="loginActionForm.login" />
				<!-- arg0:在资源包中配置错误消息的{0}参数值 -->
			</field>
			<field property="password" depends="required,minlength">
				<!-- 多个验证规则用逗号分割 -->
				<arg0 key="loginActionForm.password" />
				<arg1 name="minlength" key="#{var:minlength}" resource="false" />
				<!-- resource:false该key的值不在资源包中给出,而是在本文件给 -->
				<var>
					<!-- 定义变量,给上面的key所用 -->
					<var-name>minlength</var-name>
					<var-value>5</var-value>
				</var>
			</field>
		</form>
	</formset>
</form-validation>


4)在struts-config.xml中设置插件:
 
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
		<set-property property="pathnames"
			value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
	</plug-in>


注:value值用来指定验证规则的文件的路径,多个验证规则文件要用逗号分割

同时还要在该文件中的Action元素里面增加两个属性:input属性和validate属性,input属性指定不满足规则时返回的页面,应该将validate的属性值设置为true。

  5)修改JSP页面
   代码如下:
  
<%@ page language="java" contentType="text/html; charset=GB2312" errorPage="error.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>  
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>  
<html:html>
  <head>
    <!-- 使用国际化资源文件的key输出标题 -->
    <title><bean:message key="login"/></title>
  </head>
   
  
  <!-- 下面的标签用于输出出错信息 -->
  <html:errors/>
  

  <body>
	<font color="red">
	<%
	//用于输出出错信息,出错信息保存在request的err属性中
		if(request.getAttribute("err")!=null) {
			out.println(request.getAttribute("err"));
		}
	%>
	</font>
	<br><br>
	<!-- 下面是登陆表单 -->
	请输入用户名和密码:<hr>
		<html:form action="login.do" method="post" onsubmit="return validateLoginActionForm(this);">
			<bean:message key="username" />:<html:text property="username" />
			<br>
			<bean:message key="password" />:<html:password property="password"/>
			<br>
			<html:submit>
				<bean:message key="login"/>
			</html:submit>
			<br>
		</html:form>
		<html:javascript formName="loginActionForm"/>
	</body>
</html:html>




注:实现客户端的javascript验证,只需在<form onSubmit=”return validateLonginActionForm(this);”>配置提交事件和使用<html:javascript formName=”loginActionForm”/>





分享到:
评论
4 楼 完美追随者 2009-06-26  
在使用struts1 验证编辑页面的时候,如果验证出错,返回后就没有值了,是因为request中的对象已不存在,那么大家在实际项目中是怎样解决的,(不要说你用js,不用这种方式验证,这个不是这次讨论的问题),我是把bean放到session中,虽然能解决这个问题,但是,不够友好,听听大家的解决办法
3 楼 penrcz 2009-06-19  
请问这个怎么和spring融合呢?

我把Validator ActionForm改成ValidatorForm

spring就不起作用了
2 楼 youfengkai 2009-02-09  
另外,应该在struts-config.xml中,配置Action的validate="true"和input属性
1 楼 youfengkai 2009-02-09  
validation.xml中,<arg1 name="minlength" key="#{var:minlength}"
#应该为$

相关推荐

    struts框架详细介绍

    以下是Struts框架的详细知识点: **MVC模式** - **模型(Model)**:模型是应用的核心部分,负责处理业务逻辑和数据管理。它通常由JavaBean组成,封装了业务对象和业务处理方法。 - **视图(View)**:视图是用户...

    struts2验证框架

    在本文中,我们将主要介绍 Struts2 的服务器端验证机制。 Struts2 验证框架的组成 Struts2 验证框架主要由以下几个组件组成: 1. Validator Framework:Validator Framework 是 Struts2 验证框架的核心组件,负责...

    Struts2校验框架应用

    Struts2作为一款流行的Java Web开发框架,提供了一套强大的校验框架,使得开发者能够方便地对用户输入数据进行验证,确保数据的准确性和安全性。本文将深入探讨Struts2校验框架的应用,包括其核心概念、配置方式、...

    Struts验证框架配置详解

    Struts验证框架是Java Web开发中的一个重要组成部分,它主要用于确保用户输入的数据符合应用程序设定的规则,从而提高数据的准确性和安全性。本篇文章将深入探讨Struts验证框架的配置过程,帮助开发者更好地理解和...

    struts验证框架实例

    Struts验证框架通过提供一种结构化的验证机制,使得开发者能够更方便地对用户提交的数据进行校验。 Struts验证框架实例通常包括以下几个部分: 1. **ValidatorForm**: 这是Struts验证框架的基础,继承自`org....

    struts2校验框架使用心得.txt

    其中,Struts2提供的校验框架是其核心特性之一,能够有效地进行表单验证,并且支持多种验证方式。 #### 二、配置Struts2框架 为了使用Struts2框架,首先需要在项目的`web.xml`文件中配置过滤器。下面的示例展示了...

    struts验证框架的实例

    Struts验证框架是Java开发中一个非常重要的工具,主要用于处理Web应用中的用户输入验证。它提供了模型驱动的数据验证机制,确保从用户接收到的数据在被处理前满足预定义的业务规则,从而避免了无效数据引发的错误。...

    struts1验证框架相当好的经典例子

    下面将详细介绍Struts1验证框架的使用。 首先,我们来看一下如何设置Struts1的验证框架。在`struts-config.xml`配置文件中,你需要定义一个`form-bean`,这代表一个表单 Bean,例如`userValidateForm`,并指定其...

    struts2.0的数据校验框架struts2.0的数据校验框架

    struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架struts2.0的数据校验框架

    struts2框架2016版资料day01

    5. **拦截器**:拦截器是Struts2的一大特色,它允许开发者在Action调用前后插入自定义逻辑,比如日志记录、权限验证、数据校验等。在day01的课程中,你可能会学习如何定义和使用拦截器,以及如何在配置文件中配置...

    struts2验证框架简单实例

    在Struts2框架中,验证框架是其一个重要组成部分,用于确保输入数据的准确性和完整性,从而防止因无效数据导致的程序异常或错误。本实例将带你深入理解Struts2验证框架的使用,以及在实际操作中可能遇到的问题和解决...

    struts验证框架例子

    Struts验证框架是Java Web开发中的一个重要组成部分,主要用于处理用户输入的数据验证。它与MVC(Model-View-Controller)架构紧密结合,为开发者提供了一种规范化的、可扩展的方式来验证表单数据,确保应用程序的...

    struts 验证框架 demo

    通过这个Demo,开发者可以了解Struts验证框架的工作原理,学习如何在实际项目中应用它来提高数据质量和安全性。不过,"请不要下载哈..."的描述可能意味着这个示例可能已经过时或者不再可用,建议寻找官方的或者更新...

    java做的struts验证框架例子

    这个"java做的struts验证框架例子"是为了展示如何在Struts中实现数据验证。在Java Web开发中,数据验证通常分为客户端验证和服务器端验证两部分。客户端验证可以在用户提交表单前通过JavaScript进行,而服务器端验证...

    Struts2框架源码

    Struts2框架是Java Web开发中的一个流行框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了一种结构化和可扩展的方式来构建应用程序。此压缩包文件包含的是Struts2的源码,特别适合初学者研究和学习...

    Hibernate+struts2框架

    例如,当用户提交登录表单时,Struts2会调用LoginAction的execute方法,该方法负责校验用户输入并根据验证结果返回不同的结果视图,如登录成功跳转到主页面,失败则返回错误提示页面。 管理员和普通用户的区分可能...

    Struts2框架及注释和用法

    Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,为构建可维护性高、结构清晰的Web应用程序提供了一种解决方案。这个框架旨在简化开发过程,提高代码的可测试性和可重用性。下面...

    struts验证框架-validation的验证框架

    下面将详细介绍Struts验证框架中的各种验证类型及其应用场景。 ### 枚举类型:ValidatorType `ValidatorType`是Struts验证框架中预定义的一系列验证类型的集合,包括但不限于: - **Field校验字段**:针对单个...

    Struts 2及AJAX框架的详细介绍

    在"从Struts应用开发框架转移到Struts 2 WEB框架 教程.doc"中,可能详细讲解了以下几个方面: 1. **Struts 2的基础概念**:包括Struts 2的核心组件、配置文件、生命周期等基本知识。 2. **Action类和结果类型**:...

Global site tag (gtag.js) - Google Analytics