摘 要: 結(jié)合電信行業(yè)渠道管理信息化建設(shè)的現(xiàn)狀和需求,采用基于Struts+Spring+Hibernate(SSH)的輕量級(jí)分層技術(shù)架構(gòu)的解決方法,設(shè)計(jì)和開(kāi)發(fā)了一套B/S架構(gòu)的渠道管理系統(tǒng)。實(shí)驗(yàn)結(jié)果表明,SSH框架的使用不僅簡(jiǎn)化了系統(tǒng)的開(kāi)發(fā)過(guò)程,而且提高了系統(tǒng)的可擴(kuò)展性和可維護(hù)性。
關(guān)鍵詞: Struts;Spring;Hibernate;耦合;渠道管理系統(tǒng)
渠道是電信行業(yè)直接面向客戶進(jìn)行營(yíng)銷、銷售和服務(wù)的載體,隨著電信行業(yè)競(jìng)爭(zhēng)格局的形成和運(yùn)營(yíng)形式的多樣化,已經(jīng)有越來(lái)越多的渠道加入了電信行業(yè)。渠道的作用功不可沒(méi),不僅發(fā)展了電信行業(yè)而且還為電信運(yùn)營(yíng)商降低了運(yùn)營(yíng)成本,但目前渠道管理仍然面臨著不少問(wèn)題。首先由于歷史原因,渠道信息系統(tǒng)版本較多,維護(hù)和管理比較困難;其次系統(tǒng)流程不暢;而且由于系統(tǒng)功能不健全,數(shù)據(jù)不全面,不能為業(yè)務(wù)部門(mén)提供全面和準(zhǔn)確的支撐報(bào)表統(tǒng)計(jì)功能。本文基于這樣的業(yè)務(wù)需求驅(qū)動(dòng),采用能夠快速開(kāi)發(fā)出跨平臺(tái)、可重用、可擴(kuò)展、分布式系統(tǒng)的SSH架構(gòu),設(shè)計(jì)實(shí)現(xiàn)了一個(gè)能夠較好地適應(yīng)業(yè)務(wù)需求變化的渠道管理信息系統(tǒng)。
1 SSH技術(shù)集成框架
使用可重用的、成熟穩(wěn)定的框架可以構(gòu)建健壯的、可重用的、可擴(kuò)充的、易維護(hù)的Web應(yīng)用程序。目前,Java開(kāi)源世界里有不少優(yōu)秀的框架,本文選用目前業(yè)界主流的Java開(kāi)發(fā)體系Struts+Spring+Hibernate實(shí)現(xiàn)整個(gè)系統(tǒng)。從圖1可以看出SSH集成架構(gòu)主要由頁(yè)面表現(xiàn)層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層構(gòu)成,并且各層之間通過(guò)域?qū)ο骩1](Domain Objects)做為載體進(jìn)行通信。
1.1 頁(yè)面表現(xiàn)層
頁(yè)面層由Struts實(shí)現(xiàn),Struts是基于MVC模型的框架。MVC模型將一個(gè)Web應(yīng)用分割成為模型(Model)、視圖(View)和控制器(Controller)三個(gè)部件,這三個(gè)部件既相互獨(dú)立又能協(xié)同工作,通用的控制組件ActionServlet接收來(lái)自客戶端的HTTP請(qǐng)求,根據(jù)Struts-config.xml配置文件,把請(qǐng)求轉(zhuǎn)發(fā)給相應(yīng)的Action對(duì)象,然后Action類實(shí)現(xiàn)業(yè)務(wù)邏輯和動(dòng)作處理,通過(guò)流程跳轉(zhuǎn)將處理結(jié)果返回給客戶端[2]。
1.2 業(yè)務(wù)邏輯層
由Spring實(shí)現(xiàn)業(yè)務(wù)組件的組裝關(guān)聯(lián)與管理,Spring是個(gè)流行的輕量級(jí)容器,是一個(gè)開(kāi)源的并且普遍兼容的非強(qiáng)制性的框架。它通過(guò)IoC[3](Inversion of Control,又稱DI,Dependency Injection)、AOP(Aspect-Oriented Programming)的應(yīng)用、使用面向接口的編程最大限度地降低業(yè)務(wù)組件之間的耦合度,增強(qiáng)系統(tǒng)兼容性和可擴(kuò)展性。
1.3 數(shù)據(jù)持久層
借助開(kāi)源框架Hibernate對(duì)JDBC進(jìn)行輕量級(jí)的對(duì)象封裝,將數(shù)據(jù)庫(kù)表與對(duì)象進(jìn)行關(guān)聯(lián),實(shí)現(xiàn)數(shù)據(jù)庫(kù)訪問(wèn)性能優(yōu)化和與數(shù)據(jù)庫(kù)交互的常用操作CRUD。Hibernate封裝了數(shù)據(jù)庫(kù)訪問(wèn)、事務(wù)管理、數(shù)據(jù)緩存等工作,可以大大提供開(kāi)發(fā)效率。
將這三種技術(shù)有機(jī)結(jié)合起來(lái)構(gòu)建的SSH技術(shù)框架,不但可以有效提高系統(tǒng)開(kāi)發(fā)效率,而且在系統(tǒng)安全性、穩(wěn)定性和健壯性上都有良好的改進(jìn)。域?qū)ο笤诟鱾€(gè)層之間移動(dòng),為表示層提供所需要的數(shù)據(jù)源,為持久層提供對(duì)象,使得各個(gè)層以一種松散耦合的方式彼此作用而無(wú)需考慮低層的技術(shù)細(xì)節(jié),進(jìn)而構(gòu)建出一個(gè)完整的Web開(kāi)發(fā)框架。
2 系統(tǒng)簡(jiǎn)介及分層實(shí)現(xiàn)
2.1 系統(tǒng)簡(jiǎn)介
渠道是電信運(yùn)營(yíng)商與客戶進(jìn)行交互的具體途徑,是向客戶銷售產(chǎn)品并提供差異化服務(wù)的載體。渠道管理主要承載渠道運(yùn)營(yíng)過(guò)程中的管理支撐功能,包括面向渠道的規(guī)劃建設(shè)和所涉及人員、費(fèi)用等方面的基礎(chǔ)管理功能,以及績(jī)效考核、服務(wù)管理等輔助管理功能。最終通過(guò)系統(tǒng)達(dá)到為渠道業(yè)務(wù)提供服務(wù)、加強(qiáng)渠道管控水平、提高各類渠道商的素質(zhì)及實(shí)力、培育營(yíng)銷渠道系統(tǒng)的核心競(jìng)爭(zhēng)力,并引導(dǎo)各渠道商積極配合電信運(yùn)營(yíng)商推行相關(guān)市場(chǎng)政策。
圖2為某省渠道管理系統(tǒng)的功能結(jié)構(gòu)圖,主要包括渠道規(guī)劃建設(shè)管理、業(yè)務(wù)管理、費(fèi)用管理、運(yùn)營(yíng)考核管理、積分管理、酬金管理、系統(tǒng)管理、資源管理、支撐服務(wù)管理、統(tǒng)計(jì)報(bào)表等十大功能模塊。該系統(tǒng)服務(wù)器操作系統(tǒng)采用Unix(solaris),關(guān)系型數(shù)據(jù)庫(kù)采用Oracle,應(yīng)用服務(wù)器根據(jù)資金投入選擇了Oracle 的Weblogic。客戶機(jī)的操作系統(tǒng)選用Windows2000、WindowsXP等版本,安裝IE6.0以上的瀏覽器。
2.2 SSH架構(gòu)分層實(shí)現(xiàn)
2.2.1 數(shù)據(jù)持久層的搭建
持久層Persistence主要完成數(shù)據(jù)的訪問(wèn),它操作底層的數(shù)據(jù)庫(kù)表,使用DAO組件封裝具體的操作細(xì)節(jié),為業(yè)務(wù)層提供接口,使業(yè)務(wù)邏輯與數(shù)據(jù)持久化分離。在Hibernate中,通過(guò)配置相應(yīng)的XML文件(*.hbm.xml)來(lái)完成對(duì)象與表、對(duì)象屬性與表字段的“O/R映射”關(guān)系。Hibernate運(yùn)行時(shí),會(huì)自動(dòng)讀取XML映射文件,然后按照該文件指定的規(guī)則動(dòng)態(tài)構(gòu)建Java類,以便管理數(shù)據(jù)在數(shù)據(jù)庫(kù)與Java程序之間的轉(zhuǎn)換。
持久層的訪問(wèn)通過(guò)DAO組件完成,下面以渠道組織機(jī)構(gòu)信息表(Dchngroupmsg)為例介紹DAO組件建立的過(guò)程。
首先使用自動(dòng)化工具生成JAVA的VO(Value Obects)對(duì)象DchngroupmsgVo和*.hbm.xml映射文件。Dchngroup-
msgVo類的屬性與映射文件Dchngroupmsg.hbm.xml中的字段是一一對(duì)應(yīng)的,它完成了對(duì)象與表、對(duì)象屬性與表字段的“O/R映射”。同時(shí)所有映射文件需要在Spring框架的application-Context.xml中配置,這樣在Hibernate啟動(dòng)時(shí)才能根據(jù)該映射文件真正完成對(duì)象/關(guān)系的映射。
其次是DAO組件的實(shí)現(xiàn)與配置。DAO組件繼承了HibernateDaoSupport類,是Spring中整合了Hibernate的支持類,正是由于Spring對(duì)Hibernate的良好整合,調(diào)用Hibernate進(jìn)行數(shù)據(jù)操作時(shí)只需要簡(jiǎn)單地繼承Spring的HibemateDaoSupport類,然后在需要調(diào)用的方法中通過(guò)getHibemateTemplate( )提供的方法就可以方便地操縱Hibernate。
DAO組件實(shí)現(xiàn)后,將它們配置在Spring容器中,讓Spring容器為其注入SessionFactory的引用,并將DAO組件注入到業(yè)務(wù)邏輯組件中。通過(guò)這種依賴注入,可以提供應(yīng)用各組件之間的良好解耦。
2.2.2 業(yè)務(wù)邏輯層的構(gòu)建
在SSH架構(gòu)中Spring是最核心的框架,Spring主要應(yīng)用于業(yè)務(wù)層來(lái)管理其他組件,充當(dāng)了管理容器的角色。負(fù)責(zé)處理應(yīng)用程序業(yè)務(wù)邏輯、業(yè)務(wù)校驗(yàn)和事務(wù)管理[4];同時(shí)管理業(yè)務(wù)層的對(duì)象依賴;在表示層和持久層之間增加了一個(gè)靈活的機(jī)制,使得它們沒(méi)有直接聯(lián)系,借助Spring的IoC、AOP應(yīng)用、面向接口編程,能降低業(yè)務(wù)組件之間的耦合度,增強(qiáng)系統(tǒng)擴(kuò)展性。
構(gòu)建Spring業(yè)務(wù)層主要完成以下兩方面的任務(wù):
(1)對(duì)Spring容器進(jìn)行初始化與配置:Spring提供一個(gè)ContextLoaderListener類用作Spring容器的初始化。Spring容器初始化之后,需要?jiǎng)?chuàng)建 ApplicationContext實(shí)例,Spring有兩個(gè)核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口,增強(qiáng)了BeanFactory的功能,提供系統(tǒng)架構(gòu)服務(wù)。
(2)業(yè)務(wù)邏輯實(shí)現(xiàn):使用面向接口的編程,調(diào)用持久層定義好的接口為表示層提供業(yè)務(wù)接口,而無(wú)需關(guān)心接口的具體實(shí)現(xiàn)細(xì)節(jié),先定義業(yè)務(wù)層的接口SGroupMsgSvcI:
接口SGroupMsgSvcI的實(shí)現(xiàn)類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);
}
}
以上的業(yè)務(wù)邏輯很簡(jiǎn)單,只是通過(guò)簡(jiǎn)單的調(diào)用DchngroupmsgDAO的接口方法來(lái)完成。DchngroupmsgDAO引用是在前面持久層中配置的,這個(gè)配置指示Spring去動(dòng)態(tài)注入DchngroupmsgDAO到SGroupMsgSvcImpl中,實(shí)現(xiàn)渠道組織信息的獲取。
2.2.3 頁(yè)面表示層的建立
Struts實(shí)際上是Servlet技術(shù)的一個(gè)擴(kuò)展,它用一個(gè)ActionServlet來(lái)接收瀏覽器的請(qǐng)求,用于系統(tǒng)的集中控制,然后在相應(yīng)的Action類中調(diào)用業(yè)務(wù)邏輯,最后進(jìn)行流程跳轉(zhuǎn)。
表示層的建立主要是使用標(biāo)簽編寫(xiě)JSP頁(yè)面,定義Struts的Action類及相應(yīng)的配置文件。首先要定義ActionForm,用于收集JSP頁(yè)面?zhèn)鱽?lái)的數(shù)據(jù),供Action中調(diào)用業(yè)務(wù)邏輯使用。為了使用Struts 的Validator框架來(lái)做客戶端的表單驗(yàn)證,ActionForm繼承了org.apache.struts.action.ActionForm的子類ValidatorForm。ActionForm中定義的成員名稱要與JSP頁(yè)面表單中的域名稱一致,這樣在提交數(shù)據(jù)的時(shí)候,Struts會(huì)自動(dòng)把表單中的數(shù)據(jù)封裝到繼承的ActionForm中,避免了以往用request.getParameter獲取參數(shù)的繁瑣。
然后編寫(xiě)Action類,所有的Action類都繼承了自定義的BaseAction類,BaseAction類是 org.apache.struts.actions.DispatchAction的子類,同時(shí)在BaseAction類中實(shí)現(xiàn)了一些公共方法,例如令牌驗(yàn)證判斷是否重復(fù)提交、生成下拉列表、創(chuàng)建上下文ApplicationContext實(shí)例等。Action類從ActionForm中提取數(shù)據(jù),調(diào)用業(yè)務(wù)邏輯,然后根據(jù)返回結(jié)果轉(zhuǎn)向相應(yīng)的頁(yè)面。
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的加載,提供一個(gè)公共的服務(wù)定位器方法getBean(),這里SGroupMsgAction是BaseAction的子類,繼承了父類的getBean方法,所以只要通過(guò)傳入?yún)?shù)“SGroupMsgSvc”即可查找Spring的Bean資源,“SGroupMsgSvc”正是前面業(yè)務(wù)層在配置文件中指定的bean。這樣根據(jù)給定bean的id就能返回配置文件中指定的類。
Struts的控制器ActionServlet接收用戶查詢渠道信息的URL請(qǐng)求“/sGroupMsg.do?operate=queryGroupMsg”,根據(jù)該請(qǐng)求的URL查找struts-config.xml配置文件來(lái)決定該請(qǐng)求是否處理SGroupMsgAction,SGroupMsgAction的queryGroupMsg方法接收頁(yè)面數(shù)據(jù),通過(guò)服務(wù)定位器查找名為“SGroupMsgSvc”的Bean資源,返回業(yè)務(wù)類的接口SGroupMsgSvcI,并以域模型DchngroupmsgVo對(duì)象為參數(shù)調(diào)用業(yè)務(wù)接口的getDchngroupmsgVo方法來(lái)處理業(yè)務(wù)邏輯,若查詢成功則返回一個(gè)自定義邏輯名稱“SUCCESS”的ActionForward對(duì)象,最后ActionServlet把流程轉(zhuǎn)向ActionForward中定義的JSP頁(yè)面(success.jsp),從而完成一次請(qǐng)求/響應(yīng)過(guò)程。
至此,基于Struts、Spring+Hibernate框架開(kāi)發(fā)的渠道組織機(jī)構(gòu)查詢功能開(kāi)發(fā)完成。
本文所設(shè)計(jì)的SSH集成的Web開(kāi)發(fā)框架基于良好的應(yīng)用程序分層和成熟的開(kāi)源項(xiàng)目,具有結(jié)構(gòu)清晰、松散耦合、可擴(kuò)展和可維護(hù)性好的特點(diǎn),已在電信運(yùn)營(yíng)商的各個(gè)省份(如北京、湖南、安徽、山西、陜西、四川,黑龍江、新疆等)的渠道管理系統(tǒng)中得到了非常成功的應(yīng)用。目前系統(tǒng)采用的SSH集成架構(gòu)已成為最為理想和成熟的J2EE Web應(yīng)用框架,而且這種開(kāi)發(fā)模式將會(huì)被越來(lái)越多的程序員所接受,在實(shí)際開(kāi)發(fā)中得到廣泛應(yīng)用。
參考文獻(xiàn)
[1] 郝彬,陳朔鷹.利用框架技術(shù)構(gòu)建Web應(yīng)用.計(jì)算機(jī)工程與設(shè)計(jì)[J].2007,28(1):8-13.
[2] 諶湘倩,狄文輝,孫冬.基于輕量級(jí)J2EE框架的網(wǎng)絡(luò)教學(xué)系統(tǒng)[J].計(jì)算機(jī)工程,2008,34(6):266-268.
[3] 林信良.Spring 2.0技術(shù)手冊(cè)[M].北京:電子工業(yè)出版社, 2007.
[4] 李剛.整合Struts+Hibernate+Spring應(yīng)用開(kāi)發(fā)詳解[M].北京:清華大學(xué)出版社,2007.