趙峰
(哈爾濱理工大學(xué),黑龍江 哈爾濱150080)
軟件架構(gòu)是一系列相關(guān)的抽象模式,用于指導(dǎo)大型軟件系統(tǒng)各個方面的設(shè)計。Java Web軟件架構(gòu)是指基于Java EE技術(shù)構(gòu)建的軟件架構(gòu),根據(jù)Java Web的分層設(shè)計可以選擇使用不同的軟件框架(Framework)進行實現(xiàn)。正因為有著如此豐富的框架和其它的輔助技術(shù),使得我們在開發(fā)Java Web應(yīng)用的時候,就要根據(jù)具體的業(yè)務(wù)需求來確定使用哪個框架哪種技術(shù)或哪幾種框架和技術(shù)進行集成,以使得我們開發(fā)、部署、運行和維護Java Web應(yīng)用的成本降至最低。本文探討的就是如何根據(jù)具體的業(yè)務(wù)需求集成現(xiàn)有框架和技術(shù),快速而有效地搭建應(yīng)用系統(tǒng)。
1.1 Struts2
Apache Struts 2是一個優(yōu)雅的,用于創(chuàng)建企業(yè)級的Java Web應(yīng)用程序的可擴展框架。該框架旨在簡化整個開發(fā)周期,涵蓋應(yīng)用的開發(fā),部署,以及維護的全過程。Struts2的核心包括FilterDispatcher、攔截器和Action以及展現(xiàn)用戶界面的Template和Tag,囊括了MVC模型的全部組成。
1.2 Spring是一個開源框架,它是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的??蚣艿闹饕獌?yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許用戶選擇使用哪一個組件。這也是它與Struts、Hibernate等其他框架不同的地方。Spring框架的分層架構(gòu),由7個定義良好的模塊組成Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理Bean的方式。
1.3 Hibernate
Hibernate是一個面向Java環(huán)境的對象/關(guān)系數(shù)據(jù)庫映射工具,用來把對象模型表示的對象映射到基于SQL的關(guān)系模型數(shù)據(jù)結(jié)構(gòu)中去。Hibernate不僅僅管理Java類到數(shù)據(jù)庫表的映射,還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時人工使用SQL和JDBC處理數(shù)據(jù)的時問。
1.4 Ajax
Ajax是基于標準Web技術(shù)創(chuàng)建的、能夠以更少的響應(yīng)時間帶來豐富的用戶體驗的一類Web應(yīng)用程序所使用的技術(shù)的集合。
DWR是實現(xiàn)Ajax技術(shù)的一個簡單選擇。DWR工作原理是通過動態(tài)把Java類生成為JavaScript,使用戶感覺調(diào)用發(fā)生在瀏覽器端,但實際代碼調(diào)用發(fā)生在服務(wù)器端,DWR負責數(shù)據(jù)的傳送和轉(zhuǎn)換。其優(yōu)點在于不需要任何瀏覽器插件就能運行在網(wǎng)頁上。
圖1 S2SHA框架總體設(shè)計
基于Struts2、Spring、Hibernate和Ajax集成的S2SHA框架總體設(shè)計如圖1所示。
其中,Web表現(xiàn)層使用Struts2的控制器FilterDispatcher負責管理用戶的請求和顯示用戶數(shù)據(jù),頁面技術(shù)使用JSP+Ajax。JSP中包含傳統(tǒng)的頁面格式控制CSS文件。為了國際化字符信息,需要配置相應(yīng)的.properties文件并在struts.xml文件中定義相應(yīng)的控制器。
業(yè)務(wù)邏輯層使用Spring作為業(yè)務(wù)邏輯框架,通過讀取配置文件,Spring IoC容器自動生成和管理Bean實例,Spring還提供了事務(wù)管理,Action類實例的管理,基于Spring AOP的日志和權(quán)限管理等。
數(shù)據(jù)持久層采用Hibernate框架,提供從數(shù)據(jù)庫表到POJO對象的映射,屏蔽所有的數(shù)據(jù)庫操作。建立相應(yīng)的DAO類,DAO類的實例由Spring容器管理。
總之,讓Strust2負責表現(xiàn)處理,讓Spring負責裝配和解耦復(fù)雜的業(yè)務(wù)邏輯處理對象,讓Hibernate負責處理O/R映射和持久化,讓Ajax來改進用戶體驗。
2.1 Struts2和Spring的集成
Struts2與Spring集成主要是利用Spring強大的容器功能,Struts2所需要的一切組件和實例都由Spring的IoC容器負責創(chuàng)建和管理其生命周期。這樣就解放了控制器,實現(xiàn)了控制器和業(yè)務(wù)邏輯組件的高層次解耦,控制器只是業(yè)務(wù)邏輯組件的使用者,只需向Spring容器請求既可,Spring容器會自動地將控制器需要的業(yè)務(wù)邏輯組件進行組裝。Struts2和Spring集成的步驟如下:
①在web.xml中注冊名為contextConfigLocation的context-param,值為/WEB-INF目錄下的applicationContext.xml文件;注冊listener:org.springframework.web.context.ContextLoaderListener和org.apache.struts2.dispatcher.Filter-Dispatcher。
②在struts.xml中注冊類似于name="honorlist"class="honorList"method="list"的action,其中,'class="honorList"'定義的是偽Action名。
③在applicationContext.xml中注冊Bean:
其 中,'bean name="honorList"'是對應(yīng)struts.xml的偽Action名,后面的class是真正的Action類名。第二個bean是前邊Action組件所需要的業(yè)務(wù)邏輯組件,'autowire="byName"'給出了Spring的自動裝配方式。
2.2 Spring與Hibernate的集成
Spring為集成Hibernate,提供了3個工具類:HibernateDaoSupport、HibernateTemplate和HibernateCallback。同時,Spring負責管理Hibernate的SessionFactory bean和眾多DAO Bean。集成步驟如下:
①在applicationContext.xml中定義數(shù)據(jù)源,使用C3P0:
class="com.mchange.v2.c3p0.ComboPooledData- Source" destroy-method="close">
②定義SessionFactory
class="org.springframework.orm.hibernate3.Lo calSessionFactoryBean"> alect.MySQLDialect
③配置事務(wù)管理
class="org.springframework.orm.hibernate3.Hi bernateTransactionManager">
然后在每個DAO類中加上@Transactional注解。
2.3 Ajax的集成
遵循由Spring管理一切bean的原則,DWR所使用的Java Bean也交由Spring容器統(tǒng)一管理,具體步驟如下:
①在web.xml中注冊DWR的servlet,其class是uk.ltd.getahead.dwr.DWRServlet。
②在dwr.xml中定義JavaScript類到服務(wù)器端的映射:
其中creator="spring"表示由Spring容器管理服務(wù)器端Suggest實例;value="suggest"表示Spring管理的Bean名稱。
③在applicationContext.xml中定義"suggest"Bean:
④在視圖頁面中引入
其中,'zf50'是項目的絕對路徑,'suggest.js'是自定義的函數(shù)文件,包含對Suggest對象的調(diào)用。
系統(tǒng)的業(yè)務(wù)結(jié)構(gòu)如圖2所示
普通用戶和信息審核員對信息進行相互認證的活動圖如圖3,4所示:
在表現(xiàn)層使用Struts2來實現(xiàn)MVC模式,輔以基于DWR框架的Ajax技術(shù)豐富用戶界面。Struts2使用web.xml中定義的FilterDispatcher攔截到表現(xiàn)層提交的請求,通過讀取struts.xml文件查找對應(yīng)的Action,找到其對應(yīng)的Action類,向Spring請求其實例,調(diào)用Action實例中相應(yīng)的validate方法,然后調(diào)用Spring注入的相應(yīng)Service實例的業(yè)務(wù)方法,Service實例再次調(diào)用Spring注入的DAO實例,逐級返回需要傳遞給表現(xiàn)層的值,然后根據(jù)邏輯視圖名進行跳轉(zhuǎn),返回到表現(xiàn)層,展現(xiàn)響應(yīng)。
系統(tǒng)運行效果如圖5所示。
隨著越來越多的框架技術(shù)應(yīng)用在Java EE企業(yè)級軟件開發(fā)當中,如何選取合適的框架和相關(guān)技術(shù)進行集成,是快速、有效、低成本的構(gòu)建Java EE應(yīng)用所面臨的問題。文本通過分析研究Java EE軟件架構(gòu)的的發(fā)展變化和各種流行框架技術(shù)的原理和工作過程,提出一個集成Struts2、Spring和Hibernate并加入Ajax交互技術(shù)的快速開發(fā)WEB應(yīng)用的軟件架構(gòu)S2SHA模型。通過集成各個框架技術(shù)的優(yōu)點來到達以最小代價開發(fā)最優(yōu)軟件系統(tǒng)的目標。最后通過運用本文研究的S2SHA模型來實際開發(fā)一個應(yīng)用系統(tǒng),驗證這種集成技術(shù)是有效的,可以滿足快速開發(fā)WEB應(yīng)用的需要,并能夠?qū)崿F(xiàn)系統(tǒng)結(jié)構(gòu)間的充分解耦,具有很好的可擴展和可移植性。
[1]DWR-Easy Ajax for JAVA[EB/OL].http://directwebremoting.org/dwr/index.html
[2]Spring Projects[EB/OL].http://www.springsource.org/
[3]The Apache Struts Project[EB/OL].http://struts.apache.org
[4]JBoss Hibernate[EB/OL].http://www.jboss.com/products/hibernate.