摘 要: 结合电信行业渠道管理信息化建设的现状和需求,采用基于Struts+Spring+Hibernate(SSH)的轻量级分层技术架构的解决方法,设计和开发了一套B/S架构的渠道管理系统。实验结果表明,SSH框架的使用不仅简化了系统的开发过程,而且提高了系统的可扩展性和可维护性。
关键词: Struts;Spring;Hibernate;耦合;渠道管理系统
渠道是电信行业直接面向客户进行营销、销售和服务的载体,随着电信行业竞争格局的形成和运营形式的多样化,已经有越来越多的渠道加入了电信行业。渠道的作用功不可没,不仅发展了电信行业而且还为电信运营商降低了运营成本,但目前渠道管理仍然面临着不少问题。首先由于历史原因,渠道信息系统版本较多,维护和管理比较困难;其次系统流程不畅;而且由于系统功能不健全,数据不全面,不能为业务部门提供全面和准确的支撑报表统计功能。本文基于这样的业务需求驱动,采用能够快速开发出跨平台、可重用、可扩展、分布式系统的SSH架构,设计实现了一个能够较好地适应业务需求变化的渠道管理信息系统。
1 SSH技术集成框架
使用可重用的、成熟稳定的框架可以构建健壮的、可重用的、可扩充的、易维护的Web应用程序。目前,Java开源世界里有不少优秀的框架,本文选用目前业界主流的Java开发体系Struts+Spring+Hibernate实现整个系统。从图1可以看出SSH集成架构主要由页面表现层、业务逻辑层、数据持久层构成,并且各层之间通过域对象[1](Domain Objects)做为载体进行通信。
1.1 页面表现层
页面层由Struts实现,Struts是基于MVC模型的框架。MVC模型将一个Web应用分割成为模型(Model)、视图(View)和控制器(Controller)三个部件,这三个部件既相互独立又能协同工作,通用的控制组件ActionServlet接收来自客户端的HTTP请求,根据Struts-config.xml配置文件,把请求转发给相应的Action对象,然后Action类实现业务逻辑和动作处理,通过流程跳转将处理结果返回给客户端[2]。
1.2 业务逻辑层
由Spring实现业务组件的组装关联与管理,Spring是个流行的轻量级容器,是一个开源的并且普遍兼容的非强制性的框架。它通过IoC[3](Inversion of Control,又称DI,Dependency Injection)、AOP(Aspect-Oriented Programming)的应用、使用面向接口的编程最大限度地降低业务组件之间的耦合度,增强系统兼容性和可扩展性。
1.3 数据持久层
借助开源框架Hibernate对JDBC进行轻量级的对象封装,将数据库表与对象进行关联,实现数据库访问性能优化和与数据库交互的常用操作CRUD。Hibernate封装了数据库访问、事务管理、数据缓存等工作,可以大大提供开发效率。
将这三种技术有机结合起来构建的SSH技术框架,不但可以有效提高系统开发效率,而且在系统安全性、稳定性和健壮性上都有良好的改进。域对象在各个层之间移动,为表示层提供所需要的数据源,为持久层提供对象,使得各个层以一种松散耦合的方式彼此作用而无需考虑低层的技术细节,进而构建出一个完整的Web开发框架。
2 系统简介及分层实现
2.1 系统简介
渠道是电信运营商与客户进行交互的具体途径,是向客户销售产品并提供差异化服务的载体。渠道管理主要承载渠道运营过程中的管理支撑功能,包括面向渠道的规划建设和所涉及人员、费用等方面的基础管理功能,以及绩效考核、服务管理等辅助管理功能。最终通过系统达到为渠道业务提供服务、加强渠道管控水平、提高各类渠道商的素质及实力、培育营销渠道系统的核心竞争力,并引导各渠道商积极配合电信运营商推行相关市场政策。
图2为某省渠道管理系统的功能结构图,主要包括渠道规划建设管理、业务管理、费用管理、运营考核管理、积分管理、酬金管理、系统管理、资源管理、支撑服务管理、统计报表等十大功能模块。该系统服务器操作系统采用Unix(solaris),关系型数据库采用Oracle,应用服务器根据资金投入选择了Oracle 的Weblogic。客户机的操作系统选用Windows2000、WindowsXP等版本,安装IE6.0以上的浏览器。
2.2 SSH架构分层实现
2.2.1 数据持久层的搭建
持久层Persistence主要完成数据的访问,它操作底层的数据库表,使用DAO组件封装具体的操作细节,为业务层提供接口,使业务逻辑与数据持久化分离。在Hibernate中,通过配置相应的XML文件(*.hbm.xml)来完成对象与表、对象属性与表字段的“O/R映射”关系。Hibernate运行时,会自动读取XML映射文件,然后按照该文件指定的规则动态构建Java类,以便管理数据在数据库与Java程序之间的转换。
持久层的访问通过DAO组件完成,下面以渠道组织机构信息表(Dchngroupmsg)为例介绍DAO组件建立的过程。
首先使用自动化工具生成JAVA的VO(Value Obects)对象DchngroupmsgVo和*.hbm.xml映射文件。Dchngroup-
msgVo类的属性与映射文件Dchngroupmsg.hbm.xml中的字段是一一对应的,它完成了对象与表、对象属性与表字段的“O/R映射”。同时所有映射文件需要在Spring框架的application-Context.xml中配置,这样在Hibernate启动时才能根据该映射文件真正完成对象/关系的映射。
其次是DAO组件的实现与配置。DAO组件继承了HibernateDaoSupport类,是Spring中整合了Hibernate的支持类,正是由于Spring对Hibernate的良好整合,调用Hibernate进行数据操作时只需要简单地继承Spring的HibemateDaoSupport类,然后在需要调用的方法中通过getHibemateTemplate( )提供的方法就可以方便地操纵Hibernate。
DAO组件实现后,将它们配置在Spring容器中,让Spring容器为其注入SessionFactory的引用,并将DAO组件注入到业务逻辑组件中。通过这种依赖注入,可以提供应用各组件之间的良好解耦。
2.2.2 业务逻辑层的构建
在SSH架构中Spring是最核心的框架,Spring主要应用于业务层来管理其他组件,充当了管理容器的角色。负责处理应用程序业务逻辑、业务校验和事务管理[4];同时管理业务层的对象依赖;在表示层和持久层之间增加了一个灵活的机制,使得它们没有直接联系,借助Spring的IoC、AOP应用、面向接口编程,能降低业务组件之间的耦合度,增强系统扩展性。
构建Spring业务层主要完成以下两方面的任务:
(1)对Spring容器进行初始化与配置:Spring提供一个ContextLoaderListener类用作Spring容器的初始化。Spring容器初始化之后,需要创建 ApplicationContext实例,Spring有两个核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口,增强了BeanFactory的功能,提供系统架构服务。
(2)业务逻辑实现:使用面向接口的编程,调用持久层定义好的接口为表示层提供业务接口,而无需关心接口的具体实现细节,先定义业务层的接口SGroupMsgSvcI:
接口SGroupMsgSvcI的实现类SGroupMsgSvcImpl:
public class SGroupMsgSvcImpl extends BaseService
implements SGroupMsgSvc
{
public DchngroupmsgVo getDchngroupmsgVo(String id)
throws Exception
{
DchngroupmsgVo gmvo = new DchngroupmsgVo();
DchngroupmsgDAO gmdao =(DchngroupmsgDAO)
this.getBean("dchngroupmsgdao");
return gmvo = gmdao.get(id);
}
}
以上的业务逻辑很简单,只是通过简单的调用DchngroupmsgDAO的接口方法来完成。DchngroupmsgDAO引用是在前面持久层中配置的,这个配置指示Spring去动态注入DchngroupmsgDAO到SGroupMsgSvcImpl中,实现渠道组织信息的获取。
2.2.3 页面表示层的建立
Struts实际上是Servlet技术的一个扩展,它用一个ActionServlet来接收浏览器的请求,用于系统的集中控制,然后在相应的Action类中调用业务逻辑,最后进行流程跳转。
表示层的建立主要是使用标签编写JSP页面,定义Struts的Action类及相应的配置文件。首先要定义ActionForm,用于收集JSP页面传来的数据,供Action中调用业务逻辑使用。为了使用Struts 的Validator框架来做客户端的表单验证,ActionForm继承了org.apache.struts.action.ActionForm的子类ValidatorForm。ActionForm中定义的成员名称要与JSP页面表单中的域名称一致,这样在提交数据的时候,Struts会自动把表单中的数据封装到继承的ActionForm中,避免了以往用request.getParameter获取参数的繁琐。
然后编写Action类,所有的Action类都继承了自定义的BaseAction类,BaseAction类是 org.apache.struts.actions.DispatchAction的子类,同时在BaseAction类中实现了一些公共方法,例如令牌验证判断是否重复提交、生成下拉列表、创建上下文ApplicationContext实例等。Action类从ActionForm中提取数据,调用业务逻辑,然后根据返回结果转向相应的页面。
public class SGroupMsgAction extends BaseAction
{
public ActionForward queryGroupMsg(ActionMapping
mapping,
ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response)throws Exception{
SGroupMsgSvcI groupMsg_chn = (SGroupMsgSvcI)
this.getBean("SGroupMsgSvc");
String group_id = request.getParameter
("GROUP_ID");
DchngroupmsgVo dvo = groupMsg_chn.getDchn-
groupmsgVo(group_id);
ActionForward forward = mapping.findForward
("SUCCESS");
return forward;
}
}
所有的Struts Action类都继承自BaseAction,基类BaseAction完成Spring上下文ApplicactionContext.xml的加载,提供一个公共的服务定位器方法getBean(),这里SGroupMsgAction是BaseAction的子类,继承了父类的getBean方法,所以只要通过传入参数“SGroupMsgSvc”即可查找Spring的Bean资源,“SGroupMsgSvc”正是前面业务层在配置文件中指定的bean。这样根据给定bean的id就能返回配置文件中指定的类。
Struts的控制器ActionServlet接收用户查询渠道信息的URL请求“/sGroupMsg.do?operate=queryGroupMsg”,根据该请求的URL查找struts-config.xml配置文件来决定该请求是否处理SGroupMsgAction,SGroupMsgAction的queryGroupMsg方法接收页面数据,通过服务定位器查找名为“SGroupMsgSvc”的Bean资源,返回业务类的接口SGroupMsgSvcI,并以域模型DchngroupmsgVo对象为参数调用业务接口的getDchngroupmsgVo方法来处理业务逻辑,若查询成功则返回一个自定义逻辑名称“SUCCESS”的ActionForward对象,最后ActionServlet把流程转向ActionForward中定义的JSP页面(success.jsp),从而完成一次请求/响应过程。
至此,基于Struts、Spring+Hibernate框架开发的渠道组织机构查询功能开发完成。
本文所设计的SSH集成的Web开发框架基于良好的应用程序分层和成熟的开源项目,具有结构清晰、松散耦合、可扩展和可维护性好的特点,已在电信运营商的各个省份(如北京、湖南、安徽、山西、陕西、四川,黑龙江、新疆等)的渠道管理系统中得到了非常成功的应用。目前系统采用的SSH集成架构已成为最为理想和成熟的J2EE Web应用框架,而且这种开发模式将会被越来越多的程序员所接受,在实际开发中得到广泛应用。
参考文献
[1] 郝彬,陈朔鹰.利用框架技术构建Web应用.计算机工程与设计[J].2007,28(1):8-13.
[2] 谌湘倩,狄文辉,孙冬.基于轻量级J2EE框架的网络教学系统[J].计算机工程,2008,34(6):266-268.
[3] 林信良.Spring 2.0技术手册[M].北京:电子工业出版社, 2007.
[4] 李刚.整合Struts+Hibernate+Spring应用开发详解[M].北京:清华大学出版社,2007.