`
fancy888
  • 浏览: 39955 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

使用Hibernate元数据构建表单校验功能

 
阅读更多

      表单数据的检验是应用程序必不可少的组成部分,通常来讲,表单数据的校验分为前台校验和后台校验两部分,前台校验使用JS脚本在提交数据前进行校验,后台校验在数据提交后进行校验。

      出于安全性的考虑,后台校验是必不可少的,当因为某种原因前台校验失效的情况下,由于有后台校验的存在,仍能保证提交数据的合法性和有效性。

      后台校验有许多种方法,有基于配置文件的校验,有基于注释的校验等等,也有许多成熟的校验框架可以使用。本文向大家介绍一种基于Hibernate元数据的校验方法,笔者曾在多个项目中使用,效果非常好,在这里与大家分享。

      应用本文提到的校验方法前应该满足以下几点:

 

  • 该程序持久层使用Hibernate。
  • 页面上的表单与数据库表有对应关系,且表单数据字段名与数据库字段名一致。
  • 最好使用了Spring。
      另外,使用基于Hibernate元数据的校验只能保证校验到字段是否为空、数据类型是否正确、字段长度是否符合三种规则。由于本文提到的方法是采用拦截器的方式在业务层前置进行校验,所以与其它的校验工具之间并不冲突,可以形成有效互补。
public class ValidationInterceptor extends HandlerInterceptorAdapter {

	@Resource(name = "&sessionFactory")
	private LocalSessionFactoryBean sessionFactory;

	@Override
	@SuppressWarnings("unchecked")
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		final String uri = request.getRequestURI();
		//通过请求的URI找到对应的校验实体类,这个需要在外部进行配置
		final String entityName = getValidation(uri);
		//没有配置说明这个请求不需要校验
		if (entityName == null)
			return true;
		//通过实体名返回Hibernate的PersistentClass
		final PersistentClass clazz = sessionFactory.getConfiguration().getClassMapping(entityName);
		//对应的表的元数据
		final Table table = clazz.getTable();
		final Iterator<Column> iterator = table.getColumnIterator();
		final Map<String, String> errors = new HashMap<String, String>();
		while (iterator.hasNext()) {
			//对应的列的元数据
			final Column column = iterator.next();
			//列名
			final String name = column.getName();
			//这是数据库列映射到JAVA中的属性
			final Property property = clazz.getProperty(name);
			//这是前台表单提交上来的值
			final String value = request.getParameter(name);
			//如果值为空,跳过该字段的校验
			if (value == null)
				continue;
			//校验非空
			if (!column.isNullable() && "".equals(value.trim())) {
				errors.put(name, "字段"+name+"的值不能为空!");
			} 
			//校验字符串长度
			else if (property.getType() instanceof StringType) {
				if (value.length() > column.getLength()) {
					errors.put(name, "字段"+name+"的值超长了!");
				}
			} 
			//校验日期类型
			else if (property.getType() instanceof DateType) {
				final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
				try {
					format.parse(value);
				} catch (Exception e){
					errors.put(name, "字段"+name+"必须是日期类型!");
				}
			} 
			//校验数字类型,包括浮点数
			else if (property.getType() instanceof BigDecimalType) {
				int precision = column.getPrecision();
				int scale = column.getScale();
				int front = precision - scale;
				String patten = "";
				for (int i = 0; i < front; i++) {
					patten += "#";
				}
				if (scale > 0) {
					patten += ".";
					for (int i = 0; i < scale; i++) {
						patten += "#";
					}
				}
				final NumberFormat format = new DecimalFormat(patten);
				try {
					format.parse(value);
				} catch (Exception e) {
					errors.put(name, "字段"+name+"必须是数字类型("+patten"+")!");
				}
			}
		}
		//如果没有错误,直接放行
		if (errors.isEmpty())
			return true;
		//有错了,生成描述错误信息的JSON串,返回前台
		response.setContentType("text/json;charset=UTF-8");
		response.getWriter().write(JSONObject.fromObject(errors).toString());
		response.getWriter().close();
		return false;
	}
}
      每个URL需要映射一下校验数据使用的实体类,可以使用一个Propertes文件进行配置,上代码中的getValidation方法需要从这个配置文件中取信息。
/test/save_log.do=com.coolfancy.blog.entity.Log
/test/save_reply.do=com.coolfancy.blog.entity.Reply
      使用这个方法后,基于数据库元数据的校验就不需要再在程序中写了,使用这个拦截器就全搞定了,如果有其它复杂的校验,可以在Action中使用原来的校验方法继续校验。

      更多精彩原创文章请关注笔者的原创博客:http://www.coolfancy.com

0
0
分享到:
评论

相关推荐

    Java Web 基于Spring Struts Hibernate 轻量级架构开发基础

    Hibernate通过实体类、持久化元数据(如XML或注解)以及HQL(Hibernate查询语言)来简化数据访问。在SSH架构中,Hibernate作为数据访问层,负责数据的CRUD(创建、读取、更新、删除)操作。 在"Java Web 基于Spring...

    hibernate-validator

    通过元数据API,开发者可以获取到关于验证规则的信息,这对于构建自定义的验证逻辑或生成动态表单很有帮助。 10. **最佳实践** - 将验证逻辑与业务逻辑分离,保持代码整洁。 - 利用分组验证,根据业务场景选择...

    基于XML配置方式实现对指定action方法校验.rar

    2. `.mymetadata`:可能是MyEclipse特有的元数据文件,保存了项目的一些设置和配置信息。 3. `.project`:Eclipse项目的配置文件,包含项目类型、构建路径、natures等信息。 4. `src`:源代码目录,通常包含Java...

    通过groovy自定义函数实现提取明细表字段至主表字段.rar

    通过观看"通过groovy自定义函数实现提取明细表字段至主表字段.mp4"视频教程,我们可以深入学习如何在实际环境中应用这些知识点,逐步构建并优化这个功能。学习和掌握Groovy自定义函数的使用,不仅可以提升工作效率,...

    ssh_pracice1

    2. `.mymetadata`:这可能是一个特定IDE的元数据文件,存储了关于项目的一些配置信息。 3. `.project`:这是Eclipse项目配置文件,定义了项目类型、构建路径等信息。 4. `WebRoot`:在Web应用中,这是Web服务器的根...

    java结课设计,一款完全基于servlet的网盘系统.zip

    9. **数据库操作**:虽然未明确提及,但网盘系统通常需要数据库存储用户信息、文件元数据等。可能使用了JDBC(Java Database Connectivity)进行数据库连接,或者更高级的ORM(Object-Relational Mapping)框架如...

    spring doc格式

    源码级的元数据功能使得可以在代码中嵌入行为信息。 5. **Web模块**:为Web应用程序提供基础功能,如Multipart处理和基于Servlet监听器的ApplicationContext初始化。它支持与其他Web框架(如WebWork、Struts)的...

    Spring中文帮助文档

    7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSource 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1...

    Spring API

    7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSource 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1...

    SpringMvc的基本jar

    8. **validation-api.jar**:JavaBeans验证API,定义了验证约束的元数据,@Valid注解就是基于这个API进行校验的。 9. **hibernate-validator.jar**:Hibernate提供的JSR-303/JSR-349实现,实现了上述验证API,并...

    Bean Validation 技术规范特性概述

    这包括创建自定义注解(注解类型)、定义验证逻辑(约束验证器)以及配置元数据(例如消息模板)。 **3. 验证上下文(Validation Context)** 验证时,会创建一个验证上下文,其中包含了待验证的对象、验证配置和...

    J2EE应用开发基础

    - **EAR部署描述器**:配置文件中定义的应用程序元数据。 - **一个简单的实例**:演示如何创建并部署一个基本的J2EE应用。 - **可选的应用部署描述器标记**:额外的配置选项。 - **EJB入门** - **定义**:...

    [SpringBoot系列]验证客户端参数接口

    这通常涉及到编写一个元注解(@Constraint)和一个校验器类(实现Validator接口)。自定义注解可以附加到字段上,并在验证过程中执行自定义逻辑。 5. **错误处理** 当验证失败时,Spring Boot会抛出`...

    activiti 5.16 流程管理 中文版

    - **表单属性**:表单的元数据信息。 - **外置表单的渲染**:外部表单页面的生成和展示。 #### 10. JPA - **要求**:使用JPA的基本条件。 - **配置**:JPA配置方法。 - **用法**:如何在Activiti中使用JPA。 - **...

    Java Validation Framework-开源

    在实际应用中,JVF可以与JavaBeans、Spring框架、Hibernate ORM等结合,实现对对象属性的验证,也可以用于表单提交、API参数校验等场景。此外,通过利用JVF提供的事件驱动机制,开发者可以在验证失败时执行相应的回...

Global site tag (gtag.js) - Google Analytics