[摘要] 目前,輕量級J2EE架構(gòu)Struts+Spring+Hibernate已漸漸成為B2C電子商務(wù)系統(tǒng)的主流技術(shù)。本文在對Struts、Spring和Hibernate進行分析的基礎(chǔ)上,對B2C電子商務(wù)系統(tǒng)進行了整體設(shè)計,并對該架構(gòu)下電子商務(wù)系統(tǒng)的技術(shù)實現(xiàn)進行了詳細說明,并給出了相關(guān)構(gòu)造的功能描述和部分核心代碼。本研究中所用的架構(gòu)技術(shù)能提高商務(wù)系統(tǒng)的安全性和穩(wěn)定性,使商務(wù)系統(tǒng)資源得到最大限度的節(jié)省和利用,同時使系統(tǒng)具備更好的可擴展性和可維護性。
[關(guān)鍵詞] Struts+Spring+Hibernate 電子商務(wù)系統(tǒng) 設(shè)計
縱觀電子商務(wù)的發(fā)展歷史,大概可分為兩個階段。第一階段是產(chǎn)品介紹階段,即通過互聯(lián)網(wǎng)公布企業(yè)和產(chǎn)品信息,類似于傳統(tǒng)的廣告方式;第二階段是產(chǎn)品交易階段,企業(yè)間通過基于互聯(lián)網(wǎng)的定單交易系統(tǒng),直接在網(wǎng)上完成交易,主要表現(xiàn)形式有電子采購、電子銷售和電子交易市場三大類網(wǎng)站。目前,大多數(shù)的電子商務(wù)系統(tǒng)主要由供求系統(tǒng)、新聞發(fā)布系統(tǒng)、“知道”系統(tǒng)、B2C系統(tǒng)四部分構(gòu)成。其中B2C系統(tǒng)是電子商務(wù)系統(tǒng)的核心系統(tǒng),為整個商務(wù)平臺構(gòu)建了一個基本框架,主要提供電子商情,能夠促進消費者購買商品,從而產(chǎn)生電子購物和交易。隨著Internet的迅猛發(fā)展與J2EE技術(shù)的成熟,使用Web應(yīng)用框架的開發(fā)者的人數(shù)得到了快速地增長??蚣芡ㄟ^為應(yīng)用開發(fā)提供預(yù)先準備好的起步器,來幫助開發(fā)者更快、更好地建立應(yīng)用??蚣艿氖褂谜诘玫娇焖俚匕l(fā)展,現(xiàn)在已經(jīng)有幾十個可選的Web應(yīng)用框架,在這些框架中比較流行的輕量級J2EE架構(gòu)是Struts+Spring+Hibernate。本文研究的是利用“Struts+Spring+Hiber-nate”架構(gòu)技術(shù)對電子商務(wù)系統(tǒng)的核心系統(tǒng)B2C所進行的設(shè)計。
一、Struts、Spring和Hibernate簡介
1.Struts MVC設(shè)計模式
Struts MVC(Model-View-Controller)把一個應(yīng)用程序數(shù)據(jù)的輸入、處理、輸出處理操作流程劃分為模型層、視圖層和控制器。這三次的具體業(yè)務(wù)規(guī)則如下:模型層(Model),表示業(yè)務(wù)邏輯和業(yè)務(wù)規(guī)則,Struts MVC為模型提供了Action和ActionForm兩個對象。由ActionForm 進行數(shù)據(jù)封裝,Action進行業(yè)務(wù)處理,模型可以用JavaBean、Hibernate等組件技術(shù)來處理數(shù)據(jù)庫的訪問。視圖層(View),它就是我們通常所說的表示層。Struts的視圖是由JSP以及用戶自定義標簽組成,模型進行操作之后,其結(jié)果就是通過視圖來顯示的。在視圖中不建議進行大量的數(shù)據(jù)處理操作和業(yè)務(wù)操作,只是給用戶提供要處理的數(shù)據(jù)的顯示??刂破?Controller),它用于管理模型與視圖發(fā)生的交互。在Struts中主要的控制器組件有struts-contig.xml和ActionServlet。用戶進行數(shù)據(jù)處理時,它不能直接去執(zhí)行模型,而是通過控制器來間接地實現(xiàn)。控制器控制視圖提交數(shù)據(jù),然后由控制器控制相應(yīng)的模型層進行數(shù)據(jù)處理操作。模型處理完數(shù)據(jù)后,再由控制器找到相應(yīng)的視圖進行數(shù)據(jù)的顯示。
2.Spring框架
Spring是一個開源框架,它是一個以控制反轉(zhuǎn)(IOC)和面向切面(AOP)編程為基礎(chǔ)的輕量級框架。Spring通過控制反轉(zhuǎn)(inversion of contro1,IOC)這一機制實現(xiàn)降低代碼耦合度。當應(yīng)用控制反轉(zhuǎn)時,對象都是被動地給予它們的依賴,而不是主動地去創(chuàng)建或?qū)ふ宜鼈兊囊蕾噷ο蟆M瑫rSpring為面向切面編程提供了有效的支持,面向切面編程能使來自系統(tǒng)服務(wù)的單個的應(yīng)用業(yè)務(wù)邏輯粘合起來。應(yīng)用對象做它假定做的業(yè)務(wù)邏輯,其它的就什么也不做。Spring作為容器,可以管理自己的生命周期和配置應(yīng)用對象。使用者可以通過配置原形來讓Bean彼此創(chuàng)建或者通過創(chuàng)建一個單一實例或者在每次需要的時候創(chuàng)建一個實例,當然這些原形要彼此互相關(guān)聯(lián)。
3.Hibernate框架
Hibernate是一種實現(xiàn)對象和關(guān)系之間映射(Object RelationMapping)的框架。它是一種新的ORM映射工具,它同時提供了從Java類到數(shù)據(jù)表的映射和數(shù)據(jù)查詢、恢復等機制,實現(xiàn)數(shù)據(jù)層對象的持久性。相對于使用JDBC和SQL來手工操作數(shù)據(jù)庫,使用Hibernate可以大大減少操作數(shù)據(jù)庫的工作量。并且Hi.bema可以和多種Web服務(wù)器以及應(yīng)用服務(wù)器良好地集成。Hibernate是JDBC的輕量級對象封裝,這使得Java程序員可以使用面向?qū)ο蟮木幊碳夹g(shù)來操作關(guān)系數(shù)據(jù)庫,而不必花費大量的時間去更新和維護復雜的數(shù)據(jù)持久層.從而降低J2EE架構(gòu)應(yīng)用軟件開發(fā)的難度和復雜度。提高Java應(yīng)用軟件的開發(fā)效率。
二、基于Struts、Spring、Hibernate的B2C電子商務(wù)系統(tǒng)的設(shè)計
1.B2C系統(tǒng)整體設(shè)計
根據(jù)電子商務(wù)系統(tǒng)的主要構(gòu)成情況,筆者利用Struts+Spring+Hibernate架構(gòu)技術(shù)對B2C系統(tǒng)的框架進行了設(shè)計,分別設(shè)計有表現(xiàn)層、業(yè)務(wù)邏輯層、持久層。
表現(xiàn)層——提供與用戶交互的界面。GUI(圖形用戶界面)和web頁面是表現(xiàn)層的兩個典型例子;業(yè)務(wù)邏輯層——該層借助了Spring,通過控制反轉(zhuǎn)、AOP應(yīng)用、面向接口編程,來降低業(yè)務(wù)組件之間的耦合度,增強系統(tǒng)擴展性。spring框架是—個分層架構(gòu),由七個定義良好的模塊組成,其中最重要的模塊就是核心容器,核心容器定義了創(chuàng)建、配置和管理bean的方式,提供Spring框架的基本功能,核心容器的主要組件是BeanFactory,它是工廠模式的實現(xiàn)。BeanFactory使用控制反轉(zhuǎn)(IOC)模式將應(yīng)用程序的配置和依賴、規(guī)范與實際的應(yīng)用程序代碼分開。持久層——該層使用對象——關(guān)系映射(ORM)開源項目Hibernate,Hibernate為java提供了ORM持久化機制和查詢服務(wù),通過在XML文件中定義對象和關(guān)系的映射關(guān)系。
層與層之間的關(guān)系特征:首先,每個層由一組相關(guān)的類或組件構(gòu)成,共同完成特定的功能。其次,層與層之間存在自上而下的依賴關(guān)系,即上層組件會訪問下層組件的API,而下層組件不應(yīng)該依賴上層組件。例如,表現(xiàn)層依賴于業(yè)務(wù)邏輯層,而業(yè)務(wù)邏輯層依賴于持久層。最后每個層對上層公開API,但具體的實現(xiàn)細節(jié)對外透明。當某一層的實現(xiàn)發(fā)生變化,只要它的API不變,不會影響其它層的實現(xiàn)。
2.B2C系統(tǒng)Struts表現(xiàn)層開發(fā)
Struts的核心控制器由ActionServlet類和Action類來實現(xiàn)。ActionServlet類在電子商務(wù)系統(tǒng)MVC模型中扮演中央控制器的角色,主要負責接收HTTP請求信息,它通過存儲在特定的XML文件中的struts-config.xml的配置映射信息把請求轉(zhuǎn)發(fā)給適當?shù)腁ction對象,一個電子商務(wù)系統(tǒng)用戶請求就是通過ActionServlet被進行處理和轉(zhuǎn)發(fā)的。
下面是B2C電子商務(wù)系統(tǒng)中一個子模塊的Struts-config.xml文件片段的范例。Struts-config.xml是Struts的核心配置文件,要跟業(yè)務(wù)邏輯層相結(jié)合,同時也加載了Spring,其關(guān)鍵代碼如下:
<action-mappings>
<action path=”/order” type=”org.springframework.web.struts.DelegatingActionProxy”name=”O(jiān)rderForm”>
</action>
</action-mappings>
<! - - = = Spring plugin - - >
<plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”>
<set-property property “contextConfigLocation”value=“/WEB-INF/classes/
applicationContext.xm1./WEB-INF/Classes/action-servlet.xml”/>
</plug-in>
3.Spring在B2C系統(tǒng)中的作用
為實現(xiàn)對Spring IOC容器的訪問,應(yīng)用代碼可以通過如下兩個接口完成:⑴BeanFact-ory:開發(fā)者借助于配置文件(如XML或?qū)傩晕募?能夠?qū)崿F(xiàn)對JavaBean的配置和管理。⑵ApplicationContext:構(gòu)建在BeanFactory基礎(chǔ)之上,除了具有BeanFactory的功能之外,還添加了時間、聲明(非)容器提供的服務(wù)等其它功能。主要用于開發(fā)J2EE應(yīng)用,這也是Spring推薦使用的接口。
首先我們看下B2C系統(tǒng)的ApplicationContext.xml文件片段,在文件中把數(shù)據(jù)庫訪問的代碼封裝成一個Bean,然后在XML文件里進行配置。在這里dataSource1這個Bean的生命周期分4個階段:
(1)實例化JavaBean(也就是dataSource1)。
(2)JavaBean實例的初始化,即通過IOC注入其依賴性。這一階段將完成JavaBean實例的初始化。
<bean id=”dataSourcel”
class=”org.apache.commons.dbcp.BasicDataSource”
destroy-method=”close”>
<property name=”driverClassName”
Value=”net.sourceforge.jtds.jdbc.Driver”/>
<property name=”url”value=”jdbc.jtds.sqlserver://172.18.1.8:
1433;DatabaseName=webShop”/>
<property name=”usename”value=”sa”/>
<property name=”password”value=”lqaz2wsx”/>
<property name=”maxldle”value=”5”/>
</bean>
(3)基于Spring應(yīng)用對JavaBean實例的使用。一旦Spring創(chuàng)建,并初始化JavaBean實例后,應(yīng)用就能夠使用JavaBean實例了,因此,借助于getBean方法,電子商務(wù)系統(tǒng)開發(fā)者就能夠在應(yīng)用中進行使用。
(4)IOC容器銷毀JavaBean實例。
<bean id=”dataSourcel”
class=”org.apache.commons.dbcp.BasicDataSource”
destroy-method=”close”>
在不同的事務(wù)服務(wù)間切換,只會涉及到Spring配置文件的修改,而不會涉及到代碼的修改。
4.B2C系統(tǒng)Hibernate持久化層開發(fā)
Hibernate是連接Java對象模型和關(guān)系數(shù)據(jù)模型的橋梁,現(xiàn)在越來越多的Java開發(fā)人員把Hibernate作為企業(yè)應(yīng)用和關(guān)系數(shù)據(jù)庫之間的中間件,以節(jié)省和對象持久化有關(guān)的三層以上的JDBC編程工作量。
(1)系統(tǒng)的Hibernate數(shù)據(jù)持久層功能實現(xiàn)可通過hibernate-sevice.xml進行Hibernate屬性的設(shè)置,設(shè)置內(nèi)容如下:
<server>
<mbean code=”org.jboss.hibernate.jmx.Hibernate” name=”jboss.har:service=Hibernate”>
<attribute name=”DatasourceName”>java:/OracleDS
</attribute>
<attribute name=”Dialect”>net.sf.hibernate.dialect.Oracle9Dialect</attribute>
<attribute name=”SessionFactoryName”>
java:/hibernate/SessionFactory</attribute>
<attribute name=”CacheProviderClass”>
Net.sf.hibernate.cache.HashtableCacheProvider</attribute>
</mbean >
</server>
建立數(shù)據(jù)持久層時,就可以先為服務(wù)器中的數(shù)據(jù)表定義實體Bean(Entity Bean)了。
(2)Hibernate映射框架根據(jù)與每一對實體類和數(shù)據(jù)表相關(guān)的XML映射文件來實現(xiàn)ORM,通過Hibernate中的ant hibernate命令建立了每個實體類的XML文件。每一個描述數(shù)據(jù)表的實體類都有相應(yīng)的XML文件,保證執(zhí)行業(yè)務(wù)邏輯處理時通過會話Bean調(diào)用實體Bean,可以實現(xiàn)對服務(wù)器數(shù)據(jù)庫的無縫訪問。
(3)創(chuàng)建“對象——關(guān)系”映射文件。Hibernate采用XML格式的文件來指定對象和關(guān)系數(shù)據(jù)之間的映射,在運行時,Hibernate將根據(jù)這個映射文件來生成各種SQL語句。這一步所創(chuàng)建的文件,它用PromotionEvent類映射到PR0M0T10-NEVENT表,這個文件應(yīng)和PromotionEv-ent.Class文件放在同一目錄下。
(4)通過Hibernate API編寫訪問數(shù)據(jù)庫的代碼。Hibernate對JDBC進行了封裝,提供了充分面向?qū)ο蟮腁PI。
三、結(jié)束語
本文使用了輕量級J2EE架構(gòu)Struts+Spring+Hibernate對電子商務(wù)系統(tǒng)B2C核心系統(tǒng)進行了設(shè)計,并分析了各個環(huán)節(jié)的關(guān)鍵技術(shù)和實現(xiàn)問題。使用這一技術(shù)設(shè)計的商務(wù)系統(tǒng)很好地把業(yè)務(wù)邏輯和表示層分離,這種分離使得系統(tǒng)不至于“牽一發(fā)而動全身”,同時,也便于業(yè)務(wù)邏輯模塊的重用。這三種技術(shù)結(jié)合起來充分利用它們的優(yōu)勢,使得基于這三種技術(shù)的B2C商務(wù)系統(tǒng)應(yīng)用框架開發(fā)簡潔、結(jié)構(gòu)清晰,有很好的可擴展性和可維護性,適用于面向?qū)ο蟮脑O(shè)計與開發(fā)。另外,本文所開發(fā)的B2C電子商務(wù)系統(tǒng)特別適用在學校和大型商場等人員密集、且可能發(fā)生集中支付的組織內(nèi)使用。
參考文獻:
[1]李偉鐮盧建朱:基于Struts和Hibernate的電子申購系統(tǒng)[J].計算機工程,2005,31(19):220-222
[2]楊明根鄭明秀廖浩德:Struts+Spring+Hibernate架構(gòu)及開發(fā)方法[J].西南民族大學學報#8226;自然科學版,2007,(4):953-956
[3]廖福保張文梅:基于Struts-I-Spring-I-Hibernate框架的應(yīng)用研究[J].廣東農(nóng)工商職業(yè)技術(shù)學院學報,2007,(11):51-54
[4]李保華:基于Struts+EJB+Hibernate的授信風險管理系統(tǒng)設(shè)計[J].計算機與信息技術(shù),2007,(4):87-89
[5]王非丁元林文昌:應(yīng)用架構(gòu)技術(shù)設(shè)計與開發(fā)電子商務(wù)系統(tǒng)[J].計算機工程與設(shè)計,2007(11):5507-5510