劉嵩 李文蕙
武漢軟件工程職業(yè)學(xué)院
使用JavaWEB進(jìn)行WEB應(yīng)用開發(fā)的方案有很多種,例如早期的純JSP模式、JSP+JavaBean模式以及經(jīng)典的MVC設(shè)計(jì)模式。
早期WEB應(yīng)用開發(fā)需求很簡單時,開發(fā)者會使用純JSP的方式來實(shí)現(xiàn)系統(tǒng)需求。一部分JSP混合Java代碼和HTML標(biāo)簽用來呈現(xiàn)數(shù)據(jù),另外一部分JSP負(fù)責(zé)業(yè)務(wù)邏輯和數(shù)據(jù)訪問。這種方式只適合于業(yè)務(wù)流程簡單的應(yīng)用,如果系統(tǒng)復(fù)雜則導(dǎo)致JSP代碼可讀性差,難以維護(hù)。
為了提高程序代碼的可讀性和可維護(hù)性,開發(fā)者開始使用JSP+JavaBean的模式進(jìn)行網(wǎng)站開發(fā)。JSP負(fù)責(zé)數(shù)據(jù)顯示,JavaBean負(fù)責(zé)業(yè)務(wù)邏輯和數(shù)據(jù)訪問。這種方式讓代碼更易讀,提高了邏輯代碼的可重用性,適合小型項(xiàng)目的快速構(gòu)建。
前面兩種開發(fā)模式下大部分WEB應(yīng)用都是將邏輯代碼和數(shù)據(jù)呈現(xiàn)代碼混在一起。為了強(qiáng)制性將邏輯代碼和數(shù)據(jù)呈現(xiàn)代碼分離,MVC模式使用模型進(jìn)行邏輯處理和數(shù)據(jù)處理,視圖負(fù)責(zé)數(shù)據(jù)顯示,控制器負(fù)責(zé)調(diào)度業(yè)務(wù)邏輯和響應(yīng)策略。
在MVC模式的指導(dǎo)思想下又逐步發(fā)展出Struts等JavaEE框架。他們雖然實(shí)現(xiàn)了數(shù)據(jù)呈現(xiàn)代碼和業(yè)務(wù)邏輯代碼的分離,但最終在數(shù)據(jù)呈現(xiàn)代碼里還是混合了HTML代碼和Java代碼或者相關(guān)的Java標(biāo)簽庫,在數(shù)據(jù)呈現(xiàn)代碼中存在前后端數(shù)據(jù)的耦合。
前后端數(shù)據(jù)耦合會給開發(fā)帶來一系列問題:
前后端數(shù)據(jù)耦合在一起帶來的直接問題吉居士對開發(fā)人員的要求會更高。首先,開發(fā)人員需要同時熟練掌握HTML、CSS、Javascript等前端技術(shù)和后段的服務(wù)器技術(shù)。如果某一方面的技能稍弱,就可能導(dǎo)致開發(fā)人員的工作無法順利完成。
前后端數(shù)據(jù)耦合會增加開發(fā)過程中的開發(fā)成本。前端代碼混合后端代碼會降低代碼的可讀性,如果后期需求發(fā)生變化,后端數(shù)據(jù)變更會對前端代碼產(chǎn)生很大的影響。在開發(fā)過程中經(jīng)常出現(xiàn)前端工作需要等待后端工作完成后才能展開,開發(fā)效率低。
前端JSP代碼第一次運(yùn)行時會轉(zhuǎn)換成Servlet后再編譯執(zhí)行,其后每次執(zhí)行都會先請求Servlet,然后再由Servlet輸出成HTML代碼。運(yùn)行效率比直接執(zhí)行HTML代碼低上很多。
以前的JavaWEB應(yīng)用常使用JSP作為視圖層展示數(shù)據(jù),因?yàn)橛脩舨l(fā)訪問量不高,所以對性能要求并不是很高。隨著互聯(lián)網(wǎng)的飛速發(fā)展,對于WEB應(yīng)用的訪問性能要求是越來越高,因此原來前后端耦合在一起的模式已經(jīng)逐漸不能滿足性能要求,因此需找一種解耦的方式,來大幅度提升負(fù)載能力。
減少前后端數(shù)據(jù)耦合的基本思路是在通過前端服務(wù)器上的HTML頁面,使用Javascript發(fā)送異步請求的方式,對后端服務(wù)器代碼進(jìn)行調(diào)用,后端服務(wù)器代碼使用JSON數(shù)據(jù)進(jìn)行交互。
將HTML、CSS、Javascript等靜態(tài)資源放在前端服務(wù)器上,Java代碼放在后端服務(wù)器上,實(shí)現(xiàn)前端內(nèi)容和后端內(nèi)容在物理服務(wù)器上的分離。當(dāng)前端服務(wù)器接收到瀏覽器請求時,前端服務(wù)器代碼通過Javascript發(fā)送一個異步請求交給后端服務(wù)器,后端服務(wù)器接收到請求后完成相應(yīng)的權(quán)限判斷,數(shù)據(jù)庫訪問、業(yè)務(wù)邏輯等等操作后,將執(zhí)行結(jié)果通過JSON的方式進(jìn)行返回。前端服務(wù)器接收J(rèn)SON數(shù)據(jù)后根據(jù)內(nèi)容填充頁面再最終返回給瀏覽器。
原來MVC思想中的Controller的角色不再由Java代碼承擔(dān),而是由前端的Javascript代碼負(fù)責(zé)對視圖View和后臺Model的調(diào)用。前后端服務(wù)器分離后,在業(yè)務(wù)場景需要的時候可以針對前端或者后端服務(wù)器通過擴(kuò)展集群的方式快速提高系統(tǒng)響應(yīng)能力。前后端數(shù)據(jù)解耦后,可以很好的解決前后端分工協(xié)調(diào)的問題,將更多的控制調(diào)度邏輯交給前端服務(wù)器代碼來處理,而后端服務(wù)器則可以側(cè)重業(yè)務(wù)邏輯本身,比如提供API接口,進(jìn)行權(quán)限控制以及進(jìn)行運(yùn)算工作。
在開發(fā)環(huán)節(jié),通過搭建Nodejs服務(wù)器,前端開發(fā)人員可以利用插件,實(shí)現(xiàn)本地開發(fā)然后將請求轉(zhuǎn)發(fā)給后端服務(wù)器。前端在開發(fā)過程中可以與后端開發(fā)分離,通過模擬的方式實(shí)現(xiàn)業(yè)務(wù)場景。后端開發(fā)人員只需要按照約定的API實(shí)現(xiàn)對應(yīng)格式的JSON數(shù)據(jù)返回就可以了,不用去關(guān)心前端實(shí)現(xiàn)效果如何。前后端之間可以同時進(jìn)行,不用相互等待,開發(fā)效率高。同時前后端分離后如果出現(xiàn)異常也可以將異常產(chǎn)生的范圍縮小,方便測試排查。
總結(jié):降低前后端數(shù)據(jù)耦合可以為項(xiàng)目開發(fā)維護(hù)帶來很多好處。首先,前端代碼不再含有后端代碼,提高了前端代碼的可讀性,降低了前后端的耦合性。其次,前后端數(shù)據(jù)耦合減少使得開發(fā)人員的工作明確,前后端開發(fā)人員不需要相互等待進(jìn)度,提高了開發(fā)效率。最終,由于數(shù)據(jù)耦合減少,提高了代碼的可維護(hù)性,減少后期代碼維護(hù)成本。開發(fā)者可以根據(jù)項(xiàng)目情況靈活選擇方案,使用合適的前后端數(shù)據(jù)耦合方式。