李晓静 魏振钢
摘要摘要:Spring和Hibernate是轻量级J2EE应用的开源框架,用于企业级应用开发。针对传统的Spring+Hibernate进行项目开发时,对用户请求的处理都是通过Spring MVC实现的。大量controller需要使用XML配置文件编写,造成了配置复杂和难以维护的弊端。由此提出Spring+Hibernate框架(NSH)通过注解和代理类实现,不需要对每个控制器进行配置,减少了配置的复杂性。通过结合后台管理系统的开发经验,采用Spring注解技术,对控制层和业务逻辑层进行管理;为了进一步提高Servlet访问速度,提供了Servlet代理类实现请求的分发;持久层使用Hibernate进行数据的操作。应用该方案降低了对Spring配置文件的依赖,提高了Web应用程序的可维护性。
关键词关键词:Hibernate;Spring;注解;Web应用开发
DOIDOI:10.11907/rjdk.162725
中图分类号:TP319
文献标识码:A文章编号文章编号:16727800(2017)005006903
0引言
随着计算机技术的发展,电子商务、信息管理等Web应用得到快速发展,J2EE是企业广泛使用的信息平台,包括Hibernate、Spring和EJB等多种开源框架。但是,每一个框架都有自身的优势和不足,通过整合使框架充分发挥各自的特点,实现高效率的开发是必然的选择。Spring 框架是当前流行的轻量级一站式企业应用程序解决方案,具有易于维护、分层清楚等优点;Hibernate框架管理Java实体类到数据库表之间的映射关系,并且提供数据查询和获取的方法,可以大幅缩短使用JDBC处理数据持久化的时间。在Hibernate和Spring的组合中,Spring负责事务管理和封装Hibernate对象,Hibernate实现数据库操作任务。但是,当处理页面提交请求时,需要Spring MVC的协助,存在以下问题:①当DispatchServlet将请求通过处理器映射(如SimpleUrlHandlerMapping)時,需要在配置文件中管理,多种请求就会使配置文件臃肿、可读性差;②即使通过@RequestMapping注解映射,也需要在每一个控制器类上配置地址,不仅麻烦,而且出现问题修改复杂;③控制器类需要交给Spring管理,bean配置繁琐;④完成业务处理后,需要对返回的ModelAndView中的逻辑视图名进行解析,效率不高。
本文使用Spring+Hibernate框架(NSH),并用Servlet代理类进行请求映射,不需要配置Spring文件。而且,使用注解管理控制器类,也省去了配置XML的麻烦,返回的对象直接通过Servlet响应到页面,效率高。同时,此框架也应用于后台管理系统Web项目开发中。
1框架简介
Hibernate是采用ORM映射机制进行持久层数据开发的工具,它是Java 应用程序和关系数据库中间的桥梁,负责对Java 对象和关系型数据之间的映射。内部封装JDBC进行访问数据库操作, 其向上层应用对象提供面向对象的数据库访问API,使开发者能充分运用面向对象的编程思维来操作数据库, 而无需考虑底层数据库操作[12]。
继Spring 2.0对Spring MVC进行升级后,Spring 2.5又为Spring MVC引入了注解驱动功能。即无需让Controller继承任何接口,无需在 XML 配置文件中定义请求和 Controller 的映射关系,仅使用注解就可以让一个 POJO 具有Controller的绝大部分功能。相比传统的继承Controller体系中某些类的方式,Spring MVC的注解具有以下优点:①Controller不再需要继承某个特定类,只是简单的POJO;②请求映射的配置非常方便灵活;③参数绑定机制非常方便丰富;④可以根据不同的http方法或者参数,细粒度处理不同的http请求[3]。
代理模式的主要作用是为其它对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式的思想是为了提供额外的处理或者不同的操作,而在实际对象与调用者之间插入一个代理对象[4]。
本文用到的NSH框架是由Spring和Hibernate两个开源框架组合,并结合一个代理类实现。表现层通过JSP实现;控制层通过代理类实现请求调度;业务层用Spring,Spring通过注解让控制层调用业务逻辑层;持久层用Hibernate,Hibernate操作数据的访问。首先用户发送请求,服务器获得请求后根据web.xml监听到*.do请求,并将地址提交给ServletToBeanProxy代理类处理,获取需要的控制类名称,通过Spring的管理找到控制类,调用Servlet(@Controller注解),在控制类中使用service(@Component注解)的相关方法,通过Hibernate处理数据库操作,最后将返回的结果响应到JSP页面。框架处理请求流程如图1所示。
2应用实例
本文结合一个电子商务的后台管理系统的开发经验说明NSH框架的应用。系统采用MVC设计模式,视图层提交请求后,由Servlet代理类实现请求的转发和业务逻辑的调度,最后由Hibernate操作数据库等技术实现数据库的持久化操作。
2.1业务逻辑层
Spring提供了强大的IOC容器来管理bean,这些bean构成了Spring的配置文件。为了利用这个容器管理的服务,需要配置bean,使它处于IOC容器的管理中[5]。添加商品品牌的业务逻辑类BrandService通过注解的方式把它实例化到Spring容器中,相当于在applicationContext.xml文件中配置bean,这个bean对应Spring容器里的java实例。当使用Service时,只需用@Resource注解就可调用service中的相关方法。
@Component("brandService")
public class BrandService{
public boolean AddBrand(String brandname){
......
//Hibernate操作数据库,发送并执行sql语句,进行持久化操作
}
}
2.2控制层
控制层可以将获得的客户端请求参数等信息进行处理并调用相关的业务逻辑类。在Servlet 3.0中,可以使用标注(Annotation)来告知容器哪些Servlet会提供服务以及额外信息。当管理员单击添加品牌时,调用BrandAddServlet,在BrandAddServlet类中使用@Controller注解,将这个类变成Spring管理的bean。通过使用此注解,就不需要在Spring配置文件中配置控制器类,减少了xml的臃肿。同时,使用@Resource注解来激活一个命名资源的依赖注入,拥有与@Resource注解所提供名字相匹配的“bean name(bean名字)”的Spring管理对象会被注入,这样就可以调用相关的业务逻辑方法。
2.3Servlet代理类
一般情况下,在应用中普通的JavaPojo都是由Spring来管理的,所以使用autowire注解来进行注入不会产生问题,但是也有例外:如Filter、Servlet,都是由Servlet容器来维护管理的,所以如果想和其它的Bean一样使用Autowire来注入的话,需要做额外工作[6]。笔者实现了一个代理类ServletToBeanProxy用于实现其它bean的注入,然后使用代理Servlet来辅助配置和运行,完成业务逻辑功能。这样,不仅不需要urlMapping处理映射,配置Spring文件,降低了对配置文件的依赖,而且省去了使用@RequestMapping时对每一个控制器添加地址的弊端。
Servlet代理类先要继承Servlet接口GenericServlet 主要用于定义和初始化Servlet,重写相关方法处理用户请求;然后在service方法中根据获取到的请求地址解析出控制器类名称,最后根据Spring的管理找到对应控制器类,在控制器类中调用业务逻辑类实现操作。
2.4配置文件
(1) 在web.xml中配置好Servlet代理类,当用户的请求地址中出现*.do时,到对应的ServletToBeanProxy类中执行。
<!--业务层和持久层的Spring配置文件,这些配置文件被父Spring容器所使用。在这里,通过contextConfigLocation参数指定业务层Spring容器的配置文件(多个配置文件使用逗号分隔),ContextLoaderListener是一个ServletContextListener,它通过contextConfigLocation参数所指定的Spring配置文件启动“业务层”的Spring容器[7]。 -->
3结语
本文阐述了Spring和Hibernate的概况,研究其技术特性,并结合理论,通过一个管理系统的开发经验,演示了完整的开发步骤。通过实例可以看出,使用NSH框架,减少了大量的bean配置,而且不需要了解配置中是如何放置的,不需要一遍遍地检查配置文件的正确性。但是Spring注解有一个问题是加载顺序,XML里定义的bean比在注解里定义的加载早,有时还得依赖XML。如果用了注解,那么在启动阶段(listen和filter)则找不到bean;而且如果对注解进行修改,需要重新编译整个工程。因此,如何在Spring基本流程的基础上,使Spring注解更好地加载和修改是进一步研究的方向。
参考文献参考文献:
[1]蔡雪焘.Hibernate 开发及整合应用大全[M].北京:清华大学出版社,2006.
[2]朱庆伟,吴宇红.一种对象/关系映射框架的分析和应用[J].电子科技,2004,12(1):5457.
[3]springmvc注解配置详解及其demo代码下载[EB/OL].http://www.zuidaima.com/share/1751864352705536.htm.
[4]spring AoP学习——spring设计模式之代理模式[EB/OL].http://www.cnblogs.com/Qbright/archive/2012/07/25/2605235.html.
[5]GARY MAK,JOSH LONG.Spring enterprise recipes[M].Apress,2009:161.
[6]如何使用spring的autowire为servlet注入bean[EB/OL].http://blog.csdn.net/yaerfeng/article/details/7368541.
[7]陈雄华,林开雄.Spring 3.x企业应用开发实战[M].北京:电子工业出版社,2012.2.
[8][美]戴克.Spring MVC学习指南[M].林仪明,崔毅,译.北京:人民邮电出版社,2015.5.
責任编辑(责任编辑:陈福时)