首页 > 范文大全 > 正文

浅谈基于Struts和Hibernate的框架整合应用

开篇:润墨网以专业的文秘视角,为您筛选了一篇浅谈基于Struts和Hibernate的框架整合应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:本文介绍了Struts和Hibernate两个开源框架,提出了基于这两种框架的集成架构,给出了该架构的工作流程,并结合实例说明如何利用集成架构进行开发。

关键词:MVC;struts;O/R;Hiberante

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)06-11695-04

1 引言

近年来,随着网络技术不断发展,尤其是基于Web的信息和检索技术、Java计算技术以及网络分布式对象技术的飞速发展,导致了很多应用系统的体系结构从C/S结构向更加灵活的 B/S体系结构演变,因其具有易用性和良好的可扩展性等优点而迅速发展成为Web应用系统的主流,基于B/S结构的Web架构在逻辑上将应用分为4层:表示层、业务逻辑层、持久层和数据层。这种多层的体系结构向开发者提供了一种基于组件的设计和开发Web应用的模块化方法,应用系统各层的实现技术多种多样,每种技术各有优缺点和适用范围,怎样选择各层的技术以及如何结合这些技术来实现一个应用系统是一个值得深入研究的方向,本文采用Struts框架实现表示层,hibernate实现持久层,构建了一个结合两者优势的Web应用集成框架,并对框架的优缺点进行分析。

2 基于MVC模式的Struts框架

2.1 MVC模式

MVC模式[1]来源于面向对象语言Smalltal的主要思想,至今已被广泛使用。模式分成三个核心部件:模型(Model),视图(View),控制器(Controller),它们各自起着不同的作用。模型(Model)是应用程序的主体部分。模型表示业务数据或业务逻辑。它是业务逻辑处理模块,是对企业业务流程中的对象进行抽象, 封装了对象的属性和对象隐含的业务逻辑。视图(View)是应用程序中用户界面的部分,它为用户提供了输入手段,并触发控制器运行,然后通过 model 访问企业数据,并用某种方式显示这些数据。控制器(Controller)的工作就是根据用户的输入,控制用户界面数据显示和更新 Model 对象状态。它是流程控制模块,它管理着用户与 View 的交互,能从 View 中取得数据并传给 Model 去执行业务逻辑,然后它根据 Model 的执行结果,选择一个合适的 View 把结果展示给用户。

这种设计模式把应用逻辑处理过程和显示逻辑分成不同的组件实现,通过三者之间的分离达到层间的松散耦合,以实现代码重用和易于修改,提高了系统的灵活性、复用性和可维护性。

2.2 Struts框架

Struts 是建立在MVC模式基础上的框架,由一组相互协作的类、Servlet 和 JSP taglib组成,Struts的核心组件有ActionServletAction ActionFormActionMappingActionForword及Taglib等,struts框架依照MVC模式分为三个组成部分:模型、视图、控制器.其中控制器由ActionServlet来实现,模型由Action和ActionForm来实现,视图则由JSP及taglib实现,体系结构如图1所示:

图1 Struts框架图

2.3 Struts流程

服务器在启动时,首先进行ActionServlet的初始化工作,读取配置文件(Struts-config.xml),当控制器接受到http请求时,控制器根据请求的URL地址,与Struts-config.xml所配置的Action类进行比较,找到处理此HTTP请求的类 ,将HTTP中提交的参数填充到ActionForm中,Action执行自已的execute()方法,调用处理业务逻辑的JavaBean对数据对象进行操作,操作完毕后返回一个ActionForm对象,它封装了一个页面转向信息,起指向标的作用.ActionServlet接受到此ActionForword对象,在Struts-config.xml中进行查找,得到和此指向标对应的JSP页面地址,将已经处理过的HTTP请求发往此页面JSP页面,从HTTP中取出数据并进行显示,这就是Struts的大体工作流程[2]。流程如图2所示:

图2 Struts流程图

3 基于O/R映射的Hibernate框架

3.1 O/R映射

提出对象/关系映射技术(Object-Relational Mapping,简称ORM)的目的主要是为了解决在面向对象的开发平台下如何使用一种面向对象的方式来操纵和管理关系型数据的问题.利用O/R映射技术可以实现一个相对独立的对象持久化层,利用这个对象持久化层,开发人员就可以将所要管理的关系型数据封装成标准的对象,进而使用面向对象的方法来操作这些数据。

