梁 弼, 張紫桂, 熊 倫
(1.四川文理學(xué)院 智能制造學(xué)院, 四川 達(dá)州 635000; 2.紹興文理學(xué)院 土木工程學(xué)院, 浙江 紹興 312000)
目前,分層架構(gòu)設(shè)計(jì)思想已在Web應(yīng)用系統(tǒng)研發(fā)中得到了廣泛使用,并且J2EE三層Web應(yīng)用架構(gòu)是當(dāng)前主流的多層架構(gòu),它把一個(gè)完整的Web應(yīng)用系統(tǒng)劃分為三層,從上到下依次為表示層、業(yè)務(wù)邏輯層及數(shù)據(jù)訪問層,這三層分別承擔(dān)特定的任務(wù),而且不同層的任務(wù)采用不同的技術(shù)來實(shí)現(xiàn).其中,表示層的任務(wù)由Struts來完成,業(yè)務(wù)邏輯層的任務(wù)由Spring來承擔(dān),而數(shù)據(jù)訪問層的任務(wù)則通過Hibernate來實(shí)現(xiàn),各層之間相互協(xié)作一起完成整個(gè)系統(tǒng)的所有功能[1].這種以Struts、Spring和Hibernate為關(guān)鍵技術(shù)的三層Web應(yīng)用架構(gòu)被稱為經(jīng)典J2EE三層架構(gòu),它有利于Web應(yīng)用系統(tǒng)的分析、設(shè)計(jì)、實(shí)現(xiàn)、部署和維護(hù)等,目前已廣泛應(yīng)用于各種Web應(yīng)用系統(tǒng),譬如網(wǎng)上購書系統(tǒng)、在線學(xué)習(xí)平臺(tái)等[2].
但是,由于經(jīng)典J2EE三層架構(gòu)所使用的Struts、Spring和Hibernate三種技術(shù)來源于不同公司,其本身是三種不同類型的開源框架,分別用于實(shí)現(xiàn)Web應(yīng)用系統(tǒng)中三層各自所承擔(dān)的不同任務(wù),當(dāng)開發(fā)人員進(jìn)行系統(tǒng)整合時(shí)往往會(huì)出現(xiàn)Jar包、XML配置文件以及代碼不兼容等異常情況,從而導(dǎo)致系統(tǒng)難以整合,進(jìn)而延長系統(tǒng)開發(fā)時(shí)間,間接增加系統(tǒng)開發(fā)成本.此外,交付后的系統(tǒng)還存在可擴(kuò)展性差、可維護(hù)性弱等問題,并且這些問題目前在大規(guī)模企業(yè)級(jí)Web應(yīng)用系統(tǒng)研發(fā)中越發(fā)明顯.
為了有效解決這些問題,本文有機(jī)融合三層架構(gòu)和MVC模式,提出了一種以Spring框架為基礎(chǔ)的輕量級(jí)PCBADM架構(gòu),并將它應(yīng)用于紅色遺址保護(hù)系統(tǒng)等案例,實(shí)際使用證明了其正確性、可行性和有效性.
三層架構(gòu)是目前使用最為普遍的一種多層架構(gòu).其中,表示層為用戶可以直接訪問和交互的層次,用于顯示數(shù)據(jù)、接收用戶輸入的數(shù)據(jù)以及為用戶提供一種交互式操作界面.業(yè)務(wù)邏輯層是系統(tǒng)架構(gòu)中核心的部分,封裝了業(yè)務(wù)邏輯、領(lǐng)域概念、數(shù)據(jù)訪問邏輯等,主要集中在業(yè)務(wù)規(guī)則的制定、業(yè)務(wù)流程的實(shí)現(xiàn)等.數(shù)據(jù)訪問層主要是負(fù)責(zé)訪問數(shù)據(jù),可以訪問數(shù)據(jù)庫系統(tǒng)、二進(jìn)制文件、文本文檔以及XML文件等[3].三層中有些層次可以進(jìn)一步劃分,使它變?yōu)楦鄬拥募軜?gòu)模型,譬如本文從業(yè)務(wù)邏輯層分離出控制層和域模型層.并且,各層的任務(wù)可以采用不同技術(shù)來實(shí)現(xiàn),目前常用的技術(shù)是Struts、Spring和Hibernate,即經(jīng)典J2EE三層架構(gòu).
MVC(Model-View-Controller)是目前流行的一種軟件設(shè)計(jì)模式,已廣泛應(yīng)用于各類應(yīng)用系統(tǒng),它由Model、View和Controller三個(gè)組件組成[4].其中,Model處理應(yīng)用程序的數(shù)據(jù)邏輯,View處理數(shù)據(jù)顯示,Controller處理用戶與Web應(yīng)用系統(tǒng)的數(shù)據(jù)交互.MVC的目標(biāo)是有效分離Model和View的實(shí)現(xiàn)代碼,靈活地讓同一個(gè)程序可以使用多種表現(xiàn)形式,譬如一批從后臺(tái)返回的統(tǒng)計(jì)數(shù)據(jù)可以用折線圖、餅狀圖或柱狀圖等形式來展示它們.Controller的作用是確保Model和View的恰當(dāng)同步,當(dāng)Model一改變,View相應(yīng)地進(jìn)行同步更新.MVC的核心思想是將應(yīng)用系統(tǒng)的視圖功能、模型功能和控制功能在不同的層上分別實(shí)現(xiàn).因此,本文恰當(dāng)利用MVC模式的思想和Controller組件的功能來設(shè)計(jì)PCBADM架構(gòu)中的控制層.
Spring框架是輕量級(jí)一站式企業(yè)應(yīng)用程序解決方案,它由Spring Core、Spring AOP、Spring ORM、Spring DAO、Spring Web、Spring Context和Spring Web MVC七個(gè)模塊構(gòu)成[5].由于不同模塊承擔(dān)不同任務(wù),在具體應(yīng)用中研發(fā)者可以根據(jù)需要來選擇所需的模塊,因此本文所提出的PCBADM架構(gòu)主要由Spring Core模塊、Spring Web MVC模塊和Spring DAO模塊組合而成.其中,Spring Core是Spring框架最基本、最核心的部分,它提供了依賴注入DI的功能以及對(duì)Bean容器的管理功能.Spring DAO實(shí)現(xiàn)了對(duì)JDBC輕量級(jí)封裝,用以提供對(duì)JDBC操作的支持.Spring Web MVC提供了一個(gè)完整的MVC解決方案,通過使用該模塊來開發(fā)Web應(yīng)用系統(tǒng)能夠很好地與IoC容器相結(jié)合.
本文基于經(jīng)典J2EE三層架構(gòu)和MVC模式,并以開源的Spring輕量級(jí)框架中三個(gè)模塊(即Spring Core、Spring Web MVC和Spring DAO)為核心,同時(shí)有效融合Spring IoC/DI、Spring MVC和Spring JDBC等Spring框架相關(guān)技術(shù)構(gòu)建了輕量級(jí)的PCBADM架構(gòu),即表現(xiàn)層(P:Presentation layer)、控制層(C:Control layer)、業(yè)務(wù)邏輯層(B:Business layer)、數(shù)據(jù)訪問層(A:Access layer)、數(shù)據(jù)層(D:Data layer)和域模型層(M:Model layer).其中,Spring Core模塊承擔(dān)業(yè)務(wù)邏輯層任務(wù),使用Spring IoC/DI等技術(shù)來實(shí)現(xiàn)[6];Spring Web MVC模塊承擔(dān)控制層任務(wù),采用Spring MVC框架技術(shù)來完成[7];Spring DAO模塊承擔(dān)數(shù)據(jù)訪問層任務(wù),使用Spring JDBC技術(shù)來實(shí)現(xiàn)[8].其具體架構(gòu)設(shè)計(jì)如圖1所示[9].
圖1 PCBADM架構(gòu)圖
由圖1可見,該多層架構(gòu)主要使用Spring框架的相關(guān)技術(shù)來完成,相對(duì)經(jīng)典J2EE三層架構(gòu)而言,它所使用的技術(shù)更為單一,當(dāng)后期進(jìn)行系統(tǒng)整合時(shí)不管是代碼整合還是XML配置整合都更加容易,并能有效避免不同框架技術(shù)整合時(shí)Jar包、XML文件等不兼容情況出現(xiàn).同時(shí),該多層架構(gòu)是一種弱耦合結(jié)構(gòu),層與層之間的依賴是向下的,下層對(duì)上層來講是透明的,改變上層的設(shè)計(jì)對(duì)于其調(diào)用的下層而言沒有任何影響,這不僅有力地提高了各層實(shí)現(xiàn)的靈活性,而且恰當(dāng)?shù)貙?shí)現(xiàn)了軟件設(shè)計(jì)目標(biāo)--高內(nèi)聚低耦合,這有利于Web應(yīng)用系統(tǒng)后期的擴(kuò)展和維護(hù).
表現(xiàn)層(P)是用戶接口(即Web界面),用于接收用戶輸入的數(shù)據(jù)以及顯示后臺(tái)返回的響應(yīng)結(jié)果,這主要通過Html5或JSP等技術(shù)來實(shí)現(xiàn).控制層(C)接收來自于表現(xiàn)層的用戶請(qǐng)求,并對(duì)請(qǐng)求信息進(jìn)行轉(zhuǎn)發(fā)控制,然后調(diào)用業(yè)務(wù)邏輯層相應(yīng)的業(yè)務(wù)Bean完成具體事務(wù),最后再將處理結(jié)果返回到表現(xiàn)層,其作用相當(dāng)于傳統(tǒng)的Servlet,因此該任務(wù)主要由Spring MVC來完成[10].業(yè)務(wù)邏輯層(B)處于控制層和數(shù)據(jù)訪問層之間,在數(shù)據(jù)交換中起著承上啟下的作用,它包含具體應(yīng)用的業(yè)務(wù)對(duì)象、業(yè)務(wù)規(guī)則和業(yè)務(wù)服務(wù),完成特定的業(yè)務(wù)邏輯功能,并封裝成JavaBean組件交由Spring IoC容器進(jìn)行管理[11].這樣通過使用IoC容器,并利用DI的方式,可以有效實(shí)現(xiàn)業(yè)務(wù)對(duì)象之間的解耦和業(yè)務(wù)Bean之間的交互.
數(shù)據(jù)訪問層(A)是連接數(shù)據(jù)庫的接口,負(fù)責(zé)從一個(gè)或者多個(gè)數(shù)據(jù)庫中查詢或者更新數(shù)據(jù)的一組類或組件,用來定義、添加、查找、修改及刪除數(shù)據(jù),并管理應(yīng)用服務(wù)對(duì)數(shù)據(jù)的請(qǐng)求操作,這由Spring JDBC來承擔(dān).數(shù)據(jù)層(D)是系統(tǒng)狀態(tài)持續(xù)性的實(shí)際表現(xiàn),它為整個(gè)Web應(yīng)用提供數(shù)據(jù)服務(wù),數(shù)據(jù)服務(wù)一般都涉及大存儲(chǔ)量的數(shù)據(jù)資源,必須借助外部存儲(chǔ)工具來實(shí)現(xiàn),本架構(gòu)通過關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(SQL Server)來完成.域模型層(M)是業(yè)務(wù)領(lǐng)域相關(guān)對(duì)象的OO表現(xiàn),擔(dān)負(fù)著各層次及模塊間傳遞數(shù)據(jù)的職責(zé),它貫穿于Web應(yīng)用系統(tǒng)的全過程,此架構(gòu)通過簡單的POJO來實(shí)現(xiàn).
由此可見,PCBADM架構(gòu)將一個(gè)完整的Web應(yīng)用系統(tǒng)恰當(dāng)?shù)貏澐譃榱鶄€(gè)層次,而且每一層完成各自特定的任務(wù),其各層主要功能及相應(yīng)的實(shí)現(xiàn)技術(shù)可概括如表1所示,并且各層各司其職但又一起協(xié)作地實(shí)現(xiàn)整個(gè)Web應(yīng)用系統(tǒng)的功能.
表1 PCBADM架構(gòu)各層的主要功能及技術(shù)
紅色遺址是革命先輩留給我們的重要紅色資源,應(yīng)該使用先進(jìn)的信息技術(shù)加以保護(hù),進(jìn)而提高紅色遺址數(shù)字化保護(hù)水平[12].基于此,本文把所提出的PCBADM架構(gòu)應(yīng)用于紅色遺址保護(hù)系統(tǒng),以該典型案例來證明其可行性和有效性.根據(jù)上圖1,首先把該保護(hù)系統(tǒng)劃分為表現(xiàn)層、控制層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層、數(shù)據(jù)層和域模型層,然后依據(jù)PCBADM架構(gòu)所需的技術(shù),以MyEclipse 2018為開發(fā)平臺(tái),Tomcat 8.5為后臺(tái)服務(wù)器,并基于Java語言,使用Spring IoC/DI、Spring MVC、Spring JDBC、JSP以及Html5等技術(shù),按照?qǐng)D1的層次關(guān)系依次實(shí)現(xiàn)紅色遺址保護(hù)系統(tǒng)各層功能.
該保護(hù)系統(tǒng)表現(xiàn)層的展示功能主要通過Html5、JSP等技術(shù)來完成,并恰當(dāng)融合Web3D等技術(shù)實(shí)現(xiàn)紅色遺址360度全景漫游來增強(qiáng)用戶體驗(yàn).本系統(tǒng)主要的表現(xiàn)層頁面有index.html、hongYiXiangQing.html、chaKanWeb3DHongYi.html、chaKanWeb3DHongYi_jianmenguanyizhi.html、zhuCe.jsp、dengLu.jsp、yongHu.jsp、guanLiYuan.jsp、 hongSeXinWen.jsp和pingLun.jsp等.
該保護(hù)系統(tǒng)的控制層負(fù)責(zé)對(duì)用戶Http請(qǐng)求的轉(zhuǎn)發(fā)控制,主要通過Spring MVC來實(shí)現(xiàn).而且Spring MVC能很好地支持多種表現(xiàn)層技術(shù),能將表現(xiàn)層和控制層進(jìn)行恰當(dāng)集成,有效實(shí)現(xiàn)兩層之間的數(shù)據(jù)通信.本系統(tǒng)主要的控制文件有HongYiController.java、YongHuController.java、GuanLiYuanController.java、HongSeXinWenController.java、PingLunController.java、TuPianController.java及Web3DHongYiController.java等,其中HongYiController.java的核心偽代碼形式如下,其它控制文件形式類同,并完成相應(yīng)的Spring-servlet.xml配置[13].
……@Controller@RequestMapping("/hongyi")
public class HongYiController {
@RequestMapping("/center") public String center(){return "hongyi";}
@InitBinder public void initBinder(WebDataBinder binder){binder.registerCustomEditor(……);} }……
該保護(hù)系統(tǒng)的業(yè)務(wù)邏輯層實(shí)現(xiàn)系統(tǒng)具體的業(yè)務(wù)功能,主要采用Spring IoC/DI技術(shù)來實(shí)現(xiàn),其目標(biāo)是簡化業(yè)務(wù)Bean的編寫和對(duì)這些Bean的管理.本系統(tǒng)的業(yè)務(wù)Bean主要有HongYiService.java、YongHuService.java、GuanLiYuanService.java、HongSeXinWenService.java、PingLunService.java和TuPianService.java等,其中HongYiService.java的主要偽代碼如下,其它業(yè)務(wù)Bean編寫類同.
public class HongYiService implements HongYiServiceInterface{……
public void saveHongYi(HongYi hongYi) {
hongYiDAO.savehongYi(hongYi); }
public List
此外,業(yè)務(wù)邏輯層還一個(gè)關(guān)鍵任務(wù)是配置ApplicationContext應(yīng)用上下文——Spring.xml,該配置文件是整個(gè)系統(tǒng)的基礎(chǔ),通過它能恰當(dāng)?shù)貙⑸舷赂鲗尤诤显谝黄穑渑渲媚0褰Y(jié)構(gòu)如下[14]:
xsi:schemaLocation="http://www.springframework.org/schema/beans……> -ref="ds" />……
該保護(hù)系統(tǒng)的數(shù)據(jù)訪問層承擔(dān)對(duì)數(shù)據(jù)庫中數(shù)據(jù)的訪問操作,主要使用Spring JDBC來完成.本系統(tǒng)的核心DAO類有HongYiDAO.java、YongHuDAO.java、GuanLiYuanDAO.java、HongSeXinWenDAO.java、PingLunDAO.java、TuPianDAO.java等,其中HongYiDAO.java里獲取所有紅色遺址信息的關(guān)鍵偽代碼格式如下,同樣需完成相應(yīng)的Spring-jdbc.xml配置[15].
public class HongYiDAO implements HongYiDAOInterface{……
public List
return (List
該保護(hù)系統(tǒng)的數(shù)據(jù)層負(fù)責(zé)對(duì)系統(tǒng)中持久化的數(shù)據(jù)進(jìn)行管理,并通過傳統(tǒng)的關(guān)系數(shù)據(jù)庫SQL Server 2012來實(shí)現(xiàn).根據(jù)需求分析,得到本系統(tǒng)的數(shù)據(jù)庫hongYiDB主要包含的數(shù)據(jù)表有hongYiTable、yongHuTable、guanLiYuanTable、hongSeXinWenTable、pingLunTable和tuPianTable等.其中,yongHuTable的字段為(id,yNumber,yPassword,yPhoto,ySex,yBirth,yAddress,yMail,yStatus,zcTime……),其它表的字段根據(jù)需求來類似設(shè)計(jì)并使用SQL Server 2012來實(shí)現(xiàn).
該保護(hù)系統(tǒng)的域模型層使用POJO類來對(duì)各層交互的臨時(shí)數(shù)據(jù)進(jìn)行封裝和傳遞,其主要POJO有HongYi.java、YongHu.java、GuanLiYuan.java、HongSeXinWen.java、PingLun.java和TuPian.java等,其中GuanLiYuan.java核心代碼格式如下,其它POJO類似.
public class GuanLiYuan {
private Integer id; private String gName; private String gPassword;……
public void setId(Integer id) {this.id = id;}
public Integer getId() {return id;}
其它屬性的setter/getter方法……}
本文使用所提出的PCBADM架構(gòu)來設(shè)計(jì)和實(shí)現(xiàn)紅色遺址保護(hù)系統(tǒng),并與經(jīng)典J2EE三層架構(gòu)在相同環(huán)境下開發(fā)本案例進(jìn)行對(duì)比實(shí)驗(yàn).
硬件環(huán)境為Intel Core i5-8300H @ 2.30GHz,8GB RAM,1TB HDD,128GB SSD,100 Mb/s Ethernet等,軟件環(huán)境為Microsoft Windows 10,SQL Server 2012,JKD 1.8,MyEclipse 2018,Tomcat 8.5,Spring 4.3,Spring MVC 4.3,Spring JDBC 4.3,Struts 2.5,Hibernate 5.2,Dreamweaver CS6等.
開發(fā)時(shí)間:軟件生成周期中開發(fā)軟件階段所用的時(shí)間.
代碼行數(shù):源程序代碼行的總數(shù)量.
配置文件:一種為計(jì)算機(jī)程序配置參數(shù)和設(shè)置初始值的計(jì)算機(jī)文件.
軟件大?。很浖谟?jì)算機(jī)磁盤里面所占有的空間.
整合出錯(cuò)率:軟件開發(fā)后期各模塊整合時(shí)出錯(cuò)的幾率,出錯(cuò)率=出錯(cuò)值/正確值*100%.
相同的軟硬件環(huán)境下,使用PCBADM架構(gòu)和經(jīng)典J2EE三層架構(gòu)來開發(fā)紅色遺址保護(hù)系統(tǒng),在開發(fā)時(shí)間、代碼行數(shù)和配置文件等標(biāo)準(zhǔn)所得到的實(shí)驗(yàn)數(shù)據(jù)如表2所示.
表2 兩種架構(gòu)應(yīng)用比較
由上表2可得,與經(jīng)典J2EE三層架構(gòu)相比,使用PCBADM架構(gòu)來開發(fā)紅色遺址保護(hù)系統(tǒng)所使用的開發(fā)周期縮短了約35.4%,整合時(shí)的出錯(cuò)率減少了約15.8%.并且,我們將該多層架構(gòu)應(yīng)用于其它Web應(yīng)用系統(tǒng)(如紅色文物展示系統(tǒng)、紅色景點(diǎn)旅游系統(tǒng)等)也得到類似的結(jié)果.
通過在多個(gè)Web應(yīng)用系統(tǒng)上進(jìn)行實(shí)踐,結(jié)果證明使用PCBADM架構(gòu)來開發(fā)Web應(yīng)用系統(tǒng)具有如下優(yōu)點(diǎn):
(1)設(shè)計(jì)更加清晰:該多層架構(gòu)基于目前主流的三層架構(gòu)和MVC模式來設(shè)計(jì),它將一個(gè)完整的Web應(yīng)用系統(tǒng)按其功能合理地劃分為六個(gè)層次,避免了傳統(tǒng)三層架構(gòu)分層不夠明晰的缺陷.
(2)開發(fā)時(shí)間更短:該多層架構(gòu)清晰的分層設(shè)計(jì)使項(xiàng)目分工更為明確,六層中每一層由不同類型的技術(shù)人員負(fù)責(zé),六個(gè)層次所對(duì)應(yīng)的模塊可以并行開發(fā),且互不影響,這有效縮短了系統(tǒng)的開發(fā)時(shí)間.
(3)整合更加容易:由于該多層架構(gòu)的核心層主要使用Spring相關(guān)技術(shù)來實(shí)現(xiàn),不論是代碼編寫還是XML配置所涉及的技術(shù)都比較單一,很少出現(xiàn)整合不兼容的情況,這有效降低了系統(tǒng)整合的出錯(cuò)率.
(4)軟件體積變得更?。簭膶?shí)際的案例開發(fā)可看出,該多層架構(gòu)提高了代碼的復(fù)用率,并且通過充分使用Spring的新服務(wù)(如Annotation等)以及IoC容器的強(qiáng)大管理功能,可以在很大程度上縮減程序的代碼量及配置量,這使得所開發(fā)出來的Web應(yīng)用系統(tǒng)體積變得更小.
(5)更易于擴(kuò)展和維護(hù):由于各層之間是弱耦合,使得模塊與模塊之間聯(lián)系比較弱,當(dāng)對(duì)某一模塊做修改時(shí)并不會(huì)影響到其它模塊,這有利于系統(tǒng)后期的擴(kuò)展和維護(hù),但會(huì)導(dǎo)致系統(tǒng)總體性能有所下降.
目前,設(shè)計(jì)合理恰當(dāng)?shù)亩鄬蛹軜?gòu)已成為開發(fā)Web應(yīng)用系統(tǒng)中一個(gè)重要的過程,架構(gòu)設(shè)計(jì)的優(yōu)劣將直接影響著系統(tǒng)后期的開發(fā)與維護(hù).本文不僅提出了一種新的輕量級(jí)PCBADM架構(gòu),而且將其應(yīng)用于紅色遺址保護(hù)系統(tǒng)典型案例中.通過在多個(gè)類似案例上進(jìn)行反復(fù)實(shí)踐,結(jié)果都證明該多層架構(gòu)能有效提高代碼復(fù)用性和應(yīng)用系統(tǒng)的可維護(hù)性,并能恰當(dāng)減少數(shù)據(jù)描述和應(yīng)用操作之間的耦合度.
而且,基于該多層架構(gòu)來開發(fā)Web應(yīng)用系統(tǒng),這在一定程度上是軟件開發(fā)思想的一個(gè)進(jìn)步,它進(jìn)一步解決了軟件開發(fā)中模塊間的耦合性、模塊整合時(shí)的兼容性等問題,為開發(fā)配置量少、代碼清晰和可擴(kuò)展性良好的系統(tǒng)提供了基本思想.然而,分層過多在一定程度上會(huì)降低系統(tǒng)性能,所以在分層架構(gòu)設(shè)計(jì)中應(yīng)該恰當(dāng)?shù)匕盐找粋€(gè)度,這是我們后續(xù)需要深入研究的內(nèi)容.