葉 鈺,李太寧
(1. 泰州職業(yè)技術學院 信息工程學院;
2. 新生網(wǎng)絡科技有限公司,江蘇 泰州 225300)
傳統(tǒng)意義上,WEB開發(fā)中服務器端與客戶端是密不可分的。無論是基本的ASP、JSP、PHP技術,還是稍上層一點的Struts、Spring、JSF、Seam等技術,都將生成WEB頁面的代碼編寫包含在服務器端開發(fā)過程中。從解耦與分層方面分析,需要服務器端代碼完全不考慮頁面顯示,但在實際開發(fā)過程中,由于移動WEB應用的火爆,移動終端的普及,目前終端種類的數(shù)量已經(jīng)無法讓項目在設計階段就考慮周全,所以在編寫服務器端代碼的時候完全隔離WEB界面有關代碼將成為所有WEB開發(fā)人員必備的素質之一[1]。
下文將從技術選型與最佳實踐上探討解決服務器端WEB開發(fā)的一些重點、難點和需要使用到的技術。
本文選擇Java這一最普遍的WEB開發(fā)語言,對比種種新興的腳本語言,Java的功能并不強大,也因為種種限制(例如缺少閉包、不完全面向對象、語法不夠靈活等),使代碼量相對較大。但也正是因為這種限制,讓Java成為了團隊開發(fā)與大型項目的首選語言,長期占據(jù)著開發(fā)語言的前三名。Java語言即使沒有注釋,團隊成員也能分辨基本的功能實現(xiàn)。同時,使用Java語言開發(fā)的人員較多,其學習成本與二次開發(fā)成本相對為所有語言中最低的。這樣可提高項目的可持續(xù)性,大大降低項目的成本。其他開發(fā)語言,如Ruby等新興語言由于太過靈活,同樣的功能,每個開發(fā)人員寫出來的代碼都會有根本的變化,這雖然讓個人的開發(fā)效率得到了提高,但卻大大降低了團隊的開發(fā)效率。所以Java語言可作為WEB服務器端開發(fā)的最佳實踐語言。
在軟件開發(fā)過程中,調優(yōu)、調試、測試的時間占據(jù)了開發(fā)流程的大部分時間,在這過程中,如果沒有對代碼進行版本控制,那么一旦出現(xiàn)錯誤,則很難對錯誤進行追溯。同時需求的變更、團隊開發(fā)、版本測試等許多情況都讓版本控制成為開發(fā)過程中必不可少的工具之一。版本控制軟件的選擇很多,其中GIT版本控制系統(tǒng)[2],其穩(wěn)定性與適用性經(jīng)歷了大量的考驗,排名第一的市場占有率使其成為了當之無愧首選版本控制工具。
Git的主要優(yōu)勢在于其分布式的管理方式。由于采用了去中心化的版本管理思想,Git不用安裝服務器端,不同的客戶端都可以作為完整的服務器端進行部署,各客戶端之間的傳輸方式?jīng)]有任何限制。同時Git的快速分支功能使得快速迭代開發(fā)的成本可以忽略不計,任何一個標點的修改都可以作為新的分支或版本保存,并隨時回溯,大大增加了開發(fā)效率。
部署與測試的效率是Java等編譯型語言的弱項。每次修改Java代碼后,想要看到運行效果都必須經(jīng)歷重新編譯、部署、重啟web server等繁瑣的過程。即使這些過程完全自動化運行,最快也需要5~10秒的時間,這幾秒的時間常常會中斷開發(fā)思路,造成開發(fā)人員精力分散。如何實現(xiàn)快速開發(fā)部署,以至于如何實現(xiàn)瞬時熱部署(hot deploy)就成為WEB開發(fā)非常重要的一環(huán)。近兩年,隨著相關技術的成熟,已經(jīng)有四五種實現(xiàn)快速開發(fā)部署的工具,不過技術原理都無非是修改Java的編譯過程,讓Java代碼的修改直接作用到Java字節(jié)碼生成階段。例如JBoss的Application Server 7.0以后版本使用的hot deploy方式。對于這方面,不同的工具適用性都有種種的限制,需要開發(fā)人員在項目初期根據(jù)自己的需要來選擇。
本文主要探討的是服務器端的WEB開發(fā),保持用戶狀態(tài)的細節(jié)問題就全部交由客戶端去操作。大致的方向有cookie加密、Local Storage等。篇幅原因,這里不詳細闡述。
實體關系映射(ORM)是軟件開發(fā)中重要的思想與手段,充分使用ORM后,軟件的結構與開發(fā)效率都會得到巨大的提升。得益于Hibernate,Java成為了ORM發(fā)揮優(yōu)勢的最佳環(huán)境。
自1970年MVC模式被提出,如今已經(jīng)成為服務器端WEB開發(fā)的標準模型[3]。但MVC模型(如圖1所示)并不能很好的適應本文提出的思想。由于完全屏蔽了用戶界面的生成,所以與客戶端的交互需要全部使用對象來實現(xiàn)。
如圖2所示,客戶端與服務器端交互的數(shù)據(jù)需要全部組織并處理成對象,而這些對象與Java程序中的Model是對應的,從而實現(xiàn)了Controller在處理的時候只需要根據(jù)對象的屬性與狀態(tài)來進行有關的業(yè)務處理,并由ORM持久化到數(shù)據(jù)庫中。服務器端與客戶端交互的對象全部由JSON Object來實現(xiàn)。