3.2 Hibernate简介

长久以来,在Java开发领域中,基于数据库应用的设计一直是面向关系的,即与数据库相关的处理过程并没有实现真正的面向对象,EJB、JDBC等持久化解决方案存在这样那样的问题,开发人员尝试用Hibernate在数据库外面包裹上一层面向对象的外衣,从而将开发人员从繁琐、重复、技术含量不高的数据库编程中解放出来。Hibernate应需而生了,它是一个开放源代码的对象关系映射框架,对JDBC进行了轻量级的对象封装,Java 应用程序可以通过Hibernate API或直接通过JDBC 来访问数据库,Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库,Hibernate可以大大减少操作数据库的工作量。另外Hibernate可以利用模式来简化载入类的过程,这将大大减少利用Hibernate从数据库提取数据的代码的编写量,从而提高开发效率[3]。

Hibernate 提供了实现持久化层的一种模式,它采用元数据来描述对象―关系的映射细节,在Java 应用的业务逻辑层和数据库层之间充当桥梁,从本质上来讲是一种轻量级“对象/关系型数据映射”(Object Relational Mapping 简称ORM)。图3是一张Hibernate 的体系结构图,其中PersistentObject 是简单的业务实体对象(要被持久化的对象), 通过Hibernate 被透明地持久化到数据库中,从而减少了繁琐而且容易出错的JDBC的操作。

图3 hibernate体系结构图

4 基于Struts和Hibernate框架的结构

Struts对模型部分的支持还有所欠缺,Hibernate只提供模型部分支持 ,可以将这两个架构有效整合在一起,让Struts负责降低系统总架构的耦合性,而让Hibernate负责降低业务模型部分的开发难度。用Struts架构作为Web应用的整体基础架构,它负责了MVC的分离,而在Struts架构的模型部分,利用Hibernate架构来提供持续层支持。在这个集成架构中,所有的业务流控制都交给Struts的配置文件来配置完成,并由控制器Servlet来分开模型与视图部分,集成后的系统架构身兼Struts架构和Hibernate架构的所有长处,并让它们相互补充,克服各自的不足。

4.1集成架构的结构

在项目开发中,首先用JSP 技术结合Struts强大的TagLib 来实现我们的表示层,这些通常是使用了标记的JSP 页面。业务层由Struts的控制组件ActionServlet、ActionMapping 及Action 和业务逻辑类JavaBean 来实现。当然,这些JavaBean 里封装了与Hibernate的交互关系业务层通过数据转换和访问层来实现与数据库资源的交流。这一部分工作由Hibernate 来做。我们在业务逻辑类里直接对对象进行操作,Hibernate 将我们在Java 类里使用的HQL 语句转换为SQL 语句,利用JDBC 驱动进而操作数据源,完成数据的增、删、改等等,最底层是关系数据库。基于Struts和Hibernate框架的J2EE架构如图4所示。

图4 Struts和Hibernate框架的架构图

4.2 集成架构的工作流程

其工作流程是,来自客户端的Http 请求送到Struts 框架中的控制器ActionServlet 等候处理。ActionServlet 包括一组基于配置的ActionMapping 对象,每个ActionMapping 对象实现了一个请求到一个具体的Model部分中Action 处理器对象之间的映射。ActionServlet 接受客户端的请求,并将请求交与RequestProcessor 来处理RequestProcessor 根据请求的URL从ActionMapping 中得到相应的Action并根据请求的参数实例化相应的ActionForm,再进行form 验证验证通过则调用Action 的Execute 方法:在方法体内,调用业务逻辑模块.由Hibernate 在“幕后”完成与数据库的交互:即业务逻辑类里通过HQL语句操作业务对象;Hibernate 把HQL转换为SQL,通过O/R 映射文件实现具体对数据源的操作,即穿过持久层映射到具体的数据库表。Execute 方法执行后须返回ActionForward。ActionServlet 接受Execute方法返的ActionForward 对象,转发到ActionForward 指定的源。这个源可以是一个JSP 或另一个Action 或另一个Servlet。基于Struts和Hibernate组合架构的处理流程如图5所示:

