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