摘要:对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架SSH(Spring、Struts、Hibernate),具体讨论其基本相似性及有关基本概念,提出了一种开发J2EE Web应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰、可复用性好、可扩展性好、维护方便的Web应用程序。并通过案例具体说明如何将这一方案应用到实际项目中。
关键词:框架,J2EE,MVC,SSH,Struts,Spring,Hibernate
大型企业级Web应用系统的开发通常要求有一个良好的软件架构、便于协作开发和扩展升级,而传统的开发模式不能很好地满足这些要求。本文对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架SSH(Spring、Struts、Hibernate),具体讨论其基本相似性及有关基本概念,提出了一种开发J2EE Web应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰、可复用性好、可扩展性好、维护方便的Web应用程序。并通过案例具体说明如何将这一方案应用到实际项目中。
1、SSH框架介绍和分析
1.1框架技术
框架一般具有即插即用的可重用性、成熟的稳定性以及良好的团队协作性。J2EE复杂的多层结构决定了大型的J2EE项目需要运用框架和设计模式来控制软件质量。目前,市场上出现了一些商业的、开源的基于J2EE的应用框架,其中主流的框架技术有:基于MVC模式的Struts框架、基于IoC模式的Spring框架以及对象/关系映射框架Hibernate等。
1.2框架共同点
所有现代的网络开发框架几乎都遵循了模型-视图-控制(MVC)设计模式:商业逻辑和描述被分开,由一个逻辑流控制器来协调来自客户端的请求和服务器上将采取的行动。这条途径成为了网络开发的事实上的标准。每个框架的内在的机制当然是不同的,但是开发者们使用来设计和实现他们的Web应用软件的API是很类似的。差别还存在于每个框架提供的扩展方面,例如标签库,JavaBean包装器等。
所有的框架使用不同的技术来协调在Web应用程序之内的导航,例如XML配制文件,java属性文件或定制属性。所有的框架在控制器模块实现的方法方面也存在明显的不同。例如,EJB可能实例化在每个请求中需要的类或使用Java反射动态地调用一个适当的行为(Action)类。另外,不同框架在各自引入的概念上也有所不同。例如,一个框架可能定义用户请求和反应场所,而另外一个框架可能仅仅定义一个完整的流:从一个请求到多个响答和随后的再请求。
各种Java框架在它们组织数据流的方法方面是很类似的。在请求发出后,在应用程序服务器上产生一些行动;而作为响应,一些可能包含对象集的数据总是被发送到WEB层。然后从那些对象:可能是有setter和getter方法的简单类、JAVABEANS、值对象、或者一些集合对象中提取数据。现代的Java框架还想方设法简化开发者的开发任务,如通过使用简易的API、数据库连接池、甚至数据库调用包等提供自动化的追踪方式来实现。一些框架或者能够钩进(hooked into)另外的J2EE技术中,例如JMS(Java消息服务)或JMX,或把这些技术集成到一起。服务器数据持续性和日志也有可能成为框架的一部分。
1.3 MVC模式
MVC模式是一个用于将用户界面逻辑与业务逻辑分离开来的基础设计模式,它将数据处理、界面以及用户的行为控制分为:Model(模型)-View(视图)-Controller(控制器)。
1.4 WEB层框架Struts
下面就上图所示的体系结构图分析Struts框架中的MVC组件。
- 视图(view):视图部分主要由JSP页面组成,其中没有流程逻辑、业务逻辑和模型信息,只有标记。Struts自身包含了一组标记库(TagLib),这也是Struts的精华之一,灵活运用它们可以简化JSP页面的代码,提高开发效率。
- 控制器(controller):Struts中的Controller主要是其自身提供的ActionServlet。ActionServlet接收所有来自客户端的请求并根据配置文件(struts-config.xml)中的定义将控制转移到适当的Action对象。
- 模型(model):Struts没有定义具体Model层的实现,Model层通常是和业务逻辑紧密相关的,有持续化的要求。目前在商业领域和开源世界,都有一些优秀的工具可以为Model层的开发提供便利。
1.5业务逻辑层框架Spring
Spring框架可以成为企业级应用程序一站式的解决方案,同时它也是模块化的框架,允许开发人员自由地挑选适合自己应用的模块进行开发。Spring框架式是一个松耦合的框架,框架的部分耦合度被设计为最小,在各个层次上具体选用哪个框架取决于开发者的需要。
1.6 持久层框架Hibernate
Hibernate有自己的面向对象的查询语言HQL,HQL功能强大,支持目前大部分主流的数据库,如Oracle、DB2、MySQL、Microsoft SQL Server等,是目前应用最广泛的O/R映射工具。Hibernate为快速开发应用程序提供了底层的支持
2、 基于SSH框架的Web应用架构分析与设计
SSH为Struts+Spring+Hibernate的组成方式,Struts实现MVC,Spring负责架构的结合,Hibernate进行数据的持久化。通常其分层开发的结构图如下:
这样的结构,系统从职责上分为四层:WEB层、业务逻辑层、数据持久层和实体层。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,利用Hibernate框架对持久层提供支持,业务层用Spring支持。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring完成业务逻辑。
系统的基本业务流程是:在WEB表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。
采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率。
但是对于当前日益复杂化的WEB2.0的开发,却存在不少问题,归纳起来主要有以下的不足:
-
DAO和服务层容易出现职责不明,由于按照MVC逻辑,业务代码应该写在Struts Action里,但是其事务的提供,却是配置在Service层。为了一组在逻辑上完整的数据操作业务逻辑,需要涉及两个层(Service、Action)来进行编写,遇到判断的情况下,为了保证完整的事务操作,则需要将业务代码移到Service层完成,而通常习惯了在Struts Action里调用多次Service而产生多个事务,但在出现Exception导致出错时,操作之前调用的Service事务的业务数据没有被回滚。
-
当需要返回的数据供AJAX使用,操作JSON或XML的大量使用时。开发起来会很费力,一段同样的业务代码,为了使用AJAX和XML可能需要重新编写一次,或者在同一个ACTION里通过标志来判断,对分层结构造成了比较糟糕的破坏。如果设计得不好,为了使用JSON和XML还得额外增加大量的配置,严重降低了开发效率。
其开发的结构图如下:
看到这个架构图有人可能会问,Struts Action类的编写去哪了呢?答案正是这个架构的优点,由于业务代码统一实现BusinessService接口,使得只需要相对固定的几个Struts Action类调用Service层的方法,便可以完成工作。包括JSON格式输出,XML输出及WebService输出均调用Service层方法来完成功能。这样便实现了业务代码的分离,以及与前端框架的极大解耦。
3、基于SSH框架的Web应用系统的实现
下面将通过一个实际的系统来展示如何进行基于SSH框架的Web应用开发。该系统是为综合性网站开发的一个论坛系统。由于系统的模块较多,下面就以一个用户管理模块为例来说明系统的开发实现过程,并将按照数据持久层、业务逻辑层、表示层的顺序说明系统构建过程。
3.1数据持久层
数据持久层由Java对象持久化类和数据访问对象(DAO)组成。每个数据库表都对应着一个持久化对象,这样就给予了开发者使用OO思想设计和开发的便利,同时也屏蔽了具体的数据库和具体的数据表、字段,消除了对数据库操作的硬编码在重用性上的弊端。用户信息表的部分结构如下所示:
用户信息表:user | ||||
字段名 | 数据类型 | 大小 | 可否为空 | 备注 |
USER_ID | NUMERIC | 16 | 否 | 用户ID |
USER_NAME | VARCHAR | 60 | 否 | 用户名称 |
PASSWORD | VARCHAR | 64 | 否 | 用户密码 |
… | | | | |
Hibernate通过映射(Mapping)文件将对象(Object)与关系型数据(Relational)相关联,因此需要编写和数据库表相对应的Java持久化类以及对应的映射文件。有了Java持久化类后就可以在此基础上实现数据访问类。在Spring框架中,数据访问类可以从辅助类HibernateDaoSupport继承,这极大地方便了Hibernate框架在Spring中的使用,相应的部分代码如下:
具体的Hibernate数据源、session工厂、事务管理、缓冲连接池等功能都由业务层的Spring容器提供。
3.2业务逻辑层
业务逻辑层由Spring框架支持,提供了处理业务逻辑的服务组件。开发者需要对业务对象建模,抽象出业务模型并封装在Model组件中。由于数据持久层实现了Java持久化类并且封装了数据访问对象(DAO),因此可以在Model组件中方便地调用DAO组件来存取数据。Spring的IoC容器负责统一管理Model组件和DAO组件以及Spring所提供的事务处理、缓冲连接池等服务组件。
在用户管理模块中,通过业务建模创建了用户模型UserService类,封装了对用户的权限管理以及积分管理等功能。UserService类通过调用数据访问类UserDao实现对用户数据的操作。这些组件的关系将通过配置Spring框架的applicationContext.xml联系起来,配置文件的主要内容如下:
<!—创建业务模型组件UserService,并调用UserDaoF组件作为协作对象-->
<bean id=”UserService” class=”com..wto.service. UserServicel”>
3.3表示层
<!—该请求调用ListAllUserAction对象,并根据返回的Forward对象
的状态来转到相应的页面à
4、总结
基于J2EE的Web应用以其层次性、平台无关性的优势已经逐渐成为了电子商务、电子政务、各大型门户网站主要的解决方案。本文通过对SSH框架的介绍和针对传统的J2EE Web应用开发的弊端,提出了一种利用轻量级框架来快速搭建Web应用的解决方案,并且通过其在实际项目中的应用,证明了采用此方案可以帮助开发人员在短时间内建立结构清晰、可重用性好、维护扩展方便的Web应用程序。
当然,本文仅概述了现代最流行的Java Web开发框架(SSH)。还有更多框架尚未描述,而许多框架通过扩展另外的MVC框架在内部被成功开发。当Web开发竞技场继续演变它的工具和编程方法时,Java应用程序框架也将继续成长下去。Java Web开发框架的未来更会是百花齐放、前景光明!
参考文献
[1] 软件架构实践,第二版,林·巴斯、保留·克莱门、瑞克·凯兹曼 著,车立红 译
[2] 基于SSH的J2EE架构在信息管理中的应用 作者:邹羚, 期刊-核心期刊 商场现代化MARKET MODERNIZATION 2007年 第21期
[3] GAMMA E, HELM R, JOHNSON R, et al. Design patterns:Elements of reusable object-oriented software[M]. Addison
[4] 基于Spring与Hibernate的J2EE持久层解决方案 Solution of J2EE persistent tier based on integrating Spring with Hibernate 作者:谭待,谭人杰,期刊铁路计算机应用RAILWAY COMPUTER APPLICATION 2007年 第10期
[5] 孙卫琴.精通Struts:基于MVC的Java Web设计与开发[M]. 北京:电子工业出版社,2004.
[6] JOHNSON R, HOELLER J, ARENDSEN A, et al. Java/J2EE application framework reference document. V1.1. 2004.
[7] SSH架构及其在Web开发中的应用 作者:韩义亭,张成宇, 期刊 网络安全技术与应用NETWORK SECURITY TECHNOLOGY & APPLICATION 2007年 第10期
[8] 徐长盛,戴超.一种快速开发Web应用程序方法的研究[J]. 计算机工程与设计,2004,(12):2237-2239.
[9] 夏昕,曹晓钢,唐勇.深入浅出Hibernate[M]. 北京:电子工业出版社,2005.
[10] JOHNSON R.Expert one-on-one J2EE design and development[M]. 魏海萍译.北京:电子工业出版社,2003.
[11] 基于Struts+Hibernate+Spring轻量级框架的Web应用开发 作者:杨俊,许日丹, 期刊福建电脑FUJIAN COMPUTER 2008年 第02期