基于Struts+Hibernate+Spring的系统设计和开发
俞国红
(健雄职业技术学院 计算机工程系,江苏 太仓 215411)
摘 要:阐述了以J2EE(JSP、JavaBean、Servlet)、SSH(Struts、Spring、Hibernate)开源框架为核心技术,逐步构建软件架构原型,构建系统原型作为系统开发的基础,提出了基于Struts、Spring和Hibernate框架的轻型J2EE软件架构技术的系统设计和开发方法。
关键词:J2EE;Struts;Spring;Hibernate;架构
中图分类号:TP311.52 文献标识码:A
1 前言
J2EE(Java 2 Enterprise Edition即Java 2 平台企业版)是由Sun公司主持推出的一项中间件技术。EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。但由于EJB的复杂性,导致程序的开发效率低。在Spring和Hibernate等轻量
级框架出现后,大量的开发人员转向到以目前最流行的开源框架,能快速开发出结构清晰、可重用性好、维护方便的轻量级的J2EE企业系统应用。
2 Web应用的分层分析
构架Web企业系统应用时需要考虑用户交互、处理业务逻辑、应用数据持久化、扩展性等很多问题,所以一个应用的架构方案和实现技术选择十分重要。而分层的目的就是对应用的逻辑功能进行划分,使每层在完成自己功能的同时,不影响其它层,实现“高内聚,低耦合”具有易于控制、扩展、维护的优点,图1是一个典型的轻量级J2EE应用架构,Web应用分层结构基本上都分为三层:表现层、业务逻辑层、数据持久层。
表示层用来处理用户和软件之间的交互,它主要的责任是向用户展现信息以及处理用户请求。业务逻辑层,又叫做领域逻辑层。其职责包括处理业
图1 典型的Web应用分层结构
Fig.1 Typical Web application hierarchical structure
务逻辑和存储业务数据,校验从表示层传过来的数据,通过表示层提交的命令来执行相应的业务逻辑。数据持久层是用来存取业务状态数据的。数据持久层通过与其他系统进行通信来完成应用的调用。其职责包括事务监控、消息系统、数据源等。在大多数的系统应用中,数据持久层最基本的功能就是存储持久化数据到数据库中。
三层体系结构图中箭头所示的方向,表示各个层之间的数据调用和依赖关系。这个依赖暗示了分层系统的特性规则:一层中的组件只能与同一级别中的对等实体或较低级别中的组件交互。可以看到,业务逻辑层不会访问表示层中的内容,同样,数据层也不会访问业务逻辑中的内容。这个规则使得在同一个基础架构上实现不同的表示层成为可能,同时使得表示层的修改并不会影响到更深层次的实现。
3 Struts框架分析
Struts最早是由Xerox(施乐)在20世纪80年代为Smaltalk-80语言发展提出的。随后,它成
为了一种著名的用户界面设计架构,其实现原理如图2。
图2 MVC模式的Struts实现
Fig.2 Struts Implementation of MVC Model
Struts框架为Web应用提供了一个通用的框架,正因为它把应用分成了三部分:视图、控制器、模型。Struts有其自己的控制器(Controller),同时整合了其他技术去实现模型层(Model)和视图层(View)。在模型层,Struts可以很容易的与数据访问技术相结合,包括EJB,JDBC和Object Relation Bridge。在视图层,Struts能够与JSP,Velocity Templates,XSL等等这些表示层组件想结合。
按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护。
Struts的MVC框架从系统中抽象出三个角:
(1)JSP页面:仅负责数据显示,即MVC框架中的视图角。
(2)Servlet:负责接收客户端的请求和用户申请,负责调用后端的JavaBean,即MVC框架中的控制器角。
(3)JavaBean:负责封闭业务逻辑实现,即MVC框架中的模型角。
4 Spring框架分析
Spring 框架是一种轻量级J2EE 应用框架, Spring既是一个AOP框架和IoC容器,控制反转(IoC)是“基于组件的体系结构”的设计模式,它将“判断依赖关系”的职责移交给容器,而不是由组件本身来判断彼此之间的依赖关系。其插件式架构降低了组件间的依赖性。
在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但是在Spring里,创建被
调用者的工作不再由调用者来完成,因此称为控制反转(IoC) 。创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入(DI)。
图3 Spring的系统架构图
Fig.3 Spring System Architecture Drawing
如图3所示是摘录自Spring的技术文档中的系统架构图,在该图中展示了Spring框架中7个定义良好的、相互独立的模块组件。应用系统开发者可以选择仅仅使用其中的任何一个独立的组件。
Spring框架一项最基本的功能是充当创建对象的工厂,在大多数情况下开发人员并不直接使用BeanFactory,而是使用ApplicationContext。它也是BeanFactory的一个实现。org.springf
ramework.beans.factory.BeanFactory是Spring IoC容器的核心接口,Spring使用BeanFactory来实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。IoC将控制职责搬进了框架中,并脱离应用代码。使用IoC容器则只需指出组件需要的对象,在运行时容器会提供给它。容器基于方法名作出这种说明,或可能根据配置数据如XML。
Spring框架的使用,将J2EEstruts框架是干什么的层次结构中的业务层分离为业务逻辑层和数据持久层,业务逻辑交给Spring处理,而数据访问则交给Hibernate处理,使得层次结构更加清晰,便于系统的维护和扩展。
5 Hibernate框架分析
Hibernate框架诞生在2001年11月,Gavin King是它的创始人。Hibernate是一种运用DAO设计模式来实现对象和关系数据库之间映射(O/R Mapping)的开源框架。对象关系映射(O/R Mapping)是现在最流行的一种数据库持久化方案。
Hibernate工作在持久层,它响应来自Spring对数据库的操作请求。Hibernate的DAO实现类继承HibernateDaoSupport类,根据一系列O/R映射文件以及数据源或连接池,与数据库进
行连接,实现“操作一个对象就是操作数据库的一行数据”的目的,并完成对Spring层对DAO接口的操作的响应。 Hibernate拥有自己的一种查询语言(HQL),它是完全面向对象的, Hibernate 使用 XML 文件将 Java 类映射到表,将 JavaBean 属性映射到数据库表。其在应用中的基本结构,如图4。
图4 Hibernate在应用中的结构图
Fig.4 Hibernate Structor in Solution
6 结合Struts、Spring和Hibernate的架构研究
Spring是以简化J2EE的应用开发为目标而诞生的,系统通常使用Spring作为核心,向上整合Struts 的MVC框架,向下整合Hibernater的ORM框架。使用Spring的IOC容器来管理各组件之间的依赖关系。
6.1 整合Struts+Spring的开发架构
通过对Struts的分析,Struts框架需要人为控制事务。在不引入Spring框架的情况下,程序需要手动管理SessionFactory实例,如通过工厂来管理SessionFactory实例,然后在l文件中通过load-on-startup的Servlet或Listener来完成SessionFactory的实例化。上述这些缺陷给开发人员带来了极大的不便。
在Spring IoC容器的内部,IoC容器负责管理所有的业务逻辑组件、DAO组件以及Struts的Action。组件与组件之间的依赖通过Spring的依赖注入进行管理,从而降低了系统异构的代价。
Spring整合Struts的方法主要有如下三种:使用Spring的actionsupport类整合Struts;使用Sp
ring的delegatingrequestprocessor覆盖Struts的request- processor;将Struts的Action管理则委托给Spring框架。
当使用Struts作为MVC框架时,客户端的HTTP请求都是直接向Action的,那么如何让ActionServlet请求转发给Spring容器中的Action中呢?采取的方法是:使用Spring的delegatingrequest- processor覆盖Struts的requestprocessor。当Action- Servlet转发用户请求时,并没有转发给实际的Action处理类,而是转发到Spring提供的Delega- tingActionProxy类,这个类负责将所有的请求转入Spring容器内,通过这种方式,可以实现Struts和Spring的整合。
6.2 整合Spring+Hibernate的开发架构
整合了Spring+Hibernate的开发架构的应用系统,从整体结构上严格按DAO层、业务逻辑层、控制器层的方式进行分层,系统各类的组件被封闭在自己层内。系统将所有的DAO组件封装在DAO层内,提供DAO工厂管理DAO组件。将所有的业务逻辑组件封装在业务逻辑层内,使用业务逻辑组件工厂来管理业务逻辑组件。例如,当系统的业务逻辑组件需要DAO实例时,通过调用DAO工厂的getDao方法来获取DAO实例,而不是自己创建一个DAO实例,
降低了组件之间的耦合。
Spring提供了HibernateDaoSupport、Hibernate- Template、HibernateCallBack三个工具类(或接口)来支持DAO组件的实现。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论