所有接受客戶端請求的地址全部以web service的方式實現(xiàn)。每個web service請求均會產(chǎn)生兩條請求,一個請求返回具體的HTML頁面文件,另一個請求返回JSON Object。所有HTML頁面均使用靜態(tài)地址獲得,由web server來自動處理,不再需要controller參與HTML頁面的處理過程,不同的controller只需要根據(jù)請求返回JSON Object,下面以考試系統(tǒng)的項目中用來處理Question對象的controller為例。具體代碼如下:
public interface Controller{
……
public Map
……
protected void returnJSON(){}
……
}
其中objectsMap存儲所有需要返回的對象,returnJSON則將對象組織成需要的格式寫入HTTP Response中。在具體的實現(xiàn)中,需要有一個Class來實現(xiàn)這個接口,并處理通用的處理代碼,例如對objectsMap的存取,HTTP Response的生成等,同時加入一些通用的業(yè)務邏輯,例如異常的如理,數(shù)據(jù)的驗證。然后由具體的controller來集成這個Class,實現(xiàn)具體的業(yè)務邏輯。例如以下代碼:
public class QuestionAction extends Ctrl{
……
public static void save(Question question){
if(Common.isEmpty(question.id)){question.create();
}else question.save();
objectsMap.put("o",question);
returnJSON();
}
……
}
其中Ctrl為處理一些通用操作的Class。save方法為將客戶端傳來的question對象保存到數(shù)據(jù)庫中。在save方法接收到question對象以后,先做一些基本的驗證,例如判斷是新建還是保存,如果是新建的請求,則傳來的question的id是空。保存到數(shù)據(jù)庫后,將保存完成的question對象返回到客戶端。
從上面的例子可以看出,采用本文提到的各種技術后,服務器端的代碼變得異常清晰明了。無論是擁有多年經(jīng)驗的資深開發(fā)人員,還是剛接觸項目的新手都能輕松讀懂代碼,同時由于版本控制的充分使用,使得維護成本大大降低。服務器端WEB開發(fā)效率因此得到巨大提升。本文提及的最佳實踐系筆者多年開發(fā)經(jīng)驗的總結和長期觀察目前國外各大公司的WEB APP開發(fā)趨勢所得,越來越多的新興應用也已經(jīng)采用類似思想,例如Sony's PlayStation 3的YouTube應用(http://us.playstation.com/youtube/)和在開發(fā)人員中非常流行的Plunker(http://plnkr.co/)等。筆者在幾個實際項目中使用了該思想,各項目穩(wěn)定上線運行,反響良好,達到了預期效果。
[1]吳權,賴斌.淺談新網(wǎng)絡技術標準帶來的改變[J].電腦知識與技術,2010,6(15):3937-3938.
[2] 劉悅之.基于Git的分布式版本控制系統(tǒng)的設計與實現(xiàn)[J].科技傳播,2012,(22):197-198.
[3] Liu, Chamond.SmallTalk, Objects, and Design[K].iUniverse, 2000.