图5 Struts和Hibernate框架流程图

5 基于Struts和Hibernate框架的结构应用举例

举例的Web应用的集成结构分为四层,从上至下分别是表示层、业务层、DAO层和数据库层。登录时输入员工编号和口令,实现员工登录,当登录成功时下一个页面显示,登陆用户信息。登录不成功时,仍返回登录页面。用struts和Hibernate两个框架来实现。该模块架构特点是结合了Web 层的Struts 框架和数据持久层的Hibernate 框架,采用多层体系结构,使应用数据的表示被限制到相应的层内,降低了数据在各层之间的耦合性,提高了整体架构的可维护性和可扩展性。

5.1定义持久化类

Hibernate作用与普通的Java对象使之成为持久化类。Persistent object持久对象是一个完全符合Java Bean规范的纯Java对象,它包含有符合统一标准的属性和方法。POJO是一个功能单一的Java对象,它不同于EJB这样的带有繁重的容器控制功能的对象,其属性只可以通过自身的get和set方法访问,这样对外隐藏了内部实现的细节,规范了事务处理部分中每个属性所对应的数据库字段的数据操作。为了简化说明,在Staff类中只定义了四个属性,即id、StaffCode、StaffName和StaffPassword,它的属性和数据库中Staff表的字段是一一对应的,并且类型一致。

Public class Staff{

private String id;

private String staffCode;

private String staffName;

private String staffPassword; //省略get()和set()方法

}

5.2编写对象-关系映射文件

数据库表对应的映射文件Student. hbm. xml包含了对象/关系映射所需的元数据。元数据中包含了持久化类的声明,以及类中各个属性到数据库表各个字段的映射关系。其属性可以作为一般值存在也可以是指向其他实体的关联,其在关系型数据库中体现为数据表的外键。每个数据库表都会对应一个Hibernate映射文件,用于生成数据对象,这里Staff.java对应了Staff.hbm.xml,描述如下:

< id name= " id">

< generatorclass= "identity"/>

< /id>

5.3 Hibernate的配置

为了用Hibernate 进行应用程序的持久化,需要在应用程序的包里放置一个配置文件,以便Hibernate能正确地完成配置和初始化。配置文件有两种格式hibernate.properties 和hibernate.cfg.xml,两种的配置项都是一样的,一般使用后者。下面配置hibernate.cfg.xml 文件。本文件存放Mysql数据库连接驱动程序类、登录数据库的用户名/密码、影射实体类配置文件的位置等。

true

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/schoolProject?useUnicode=true&characterEncoding=GBK

root

pwd

org.hibernate.dialect.MySQLDialect

5.4利用DAO模式编写业务逻辑

在Struts中,数据持久层操作可以由单独的一层来做,DAO层,主要是业务层访问数据层的一些操作,介于业务层和数据层之间,有了Hibernate,那么DAO就可以由Hibernate和JDBC来轻松实现,不论是简单的数据持久化还是复杂的数据持久化,Hibernate都提供了简单的透明持久化方法.因此,业务层收到PO对象后,就可以直接调用DAO接口方法,进行持久对象的持久化操作.对于DAO类,最好是有接口和工厂方法(便于将来维护).在这里简便起见,直接编写DAO的实现类StaffMgrImpl.java。这个类有两个方法,一个是判断输入的编号和口令是否一致且合法;另一个是输入员工编号,返回员工姓名。以下是它的源代码(为方便起见,方法中应出现的try-catch语句省略)。

public class StaffMgrImpl {

public boolean isValidate(String staffCode,String staffPassword){

String queryString = "select staff from Staff as staff where staff.staffCode=:staffCode and staff.staffPassword=:staffPassword" ;

session = HibernateUtil.currentSession();

tx = session.beginTransaction();

Query query = session.createQuery(queryString);

query.setString("staffCode", "staffCode");

query.setString("staffPassword", "staffPassword");

Iterator it = query.iterator();

mit();

if(it.hasNext())

return true;

else

return false;

}

public Staff getStaff(String staffCode) {

String queryString ="select staff from Staff as staff where staff.staffCode=:staffCode" ;

session = HibernateUtil.currentSession();

tx = session.beginTransaction();

Query query = session.createQuery(queryString);

query.setString("staffCode", "staffCode");

Iterator it = query.iterator();

mit();

if(it.hasNext()) {Staff staff = (Staff)it.next();

return staff;}return null; }}

