`
helloqiner
  • 浏览: 24799 次
  • 来自: ...
文章分类
社区版块
存档分类

在Nutz框架中提供Pojo校验(验证)功能的支持

阅读更多

 

作为java程序员,往往对于springstrutsHibernateiBatis 等国外的开源框架都比较熟悉。它们的确经典,的确强大,的确好用。但是随着时间的发展,这些框架越来越庞大!Hibernate的核心包已经超过2M, spring呢,它现在已经被拆分为 18 个子项目,而且还有继续扩大的趋势。为了一个小小的功能,引入那么一大堆lib包,任谁都得考虑一下吧。

……

这个问题一直存在,直到 Nutz 框架的出现。

一个不到 900K 的开源框架,不仅包含了 iocaopdaomvclog,还整合了很多好用的工具类,基本上我们做一个项目需要用到的功能都提供了。

还有要说明的是,它可是国人的开源项目哦,提供全套中文文档,及大量的中文注释。国内的开发人员应该会感到比较亲切吧。

 

更详细的信息,请参看Nutz的官方网站: http://code.google.com/p/nutz/ 

Nutz框架虽然提供了很多功能,却独独拉了校验功能的支持。我们知道,一个程序,尤其是Web程序,如果没有服务器端验证,那么将非常容易受到攻击的。

“自己动手,丰衣足食”。既然官方没有提供,那就自己搞一套吧。还好基于Nutz现有的工具类,实现起来并不太复杂。

 

整个验证框架提供了12种常见的验证形式,且支持自定义正则表达式,基本上可以满足实际的需要。对于有特殊要求的字段验证,允许用户自己定义验证的方法。

校验不仅可以用于Web层,你可以把它用于程序的任何层面(如入库前对pojo 字段值进行验证)。

目前验证框架基于注解,因为对于字段的验证需求一般比较固定,所以同代码一块管理比较方便。当然你也可以扩展它,提供其它形式的验证。如果你有更好的改动,请也一并发我邮箱一份哈。

废话不多说,直接上代码吧。

 

/**
 * 验证支持注解
 * 
 * @author QinerG(QinerG@gmail.com)
 */
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.PARAMETER, ElementType.FIELD })
public @interface Validations {

	/**
	 * 必填字段验证规则
	 */
	public boolean required() default false;

	/**
	 * 手机号验证规则
	 */
	public boolean mobile() default false;

	/**
	 * 帐号验证规则(字母开头,允许字母数字下划线),常与字串长度验证规则混合使用
	 */
	public boolean account() default false;

	/**
	 * Email 验证规则
	 */
	public boolean email() default false;

	/**
	 * QQ 号验证规则
	 */
	public boolean qq() default false;

	/**
	 * 字串必须为中文验证规则
	 */
	public boolean chinese() default false;

	/**
	 * 邮政编码验证规则
	 */
	public boolean post() default false;

	/**
	 * 正则表达式验证规则
	 */
	public String regex() default "";

	/**
	 * 重复性验证规则。请放置待比较的字段名
	 */
	public String repeat() default "";

	/**
	 * 字符串最大、最小长度验证规则
	 */
	public int[] strLen() default {};

	/**
	 * 数值型数据取值范围区间验证规则,兼容 int、long、float、double
	 */
	public double[] limit() default {};

	/**
	 * 自定义效验规则,可以自行指定验证的方法名称 <br/> 该方法必须是public的,且没有参数返回值为boolean型
	 */
	public String custom() default "";

	/**
	 * 错误提示语
	 */
	public String errorMsg();
}

 

这就是注解类的全部代码。该注解是字段(FIELD)级别的,所以你可以把它声明在pojo的属性上。

比如:

 

//账号验证规则,与字符串长度区间验证共同作用
@Validations(account = true, strLen = { 3, 16 }, errorMsg = "account")
private String account;

 

允许多种验证同时声明,errorMsg 是错误提示语,必填。

 

pojo需要验证的时候,可以这样写:

 

AnnotationValidation av = new AnnotationValidation();
Errors ers = av.validate(pojo);
       验证错误的信息都存放在 Errors 对象中了,你可以调用 getErrorsList() 返回错误列表,或者调用 getErrorsMap() 字段与错误提示语的对应关系。

这时也许你会说,这种调用方法很麻烦。每次验证的时候,都需要创建 AnnotationValidation 的实例,有没有更简单的方法呢?

没错,Nutz提供了 AOP 的支持,这样我们就可以很方便的用它来进行拦截验证了。

下面是拦截器的全部代码:

/**
 * 基于注解的验证用拦截器
 * <p>
 * 该拦截器主要用于方法参数的验证,要求该方法中必须有一个 Errors 类型的参数(允许为空),当验证完成后会向这个参数赋值
 * 
 * @author QinerG(QinerG@gmail.com)
 */
@IocBean(name = "validationInterceptor")
public class ValidationInterceptor extends AbstractMethodInterceptor {

	private static AnnotationValidation av = new AnnotationValidation();

	/**
	 * 方法调用前进行拦截,遍历参数进行验证
	 */
	public boolean beforeInvoke(Object obj, Method method, Object... args) {
		Errors es = ValidationUtils.checkArgs(method.getParameterTypes(), args);
		if (null != es) {
			for (Object argsObj : args) {
				if (argsObj instanceof Errors)
					continue;
				av.validate(argsObj, es);
			}
		}
		return true;
	}
}
 

注意:该拦截器主要用于方法参数的验证,要求该方法中必须有一个 Errors 类型的参数(允许为空),当验证完成后会向这个参数赋值。

有了这个拦截器,就方便多了。只需要在需要提供验证功能的方法前使用 @Aop("validationInterceptor") 声明,例如:

@Aop("validationInterceptor")
	public Errors test(Bean bean, Errors es) {
		System.out.println(es.errorCount());
		return es;
	}

之后在调用这个方法的时候,拦截器就会自动执行,并将验证结果注入到参数 Errors 中。下面是 junit测试用例:

@Test
	public void testAop() {		
		Ioc ioc = new NutIoc(new AnnotationIocLoader("org.nutz.validation"));
		
		ServiceDemo sd = ioc.get(ServiceDemo.class);
		Bean b = new Bean();
		Errors ers = sd.test(b, null);
		assertEquals(10, ers.errorCount());
	}
 

这样是不就方便了很多?

应用程序可以用 aop 的方式验证,那么 web 程序呢,也可以这样用吗?那是当然了。在 action 前声明拦截器:

@At("/test")
	@Ok("json")
	@Aop("validationInterceptor")
	public int test(@Param("bean")Bean bean, Errors es) {
		System.out.println(Dumps.obj(bean));
		if (es != null) {
			return es.errorCount();
		}
		return -99;
	}
 

action 里即可以取到 Errors 对象,并可以对其进行显示等相关处理啦。

 

附件为全部源代码,及测试用例。欢迎大家拍砖!

 

分享到:
评论
8 楼 conanca 2011-04-20  
用拦截器实现的,不错不错,很有启发,呵呵。
7 楼 无根V稻草 2011-04-20  
不错不错 研究下下
6 楼 helloqiner 2011-04-20  
有一个工具类 ValidationUtils ,里面全是静态方法,可以帮助手工完成验证
例如:
static boolean ValidationUtils.required(String fieldName, Object target, String errorMsg, Errors errors);
5 楼 hastune 2011-04-20  
feiyan35488 写道
非常不错,不过有没有把这些验证方法 做成public static??这样可以在程序任何地方进行使用了


指的是什么方法???
4 楼 feiyan35488 2011-04-20  
非常不错,不过有没有把这些验证方法 做成public static??这样可以在程序任何地方进行使用了
3 楼 hastune 2011-04-19  
2 楼 zozoh 2011-04-19  
但是只能拦截入口函数,如果要拦截业务对象,只能用 AOP 了,呵呵
1 楼 zozoh 2011-04-19  
还有一种解法就是提供 ActionFilter
或者提供一个新的 Prcessor

相关推荐

    nutz框架使用手册.zip

    在"nutz框架使用手册.zip"中,我们可以预期找到关于Nutz框架全面的学习资源,从基础概念到高级用法,帮助开发者从零开始掌握Nutz平台的开发技能。手册可能包含以下主要知识点: 1. **Nutz IOC**:Nutz IOC是Nutz...

    nutz框架开发手册

    - **轻量级**:Nutz的所有功能均不依赖第三方jar包,只需在项目中引入nutz.jar即可使用大部分功能。 - **高效性**:Nutz框架的设计目标之一就是在不影响运行效率的前提下,最大化地提高开发效率。 - **灵活性**:...

    SpringMVC+Nutz框架介绍.pdf

    综上所述,SpringMVC+Nutz框架组合构建的开发平台,以其强大的功能、高度的可定制性和良好的兼容性,为企业级应用开发提供了坚实的基础设施。开发者可以根据项目需求,灵活选择和使用其中的各项技术,以实现高效、...

    新框架Nutz

    Nutz是一个轻量级的开源Java开发框架,它将数据持久化、反转控制(IoC)和Web框架(MVC)集成为一个功能完备的工具集,其核心设计目标是提供小巧、易于理解和使用的功能,而不依赖于其他第三方jar包。 数据持久化是...

    nutz除了ssh框架比较好的框架

    Nutz是一个在中国开源社区活跃的Java Web开发框架,它的出现为开发者提供了另一种选择,特别是对于那些寻求更轻量级、高效且易于上手的框架的开发者。标题提到"Nutz除了SSH框架比较好的框架",这里的SSH指的是Struts...

    nutz邮箱验证jar包

    "nutz邮箱验证jar包"是Nutz框架中用于电子邮件验证的一个特殊库,它为开发者提供了便捷的方式来验证用户的电子邮件地址,以确保数据的准确性和安全性。 在Java开发中,邮箱验证是一个常见的需求,例如在用户注册、...

    nutz搭建的MVC框架

    Nutz是一个轻量级、高性能的Java开源框架,它提供了丰富的功能,包括MVC(Model-View-Controller)架构支持,使得开发者能够快速构建小型到中型的Web应用。本篇文章将详细介绍如何利用Nutz搭建MVC框架,并探讨其在...

    nutz 缓存

    在描述中提到的“NULL”可能是博主在发布时未填写具体描述,所以我们主要通过标签和对Nutz框架的理解来深入探讨Nutz的缓存功能。 在IT领域,缓存是提高系统性能的重要手段,它可以减少对数据库或其他资源的直接访问...

    nutz-1.r.58

    在提供的文件列表中,我们有以下内容: 1. `nutz-1.r.58-javadoc.jar`:这是Nutz框架的API文档,包含了所有类、接口、方法等的详细说明,是开发者理解和使用Nutz框架的重要参考资料。通过这个Javadoc,开发者可以...

    Nutz框架文档

    全 -- 提供了 Dao (ORM, SQL 管理), Ioc, Aop, Mvc, Json解析 等必要功能 活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等 整 -- 它所有功能均不依赖第三方 ...

    SpringMVC+Nutz框架介绍.docx

    SpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+Nutz框架介绍.docxSpringMVC+...

    nutz_redis集成依赖包

    1. **Nutz框架**:Nutz是一个轻量级的Java Web开发框架,它提供了MVC模式,ORM支持,以及丰富的工具类。Nutz的目标是简化开发流程,提高开发效率,使开发者更专注于业务逻辑。 2. **Redis**:Redis是一个高性能的...

    Nutz高效开发框架v1.0.5免费版

    Nutz高效开发框架是国内比较独立强大的技术团队开发的轻量级的框架快捷实用工具,由于可以方便地在各种数据库中调用存储数据,所以可以称之为方便程序员通行的项目大厦的手脚架工具。对于从事数据库相关的程序员来说...

    SpringMVC+Nutz框架介绍范本模板.pdf

    在与传统框架的对比中,SpringMVC+Nutz框架表现出以下优势: 1. **Dao层**: - NutDao简化了数据库操作,避免SQL注入,支持多数据库兼容。 - 支持实体类生成数据库结构,自动初始化表结构和数据,支持动态分表。 ...

    SpringMVC+Nutz框架介绍范本模板.docx

    【SpringMVC+Nutz框架介绍】\n\nSpringMVC 和 Nutz 框架的结合,构建了一个高效的企业级分布式开发平台,该平台具备多种功能,如组织机构管理、角色用户分配、权限授权、数据权限控制、内容管理和微信管理等。...

Global site tag (gtag.js) - Google Analytics