`

struts2验证框架的使用和扩展

阅读更多

struts2能够对前台提交的表单数据进行输入有效性校验,通常有两种方式:

1、在Action类中通过validatexx方法验证,这种方式很简单,在此不再赘述;

2、通过编写xx-validation.xml文件执行表单验证,当用户提交表单请求后,struts会优先执行xml文件,如果校验不通过是不会让请求访问指定action的。

本文介绍一下struts2通过xml文件进行校验的方法并说明怎么样扩展自定义的验证。

 

一、struts2验证框架的包位置

部署struts2项目有一个必备jar包:xwork-core-*.jar,在这个包中有这样一个package"com.opensymphony.xwork2.validator.validators",所有官方验证类就放在这下面的,在这个包下面有一个"default.xml"文件,这就是验证框架的核心文件,里面配置了所有的验证类数据。

验证类的格式为:<validator name="别名" class="验证类"/>,在配置的时候只需要使用别名就能执行指定验证了。

在这介绍struts2的几个常用的验证类:

required:字段不能为空

requiredstring:字符串不能为空

int:int类型(可指定范围)

long:long类型(可指定范围)

short:short类型(可指定范围)

double:double类型(可指定范围)

date:时间格式(可指定范围)

expression:ognl表达式判断

fieldexpression:ognl表达式判断

email:邮箱判断

url:url路径判断

visitor:把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用)

conversion:格式转换

stringlength:字符串长度

regex:正则表达式判断

这里有个地址详细介绍了这几种验证的使用方法,大家可以参考下:http://code.google.com/p/j2eewiki/wiki/Struts2Validator

以上验证乍看还是非常全面的,但是很多验证功能还不够强大(比如stringlength是把任何文字都当做1的长度,而中文像UTF-8是3个字节的长度,这样验证效果就不准确了),所以很多时候是需要进行自定义验证的,这个随后再说。

 

二、使用xml配置验证

①copy上面提到的"default.xml"文件到Action同级目录下,修改文件名为"action名-validation.xml"。假设有这样一个Action:com.struts.action.UserAction.java,那么你需要将xml文件放到com.struts.action包下面,并且改名为"UserAction-validation.xml"。

②删除标签<validators>里所有的内容,并且更改xml上面的dtd版本为1.0.2.dtd,这里我也不知道为什么1.0.0跑不起,反正改了就能执行了。

<!DOCTYPE validators PUBLIC 
  		"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
  		"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

 ③编写验证文件,field标签表示被验证的字段项,field-validator标签表示使用什么验证约束,short-circuit表示如果有多个验证约束时只要有一个不通过则后面就不执行验证了,message表示验证不通过时返回的错误消息。

<field name="user.name">
	<field-validator type="requiredstring" short-circuit="true">
		<message>用户名不能为空</message>
	</field-validator>
</field>

 按照上面三步,一个基本的验证就出来了,大家可以去试试,只要提交的表单访问UserAction都会先通过xml的验证。假如你只想验证UserAction中的userAdd方法(该方法的请求路径为userAdd.action),则只需要将xml文件改名为"UserAction-userAdd-validattion.xml"即可。[特别注意:这个xml名称中的userAdd并非指Action中的方法名,而是指配置文件中的请求名,就是那个<action name="请求名">]

 

三、扩展struts2验证类

其实自定义验证类很简单,你只需要仿照struts2的任何一个验证类就能做出来,前面提到不能验证utf-8格式的字符长度,我们在这就做一个获取utf-8长度的自定义框架。

①创建验证框架扩展类,这里必须继承 FieldValidatorSupport 类,重写validate方法,具体验证代码就在validate方法中写,这里的get、set就是在xml中出现的属性参数。这段代码还不够好,其实可以把encoding也作为属性的,这样传入任何编码格式都能获取该编码对应的字符长度。

public class CheckStringLength extends FieldValidatorSupport {
	
	private boolean trim;  // 是否去首位空格
	private int minLength; //最大长度
	private int maxLength; //最小长度
	private static final String ENCODING = "UTF-8"; //编码格式(默认utf-8)
	
	/*
	 * 构造方法初始化默认数据
	 */
	public CheckStringLength() {
		this.trim = true;
		this.minLength = -1;
		this.maxLength = -1;
	}
	
	public boolean isTrim() {
		return trim;
	}
	public void setTrim(boolean trim) {
		this.trim = trim;
	}
	public int getMinLength() {
		return minLength;
	}
	public void setMinLength(int minLength) {
		this.minLength = minLength;
	}
	public int getMaxLength() {
		return maxLength;
	}
	public void setMaxLength(int maxLength) {
		this.maxLength = maxLength;
	}

	@Override
	public void validate(Object arg0) throws ValidationException {
		String fieldName = this.getFieldName();
		
		String val = (String) this.getFieldValue(fieldName, arg0);
		
		//如果值为空则直接不通过
		if (val == null || val.length() <= 0) {
			return;
		}
		
		if (trim) {
			val = val.trim();
			////如果值为空则直接不通过
			if (val == null || val.length() <= 0) {
				return;
			}
		}
		
		int length = 0;
		try {
			//根据编码格式获得字符长度
			length = val.getBytes(ENCODING).length;
		} catch (UnsupportedEncodingException e) {
			length = val.getBytes().length;
		}
		
		/*
		 *判断字符长度范围 
		 */
		if (minLength > -1 && length < minLength) {
			this.addFieldError(fieldName, arg0);
		}
		if (maxLength > -1 && length > maxLength) {
			this.addFieldError(fieldName, arg0);
		}
	}
	
}

 

 ②新建validators.xml文件,将"default.xml"的配置信息和自定义验证类的配置信息放到文件中,最后把validators.xml文件放到源码根目录下:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE validators PUBLIC   
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"   
        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">  

<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
    
    <!-- 自定义验证规则 -->
    <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/>
   </validators>

 ③按照前面所说的编写表单验证规则,注意这里的param就是上面CheckStringLength类中的属性,但是属性是根据get、set方法来的 (因为struts2做了一个很蛋痛的事:他的验证类中有这样一个属性"doTrim",但是该属性对应的get、set方法是getTrim、setTrim,配置文件里必须这样写<param name="trim">false</param>,记住是根据set方法配置param)。

<!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="user.name">
		<field-validator type="requiredstring" short-circuit="true">
			<message>用户名不能为空</message>
		</field-validator>
		<field-validator type="stringlengthencoding" short-circuit="true">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>用户名必须是6到10位字符!</message>
		</field-validator>
	</field>
</validators>

基本上一个简单的自定义验证就完成了,大家可以手动试试,这个东西确实很简单。

 

最后附上扩展的几个验证类,希望对大家有所帮助 :

<!-- 根据编码格式获取字符串长度,并且可以校验长度范围 -->
    <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/>
    <!-- 检查常用的格式,目前能验证:邮箱、手机、固定电话和身份证号 -->
    <validator name="checkformat" class="com.bless.struts2.validate.CheckFormat"/>
    <!-- 检查是否是半角字符 -->
    <validator name="checkhalfwidthdigit" class="com.bless.struts2.validate.CheckHalfWidthDigit"></validator>
    <!--  检查字符串格式,这里可以中文、字母、数字和符号任何组合配置 -->
    <validator name="checkspecialchar" class="com.bless.struts2.validate.CheckSpecialChar"></validator>
    <!-- 检查时间 -->
    <validator name="checkdate" class="com.bless.struts2.validate.CheckDate"/>
    <!-- 检查小数值,可以验证小数点精确范围 -->
    <validator name="checkdoublerange" class="com.bless.struts2.validate.CheckDoubleAccuracy"/>

 

最后感谢同事jwt童鞋做的扩展框架。

1
0
分享到:
评论
3 楼 白糖_ 2012-09-21  
chinahnzhou 写道
        if (maxLength > -1 && maxLength > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }

这句话写错了,应该是
        if (maxLength > -1 && length > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }


多谢指正
2 楼 chinahnzhou 2012-09-20  
        if (maxLength > -1 && maxLength > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }

这句话写错了,应该是
        if (maxLength > -1 && length > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }
1 楼 笨鸟刃心 2012-08-19  
谢谢您!有收获!

相关推荐

    Struts2 in action中文版

    10.1.2 Struts 2工作流中的验证框架 219 10.2 将动作关联到验证框架 222 10.2.1 使用ActionClass-validations.xml声明验证元数据 223 10.2.2 研究内建的验证器 226 10.3 编写自定义验证器 227 10.3.1 检查密码强度的...

    OpenID简介及与struts2_spring_hibernate框架集成

    OpenID 是一个以用户为中心的数字身份识别框架,它具有开放、分散、自由等特性。 OpenID 的创建基于这样一个概念:我们可以通过 URI (又叫 URL 或网站地址)来认证一个网站的唯一身份,同理,我们也可以通过这种...

    深入浅出struts2

    开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题——可以通过插件机制...

    struts2讲义_吴峻申

    文档目录 Struts2讲义 作者:吴峻申 目录 第1章 Struts过时了吗? 10 1.1 Struts历史发展过程 10 1.2 Struts2的“简历” 13 ...附录2 Mysql数据库使用和创建Web项目数据库 208 F2.1 安装 209 F2.2 创建数据库 216

    Java验证框架Validation.F0 0.9.0

    这是一个验证框架,并且是一个 独立的验证框架 ,不依赖与其他已有的框架; 可以自由的嵌入到其他框架,比如Spring、Struts等流行框架,但实质来说他是独立的,所以无所谓嵌入到哪里,如果需要在GUI桌面应用中,也是...

    简单且强大的js表单验证框架

    我们中国人写的验证框架,比struts验证框架简单,而且功能强大,容易扩展

    深入浅出Struts2(附源码)

    跟随作者一道深入Struts 2,聆听大量来之不易的经验之谈,你对Struts 2开发框架的理解和应用水平都将更上一层楼。本书适合Java Web 程序员阅读和参考 第1章 Model 2应用程序 1 1.1 Model 2概览 1 1.2 带servlet...

    精通Struts基于MVC的Java Web设计与开发 孙卫琴 光盘

    第8章到第9章介绍了开发Struts应用的一些实用技术,如Struts框架的扩展点、Struts应用的国际化,Validator验证框架和异常处理机制等。第12章到第16章结合具体的Struts应用实例,详细介绍了Struts的标签库以及Tiles...

    精通 Struts:基于 MVC 的 JavaWeb 设计与开发(PDF)

    第8章到第9章介绍了开发Struts应用的一些实用技术,如Struts框架的扩展点、Struts应用的国际化,Validator验证框架和异常处理机制等。第12章到第16章结合具体的Struts应用实例,详细介绍了Struts的标签库以及Tiles...

    精通struts:基于mvc的java web设计与开发part2

    第8章到第9章介绍了开发Struts应用的一些实用技术,如Struts框架的扩展点、Struts应用的国际化,Validator 验证框架和异常处理机制等。第12章到第16章结合具体的Struts应用实例,详细介绍了Struts的标签库以及Tiles...

    其他类别Struts+Hibernate实现MVC-strutsmvc.rar

    这个资料包包含了一个完整的示例项目,用于演示如何使用Struts和Hibernate框架来构建一个可扩展、易于维护的Web应用程序。在这个示例项目中,Struts框架负责处理用户的请求和响应,以及与视图层的交互。它提供了一个...

    精通Struts_基于MVC的Java Web设计与开发

    第8章到第9章介绍了开发Struts应用的一些实用技术,如Struts框架的扩展点、Struts应用的国际化,Validator验证框架和异常处理机制等。第12章到第16章结合具体的Struts应用实例,详细介绍了Struts的标签库以及Tiles...

    精通struts:基于mvc的java web设计与开发part3

    第8章到第9章介绍了开发Struts应用的一些实用技术,如Struts框架的扩展点、Struts应用的国际化,Validator 验证框架和异常处理机制等。第12章到第16章结合具体的Struts应用实例,详细介绍了Struts的标签库以及Tiles...

    精通struts:基于mvc的java web设计与开发part1

    第8章到第9章介绍了开发Struts应用的一些实用技术,如Struts框架的扩展点、Struts应用的国际化,Validator 验证框架和异常处理机制等。第12章到第16章结合具体的Struts应用实例,详细介绍了Struts的标签库以及Tiles...

    基于Java的Struts1登录验证系统设计源码

    本源码项目是基于Java的Struts1登录验证系统设计,包含34个文件,主要使用Java编程语言。该项目通过DAO操作数据库,实现了登录验证功能。系统提供了用户登录、...Struts1框架的使用提高了系统的可维护性和可扩展性。

    struts+hibernate课件

    HTML 标签 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单 Bean 标签 在访问JavaBeans 及其属性,以及定义一个新的bean 时使用 Logic 标签 管理条件产生的输出和对象集产生的循环 Template ...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

Global site tag (gtag.js) - Google Analytics