5.5 调用业务逻辑的Action的staffAction.java代码

StaffAciton接受员工登陆请求,提交的数据用StaffForm封装,控制器ActionServlet对象根据Struts-config.xml配置的映射找到对应的Action对象,Action对象从StaffForm对象取出封装的数据,调用业务逻辑来执行,Action对象调用业务逻辑完成任务。为了减少持久层和Web页面层之间的耦合性,对应于同一个对象需要编写2个Java类,一个工作在Web层,一个工作在持久层,VO(Value Object)是Web层数据表示,即Web层提交的数据用ActionForm Bean封装,PO(Persistence Object)是持久层数据表示,不同之处在于VO有数据效验方法等.它们之间的数据传递可以通过jakarta的BeanUtil工具来实现,getStaff()方法得到的是用户信息,代表的是持久层数据PO,要在下一页面显示用户信息则须转化成VO,即通过BeanUtils.copyProperties(VO,PO)来转化,StaffForm与Staff类代码相似,减少了层之间的耦合性.如果展现层和持久层都使用StaffForm作数据载体的话,就把Struts和Hibernate绑定在了一起,如果项目采用别的展现层框架,那么对Hibernate持久层改动也是相当大,转化一般在Action对象中进行。

public final class StaffAction extends Action {public ActionForward execute(ActionMapping mapping,ActionForm form,

HttpServletRequest request, HttpServletResponse response)

{ StaffForm staffForm = (StaffForm) form;

String staffCode = staffForm.getStaffCode();

String staffPassword = staffForm.getStaffPassword();

StaffMgrImp staffMgr = newStaffMgrImpl();

boolean flag = staffMgr.isValidate(staffCode,staffPassword);

if (flag)//如果编号、口令匹配,下页显示其姓名及欢迎信息。

{ Staff staff = staffMgr.getStaff(staffCode);

StaffForm form = new StaffForm();

BeanUtils.copyProperties(form,staff);

request.setAttribute(userinfo, form);

returnmapping.findForward("/detail");}

else

return mapping.findForward("/failure");}}

6 集成框架的特点

目前,基于这两个开源框架的架构在开发中得到广泛的应用,具有以下几方面的原因:首先,免费、开源、有丰富的文档和稳定的开发背景。其次,层次之间松散耦合便于实现系统的大规模开发和管理。再者,基于模块的结构利于系统业务的重用和改动。第四,良好的设计思想。Struts是基于MVC的框架,很好地把业务逻辑和表示层分离;Hibernate是一个小巧的实现对象关系映射的工具,把面向对象的设计开发与关系数据库联系起来了。

当然,基于这两种框架的架构也并非没有缺点,如Struts中的Action的映射非常复杂;Hibernate的对象、关系之间的映射工作量很大;两者的配置文件都很复杂等等。其实,这正是其灵活之处。因为把各层都完全分离了所以才易于重用和可扩展,因而其灵活映射的配置文件才会很复杂。好在现在有很多的工具支持这两种框架。

7 结论

本文首先介绍了Struts框架和Hibernate框架,然后结合这两种技术构建了一种Web应用开发框架,Web应用的表示层由Struts框架来实现,Hibernate完成了对象和关系之间的映射,从而实现业务层和数据库层之间的交互,在很大程度上简化了程序员在数据库逻辑方面的工作,让Java 程序员能够使用面向对象编程的思维来操作数据库,这两种技术的结合充分发挥了两者的优点,基于二者的Web应用框架开发简洁、结构清晰,有很好的可扩展性和维护性,非常适合于面向对象的设计与开发。通过成熟的开源产品搭建层次清晰性能稳定的系统架构。

参考文献:

[1]石志国,薛为民,董洁.JSP应用教程[M].北京:清华大学出版社,2005.

[2]蔡雪焘.Hibernate开发及整合大全[M].北京:清华大学出版社,2006.

[3]孙卫琴.精通Hibernate: java 对象持久化技术详解[M].北京: 电子工业出版社,2005.36-38.

本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。