張烈超 胡迎九
(武漢交通職業(yè)學(xué)院, 湖北 武漢 430065)
當(dāng)前,信息技術(shù)是推動(dòng)經(jīng)濟(jì)活動(dòng)的重要引擎,作為信息技術(shù)的核心,軟件應(yīng)用程序開(kāi)發(fā)的重要性不言而喻。Java Web是軟件開(kāi)發(fā)的主要模式之一,Java Web采用流行的J2EE架構(gòu),即采用基于MVC(Model,View,Controller)的分層設(shè)計(jì)思想,對(duì)數(shù)據(jù)持久層(Model層,即對(duì)數(shù)據(jù)庫(kù)的存取)、業(yè)務(wù)邏輯控制層(Controller層,即業(yè)務(wù)邏輯請(qǐng)求)及視圖層(View層,即用戶顯示)實(shí)行分開(kāi)處理模式[1]。隨著開(kāi)發(fā)技術(shù)發(fā)展及軟件應(yīng)用業(yè)務(wù)需求復(fù)雜性的提升,Java Web后臺(tái)框架技術(shù)也隨之快速發(fā)展,流行的Java Web框架較多,繁雜的框架及多種與框架相關(guān)的新理念令開(kāi)發(fā)學(xué)習(xí)者無(wú)所適從。此外,中大型的項(xiàng)目開(kāi)始采用分布式技術(shù)、微服務(wù)技術(shù)等,對(duì)開(kāi)發(fā)者的要求更高,越是如此,越要學(xué)習(xí)底層的基本原理[2]。鑒于此,作者選擇Java Web框架中幾種典型的Java Web框架開(kāi)發(fā)模型加以介紹,有以下幾種:(1)EJB;(2)JSP/Servlet; (3)SSH(Struts+Spring+Hibernate); (4)SSM(Spring+SpringMVC+Mybatis);(5)SpringBoot。EJB因其復(fù)雜性被其他模型替代;SpringBoot及后續(xù)的框架目前是較多軟件開(kāi)發(fā)人員學(xué)習(xí)者首選的框架開(kāi)發(fā)模式,為軟件開(kāi)發(fā)帶來(lái)便捷性的同時(shí)并大大縮短了軟件開(kāi)發(fā)周期,但它是由SSM框架發(fā)展而來(lái),故開(kāi)發(fā)者需要重點(diǎn)掌握SSM框架模型運(yùn)行機(jī)制。鑒于以上原因,本文重點(diǎn)討論JSP/Servlet、SSH、SSM三種框架模型,通過(guò)此三種模型基于MVC分層設(shè)計(jì)思路及實(shí)現(xiàn)過(guò)程的對(duì)比,給出各種模型的優(yōu)缺點(diǎn)及其適應(yīng)性,并分析各模型在分層實(shí)現(xiàn)過(guò)程中需要注意的要點(diǎn)及關(guān)鍵步驟,為開(kāi)發(fā)人員學(xué)習(xí)提供借鑒思路。
JSP/Servlet是Java Web早期的開(kāi)發(fā)模型,就個(gè)人觀點(diǎn),同SSH、SSM框架比較,JSP/Servlet算不上真正的框架模型,因?yàn)槭褂迷撃P退婕暗腗VC分層業(yè)務(wù)及邏輯編碼工作均由用戶完成,而使用SSH、SSM框架,相應(yīng)環(huán)節(jié)中開(kāi)發(fā)人員只需清晰系統(tǒng)參數(shù)配置流程并按模型要求正確配置模型所需的參數(shù),系統(tǒng)便可自動(dòng)幫助開(kāi)發(fā)人員完成數(shù)據(jù)持久層(Model層,對(duì)數(shù)據(jù)庫(kù)的操作)的封裝,并按需求完成與業(yè)務(wù)邏輯控制層(Controller層)的無(wú)縫對(duì)接,即將數(shù)據(jù)層注入至業(yè)務(wù)邏輯控制層,讓模型自動(dòng)完成復(fù)雜數(shù)據(jù)存取及業(yè)務(wù)管理工作,無(wú)需編寫(xiě)大量代碼。后階段開(kāi)發(fā)者則可將重心放至業(yè)務(wù)邏輯控制層(Controller層)與視圖層(View層)相關(guān)工作,即完成數(shù)據(jù)提取及頁(yè)面展示的工作,從而大大縮短開(kāi)發(fā)流程及時(shí)間。需要強(qiáng)調(diào)是,SSH、SSM模型功能較JSP/Servlet模型要強(qiáng)大,但透徹理解JSP/Servlet模型中的Servlet運(yùn)行機(jī)制并靈活運(yùn)用是學(xué)習(xí)SSH、SSM模型的基礎(chǔ);此外,選擇SSH、SSM這兩種組合方式的模型使項(xiàng)目的開(kāi)發(fā)具有高度的可維護(hù)性和可擴(kuò)展性,同時(shí)可極大提高開(kāi)發(fā)效率,降低開(kāi)發(fā)和維護(hù)成本;SSH、SSM模型均以Spring框架為核心,兩者的主要不同之處在于MVC的實(shí)現(xiàn)方式(Struts與SpringMVC)及ORM持久化方面(Hibernate與Mybatis):SSH注重配置開(kāi)發(fā),其中的Hibernate對(duì)JDBC的完整封裝更加面向?qū)ο蠡?,?duì)增、刪、改、查的數(shù)據(jù)維護(hù)更自動(dòng)化,但SQL優(yōu)化方面較弱,對(duì)學(xué)習(xí)者要求高;SSM更注重注解式開(kāi)發(fā),且ORM實(shí)現(xiàn)更加靈活,SQL優(yōu)化更簡(jiǎn)便,入門(mén)容易。故當(dāng)前傳統(tǒng)企業(yè)項(xiàng)目的開(kāi)發(fā),使用SSH框架比較多,而對(duì)性能要求較高的互聯(lián)網(wǎng)項(xiàng)目,通常會(huì)選用SSM框架[3]。
下表1給出了三種模型特點(diǎn)的對(duì)照表,通過(guò)表格對(duì)比可知,開(kāi)發(fā)人員若掌握了以上三種模型并熟練運(yùn)用,對(duì)于其他模型的學(xué)習(xí)或應(yīng)用也能起到觸類旁通之效。在實(shí)際應(yīng)用中可靈活選擇合適的開(kāi)發(fā)模型。
表1 JSP/Servlet、SSH、SSM三種模型適用性對(duì)照表
基于MVC分層模型中的示圖層是與用戶交互的界面,主要為其他層(數(shù)據(jù)持久層或者業(yè)務(wù)邏輯控制層)傳遞數(shù)據(jù)(根據(jù)業(yè)務(wù)的不同,可分為傳入數(shù)據(jù)或讀取數(shù)據(jù)兩種方式),用前臺(tái)相關(guān)工具如Bootstrap、JQuery作JSP頁(yè)面展示交互處理,與模型的選擇具有無(wú)關(guān)性。另外,使用經(jīng)典框架與微應(yīng)用中跨平臺(tái)數(shù)據(jù)的轉(zhuǎn)換(如將后端數(shù)據(jù)換轉(zhuǎn)成JSON)等問(wèn)題學(xué)習(xí)者可查閱相關(guān)資料。此處重點(diǎn)討論數(shù)據(jù)持久層、業(yè)務(wù)邏輯控制層、視圖層各層的核心內(nèi)容,并分析各模型在分層實(shí)現(xiàn)過(guò)程中需要注意的要點(diǎn)及關(guān)鍵步驟。最后根據(jù)各模型思路分別實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)中表Student訪問(wèn)的功能(各模型分析時(shí)以圖或代碼予以展示)。
圖1 利用JDBC實(shí)現(xiàn)的StudentDAO類
圖2 Servlet類的創(chuàng)建
JSP/Servlet是早期Java Web開(kāi)發(fā)框架模型。該模型因簡(jiǎn)單實(shí)用并按MVC三層開(kāi)發(fā)思想實(shí)現(xiàn)了相應(yīng)層的業(yè)務(wù),適合初學(xué)者。因此,替代繁瑣而笨重的EJB并迅速成為開(kāi)發(fā)模型利器。該模型中,數(shù)據(jù)持久層利用JDBC實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表操作,由于頻繁訪問(wèn)數(shù)據(jù)庫(kù),實(shí)際開(kāi)發(fā)中通常將這些操作封裝到類中(不同的表,創(chuàng)建獨(dú)立的DAO類,如圖1),每一個(gè)操作對(duì)應(yīng)一個(gè)獨(dú)立方法,當(dāng)需要使用該操作時(shí),調(diào)用相應(yīng)的方法來(lái)完成;業(yè)務(wù)邏輯控制層主要由Servlet來(lái)完成,在Servlet中完成參數(shù)的接收,然后使用參數(shù)調(diào)用業(yè)務(wù)邏輯層,根據(jù)調(diào)用結(jié)果的不同跳轉(zhuǎn)到不同的頁(yè)面,需注意的是,由于安全運(yùn)行機(jī)制需要,每創(chuàng)建一個(gè)Servlet業(yè)務(wù)請(qǐng)求類,必須在web.xml中注冊(cè),而生成的Servlet類文件,雖然是由java代碼編寫(xiě),但必須發(fā)布至后臺(tái)tomcat下通過(guò)瀏覽器訪問(wèn)才能正常運(yùn)行(圖2—圖3),由于Servlet處理邏輯層業(yè)務(wù)優(yōu)秀特色,部分功能被SSH、SSM框架借鑒;JSP程序主要是做顯示層,從頁(yè)面發(fā)送請(qǐng)求至業(yè)務(wù)邏輯控制層,邏輯層作出響應(yīng),并將處理后的結(jié)果(數(shù)據(jù))回送至JSP頁(yè)面進(jìn)行展示(圖4)。
圖3 Servlet類的注冊(cè)
圖4 由業(yè)務(wù)層提取結(jié)果至視圖層JSP頁(yè)面展示
雖然 JSP/Servlet模型具有簡(jiǎn)單易學(xué)特點(diǎn),由于需要開(kāi)發(fā)者手動(dòng)編寫(xiě)所有代碼以實(shí)現(xiàn)相應(yīng)的功能,對(duì)于功能復(fù)雜的系統(tǒng)采用該模型則需更長(zhǎng)的開(kāi)發(fā)周期。故被更為優(yōu)秀模型如SSH所取代。
圖5 數(shù)據(jù)庫(kù)配置
圖6 操作對(duì)象
圖7 設(shè)置生成DAO及相關(guān)類
圖8 逆向工程生成相關(guān)類
圖9 逆向工程DAO類
圖10 Hibernate與Spring對(duì)接
SSH框架也是流行的Java Web開(kāi)發(fā)框架模型,是JSP/Servlet升級(jí)模型。該模型側(cè)重于配置開(kāi)發(fā),以Spring框架作為核心,Spring充當(dāng)粘合劑的角色,在持久數(shù)據(jù)層與業(yè)務(wù)層之間通過(guò)配置界面方式(以Myeclipse作為開(kāi)發(fā)工具)完成相關(guān)參數(shù)的設(shè)置步驟(圖5—圖6),通過(guò)Hibernate框架逆向工程方式自動(dòng)生成以數(shù)據(jù)表為操作對(duì)象DAO及相關(guān)類(圖7—圖9),免除了大量代碼的編寫(xiě),生成的持久層相關(guān)數(shù)據(jù)通過(guò)注入Spring與進(jìn)行整合,從而實(shí)現(xiàn)Spring與模型層的對(duì)接(圖10)。需要注意的是,Hibernate框架逆向工程生成的DAO類不能實(shí)現(xiàn)事務(wù)管理,對(duì)接后由Spring框架實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的事務(wù)管理機(jī)制,事務(wù)管理分編程式和聲明式兩種,如果在 DAO程序中有嚴(yán)格的方法命名規(guī)則,在Spring框架配置文件中需予以聲明,否則只需遵循開(kāi)發(fā)規(guī)則命名即可;在業(yè)務(wù)層與視圖層之間,Spring和Struts整合主要的目的就是讓Spring管理Struts中的Action(與Servlet功能類似),并將業(yè)務(wù)邏輯注入到Action中,可參考相關(guān)資料按照Struts框架的整合步驟即可完成參數(shù)配置,但需重點(diǎn)關(guān)注業(yè)務(wù)邏輯層注入到Aciton中配置步驟,可采用通用Setter方法注入的方式完成(圖11—圖13)。通過(guò)對(duì)應(yīng)層間的整合,最終SSH實(shí)現(xiàn)基于MVC相關(guān)層的完美整合。
圖11 Struts與Spring對(duì)接配置
圖12 DAO以Setter的方式注入Spring
圖13 Action實(shí)現(xiàn)代碼
SSH框架是Java Web應(yīng)用開(kāi)發(fā)中被選用較多的框架,曾一度成為事實(shí)上應(yīng)用開(kāi)發(fā)的首選,直至由于未更新Struts的安全漏洞而被SSM所替代。
圖14 Mybatis框架執(zhí)行流程圖
如前面所述,SSM框架是當(dāng)前最流行的Java Web框架模型,它充分吸收了SSH的優(yōu)勢(shì),比如繼續(xù)保留了Spring框架作為核心。該模型中Spring層實(shí)現(xiàn)業(yè)務(wù)對(duì)象的管理,示圖層使用Spring MVC負(fù)責(zé)請(qǐng)求轉(zhuǎn)發(fā)和視圖管理,模型層則以Mybatis實(shí)現(xiàn)數(shù)據(jù)對(duì)象的持久化引擎管理。用SpringMVC替代有安全漏洞的Struts;以Mybatis替代Hibernate;與JSP/Servlet模型、SSH模型操作數(shù)據(jù)庫(kù)必須花費(fèi)精力編寫(xiě)JDBC繁雜操作數(shù)據(jù)的過(guò)程代碼不同,Mybatis則通過(guò)xml或注解的方式將JDBC操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行封裝,開(kāi)發(fā)者只需重點(diǎn)關(guān)注SQL本身,最后由Mybatis框架執(zhí)行sql并將結(jié)果映射成Java對(duì)象并返回(如圖14)。此外,對(duì)數(shù)據(jù)庫(kù)中所有需要操作的每一張表都變成以表名+Mapper.xml的文件,xml文件中以表的命名空間包括對(duì)該表操作的sql語(yǔ)句,建議開(kāi)發(fā)者采用Mybatis逆向工程方式生成表名+Mapper.xml(如圖15),表名+Mapper.xml相當(dāng)于JSP/Servlet模型、SSH模型中的DAO類文件(數(shù)據(jù)表操作對(duì)象,包含該表的增刪改查的操作),采用xml標(biāo)簽與sql結(jié)合方式,解除了sql和程序代碼的耦合,適合中大型項(xiàng)目開(kāi)發(fā),不需編寫(xiě)過(guò)多的Java代碼,省卻了編譯過(guò)程,便于統(tǒng)一管理和優(yōu)化。實(shí)現(xiàn)數(shù)據(jù)對(duì)象持久化的Mybatis以注入方式完成與Spring框架的整合參數(shù)配置及實(shí)現(xiàn)(圖16—圖18),由Spring框架實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的注解事務(wù)管理機(jī)制,開(kāi)啟對(duì)Mapper代理開(kāi)發(fā)及自動(dòng)掃包模式。從而實(shí)現(xiàn)Spring框架與Mybatis的優(yōu)化整合,開(kāi)發(fā)人員后期通過(guò)進(jìn)一步完善,為SpringMVC層提供數(shù)據(jù)服務(wù)。
圖16 Spring框架配置文件1
圖18 Spring與Mybatis整合注解測(cè)試
對(duì)以上三種基于MVC分層設(shè)計(jì)思路模型的實(shí)現(xiàn)過(guò)程的要點(diǎn)及關(guān)鍵步驟加以分析可知,SSH、SSM這兩種組合方式的模型在項(xiàng)目的開(kāi)發(fā)中都實(shí)現(xiàn)了MVC設(shè)計(jì)模式的低耦合、易維護(hù)和可擴(kuò)展的分層思想,可極大提高開(kāi)發(fā)效率,降低開(kāi)發(fā)和維護(hù)成本,需透徹理解模型才能事半功倍;JSP/Servlet模型則簡(jiǎn)單易學(xué),適合初學(xué)者。掌握了以上三種基本模型,開(kāi)發(fā)人員在學(xué)習(xí)或者應(yīng)用中可根據(jù)實(shí)際需要靈活選擇合適的開(kāi)發(fā)模型。
本文分析了三種基于MVC分層設(shè)計(jì)思路的Java Web框架開(kāi)發(fā)經(jīng)典模型優(yōu)缺點(diǎn)及適應(yīng)性,并給出各模型實(shí)現(xiàn)過(guò)程的要點(diǎn)及關(guān)鍵步驟。通過(guò)分析可知,JSP/Servlet模型簡(jiǎn)單容易學(xué)習(xí),但采用該模型后開(kāi)發(fā)者后續(xù)工作量較大;SSH、SSM這兩種模型需要開(kāi)發(fā)者有較好的基礎(chǔ)知識(shí),正確配置相關(guān)參數(shù),可為開(kāi)發(fā)帶來(lái)較多的便捷性,并在項(xiàng)目的開(kāi)發(fā)中實(shí)現(xiàn)了MVC設(shè)計(jì)模式的低耦合、易維護(hù)和可擴(kuò)展的分層思想,可極大提高開(kāi)發(fā)效率,降低開(kāi)發(fā)和維護(hù)成本??傊?,掌握了以上三種經(jīng)典開(kāi)發(fā)模型并熟練運(yùn)用,對(duì)于其他模型的學(xué)習(xí)或應(yīng)用也能起到觸類旁通之效。
武漢交通職業(yè)學(xué)院學(xué)報(bào)2021年4期