时间:2022-10-02 02:15:43
[摘要] 基于Struts、Spring和Hibernate对企业信息系统进行分层。在强调它们技术原理的基础上并结合应用实例,提出三种开源框架的整合方式,应用它们作为一种企业信息化解决方案。实现了系统各层次的松耦合,提高了扩展性、复用性和可维护性,具有一定的现实意义。
[关键词] 企业信息化 轻量级框架 Struts Spring Hibernate J2EE
目前软件系统发展已经相当复杂。大型企业信息系统的设计者越来越注重通过一个合适的框架完成系统开发。基于J2EE企业信息系统的平台无关性、层次性、安全性与可扩展性正成为企业信息化的主要解决方案。因此本文通过集成Struts、Spring和Hibernate来实现模块间的解耦,以提高企业信息系统的扩展性、复用性和可维护性。
一、J2EE框架技术
Struts起源于SmallTalk的MVC。即Model、View和Controller。由Controller解耦显示逻辑与业务逻辑,支持实现松耦合结构。面对WebWork、Spring MVC、JSF、Tapestry等,Struts设计成熟、信息资源丰富、开发群体广泛,是目前最常用的表现层MVC。
Spring是一种为解决企业应用程序开发复杂性的轻量级应用程序框架和容器。集成了J2EE许多最佳与前驱性实践。具有传统EJB的关键服务而不依赖于任何组件替代重量级EJB框架。扩展了所集成的组件并提供更高级功能。Spring完成了实际开发所需的单态模式与工厂模式。核心机制是DI(Dependency Injection)与IOC(Inversion of Control)。通过DAO和ORM 实现数据访问的抽象模块,并支持Hibernate。
Hibernate是低侵入ORM(Object-Relationship Mapping)框架。联接了面向对象程序设计语言和关系型数据库。实现了对JDBC的轻量级封装。通过J2EE中的JDBC、JTA、JNDI实现Session、Transaction和数据库连接管理。由HQL以面向对象方式查询持久化对象。ORM框架还包括OJB、TopLink等。OJB是Apache的子项目,开发文档不多,规范一直不很稳定,并未得到广泛支持。TopLink一旦作为商业产品使用则要收取费用。
二、框架的整合与实践
对于一个企业信息系统来说,考虑到虽然系统中各模块实现不同,但原理大同小异。因此,本文以开发的信息子系统为例集成Struts、Hibernate和Spring,并说明系统各层实现。系统架构处理流程如图所示。表现层通过控制器与业务逻辑层交互,业务逻辑层同时处理业务规则与数据访问,再与数据持久层交互。
图 系统的架构处理流程
1.Domain Object
根据系统需求从应用中抽取实体。子系统模型实体类包括:(1)Publisher:者信息。(2)Information:包括标题、内容、时间、图片路径、新闻审核与推荐等。(3)Category:信息分类。(4)View:信息说明或补充评论。用POJO(Plain Old Java Object)作为PO。以Information为例,其中包含Publisher、Category和View类对象。
<class name="informationpub.model.Information" table="information">
<id name=" informationId " column="informationId" type="Integer">//映射标识
<generator class="increment"/></id>
<property name="informationTitle" column="informationTitle" length="30" type="string" not-null="true"></property>
......
<many-to-one name="category"class="informationpub.model.Category"column= "categoryId" not-null="true"/>
......
2.数据持久层
数据持久层采用DAO(Data Access Object)设计模式。对底层数据库提供CRUD操作,对上层业务逻辑提供DAO接口。DAO实现包括三个部分:(1)在DAO接口中声明CRUD等方法。(2)实现DAO接口并扩展支持类。(3)产生DAO实例,实现业务逻辑与持久层的解耦。然后获得DAO 工厂实例,产生DAO组件。通过扩展HibernateDaoSupport和对应DAO接口完成Hibernate实现。传入sessionFactory引用到由HibernateDaoSupport提供的方法中,返回HibernateTemplate实例完成数据库操作。以Information为例的DAO接口实现类如下:
public class InformationDAOHibernate implements InformationDAO{
public void saveInformation (Information information) {
getHibernateTemplate().saveOrUpdate(information); //保存一条信息
……}}
Spring作为DAO工厂。
<beanid="sessionFactory"class="org.springframework.orm.hibernat3.LocalSessionFactoryBean">……//列出并加载PO映射文件
<beanid="informationDAO"class="informationpub.dao.InformationDAOHibernate">
// sessionFactory的依赖注入
<property name="sessionFactory" ref="sessionFactory"/></bean>
可见当数据库结构改变时,仅影响DAO而并不会涉及业务逻辑层。业务逻辑只要专注其自身的实现,而不需要关注底层数据库访问,实现了业务逻辑与特定数据库访问的解耦。
3.业务逻辑层
业务逻辑层完全依赖DAO组件,只需调用DAO接口。用Facade封装多个DAO组件。依赖由Facade提供的一个高层接口。业务逻辑对外提供InforPubFacade接口,表示层只要面向该接口编程,实现了业务层与表示层的解耦。由InforPubFacadeImp扩展InforPubFacade接口实现。InforPubFacadeImp类中将各DAO作为成员属性。
public class InforPubFacadeImp implements InforPubFacade{
private InformationDAO informationDAO;
……//各类的DAO作为成员属性
public void setInformationDAO(InformationDAO informationDAO) {
this. informationDAO = informationDAO;}
public void saveInformation (Information information) {
InformationDAO.saveInformation (information);
}……
}
4.表示层
表示层包括ActionForm和ActionServlet。ActionForm在视图和ActionServlet之间传递数据。由ActionForm 的validate()完成数据验证。ActionServlet再根据接响应完成到Action的转发。再由Action的execute()获取信息完成业务逻辑验证并决定调用的业务逻辑。在Struts中完成Spring容器的加载。不再将ActionServlet拦截的请求转发到struts-config.xml中的Action,而是转发到由Spring容器管理的Action。并由Spring的IOC管理Action。通过DelegatingRequestProcessor扩展Struts的子请求处理器RequestProcessor,将请求转发到action-servlet.xml。
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"value="/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml"/></plug-in><beans>
<bean name="/viewInformation"class="informationpub.web.ViewInformationAction" >//对应struts-config.xml中viewInformation 的Action
<property name="viewInformation">// 为Acion依赖注入
<ref bean=" InforPubFacade "/></property> </bean>
……//其他Action及相应依赖注入
</beans>
三、结束语
本文集成Struts、Hibernate和Spring。系统层次清晰,由Spring贯穿整个系统,无缝整合表示层、业务逻辑层和数据持久层。系统灵活性得到增强。业务逻辑只需实现一次,组件之间以接口方式耦合,实现了企业信息系统最大限度的解耦。开发的系统具有良好的伸缩性与可扩展性,从而提高企业运作效率与降低开发成本,具有一定的现实意义。
参考文献:
[1] James Goodwill. Jakarta struts[M]. O’REILLY Publishing, 2002.
[2] Ted Husted. Struts in Action: Building Web Applications with leading java framework[M]. Manning Publication Company, 2002.
[3] Matt Raible. Spring Live [M]. SourceBeat, 2004.
[4] Rod Johnson. Expert One on One J2EE Development without EJB[M]. Wiley Publishing,2004.
[5] Christian Bauer, Gavin King. Hibernate in Action[M]. Manning Inc,2004
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。