我們知道:B/S 開發(fā)模式越來越受推崇,公司的項目都是基于B/S模式開發(fā)的。
其優(yōu)勢不言而喻。
傳統(tǒng)的B/S系統(tǒng)有幾大缺點
1. 表現(xiàn)層的代碼不易復(fù)用
2. 網(wǎng)絡(luò)上跑著大量重復(fù)的數(shù)據(jù)
3. 服務(wù)器幾乎要處理所有業(yè)務(wù)邏輯和動態(tài)交互,經(jīng)常執(zhí)行重復(fù)的操作,負(fù)載過重。
4. 從人機(jī)對話的界面上,難以要求客戶的操作規(guī)范化。
5. 服務(wù)器只能被動接受請求,而不能通過“推”的方式把數(shù)據(jù)主動發(fā)送給客戶端。
...
為解決這些問題,必須有一種全新的開發(fā)模式來開改造 B/S。
針對上面幾個問題,制定了以下幾個步驟來解決:
1.客戶端的腳本及html 以“類”或“可復(fù)用的組件”的方式存在。
說明: 面向過程的 JavaScript -> “基于對象”的 JavaScript
原子型的 dhtml -> 組件模式的 htc, wsc
2.在客戶端建立一塊公共的存儲空間(內(nèi)存中),即:存在一個全局對象(類似delpehi、c++ builder中的 Application),所有應(yīng)用頁面都共享該對象,并能通過這個對象交換數(shù)據(jù)或復(fù)雜對象。
注意: 構(gòu)建 appliation 對象實現(xiàn)上面的功能,該對象的生存期和整個應(yīng)用保持一致。(注意:這 appliation 是指客戶端的,并不是 asp/jsp 中在服務(wù)器端的application對象)
3.實現(xiàn) 客戶端和服務(wù)端 的數(shù)據(jù)同步機(jī)制,減少客戶端的數(shù)據(jù)丟失率,避免對服務(wù)器作重復(fù)請求。
說明: 所有類在客戶端實現(xiàn)cache,重啟IE或重啟系統(tǒng)皆不必重新從服務(wù)器加載類資源。
采用 RMI/RPC 方式,實現(xiàn)客戶端 的 js 對象 能遠(yuǎn)程調(diào)用 服務(wù)器端的一個對象(或應(yīng)用)的方法,并能保存其狀態(tài)和數(shù)據(jù)。對開發(fā)者來講,這種調(diào)用機(jī)制是透明的。
代碼和數(shù)據(jù)分離,所有涉及UI的頁面均用靜態(tài)頁面形式存在(減輕server負(fù)載,且這些靜態(tài)資源會被IE自動cache,下次不會被重復(fù)下載),所有動態(tài)交互部分的數(shù)據(jù),除了以RMI的方式返回給客戶端以外,皆以 XML 形式返回,并在客戶端建立cache機(jī)制。
4.用 “模式/同步” 的操作方式,代替?zhèn)鹘y(tǒng)中 “非模式/異步” 的操作方式,從而約束用戶的操作步驟,使其規(guī)范化。
說明: 瀏覽器很多操作默認(rèn)都是 異步/非模式 方式的(比如:form的提交,window.open,等等)這樣可以實現(xiàn)多線程請求數(shù)據(jù),會比較快,但有時侯在處理單個流程,卻會帶來不少麻煩。
比如:某個操作要等數(shù)據(jù)提交成功后執(zhí)行,我們希望能有一個阻塞,待執(zhí)行完提交后,接下來執(zhí)行后面的操作,然而異步方式只能用回調(diào)的方式實現(xiàn),中途的各種情況處理的邏輯判斷太多,著實麻煩。
解決辦法:對數(shù)據(jù)請求或發(fā)送:用 xmlhttp xmldom 的同步方式調(diào)用。
對窗體模塊的調(diào)用:用 showModalDialog 方式調(diào)用。
5.啟動“掃描線程”偵聽服務(wù)器的“推”動作,或者利用 ClientSocket 組件和服務(wù)器進(jìn)行有連接的通訊。
示例:
<html>
<script src="/common/jslib/jsvm.js"></script>
<script>
_import("js.lang.System"); // 可以在一開始就加載一些類或包
_import("js.graphics.*");
function init(){
try{
...
_import("cn.x86.common.user.Login"); // 也可以在過程中動態(tài)決定是否要加載一個類或包
var login = new cn.x86.common.user.Login();
login.loadInfo(); //遠(yuǎn)程調(diào)用,直接從服務(wù)器端得到登錄者信息
...
var cav = new Canvas(); // 畫布類,實現(xiàn) UI 作圖 這里也可以用完整的類名來實現(xiàn): var cav = new js.graphics.Canvas();
cav.pen.color = "blue";
cav.outText(100,100,"Out Text");
cav.pen.color = 'red';
cav.lineTo(500,300);
...
}
catch(ex){
System.out.printError(ex);
}
}
</script>
<body>
-- 跟JAVA中的代碼差不多! --
</body>
</html>
上面設(shè)計涉及到的優(yōu)缺點
缺陷:
1.對developer的客戶端的技術(shù)功底要求較高。 (可預(yù)見)
2.客戶端的負(fù)載較傳統(tǒng)的模式要高。 (可預(yù)見)
3.對客戶端的瀏覽器版本及運(yùn)行環(huán)境要求比較規(guī)范。 (已確認(rèn))
4.對復(fù)雜對象的序列化工作將會增多。 (可預(yù)見)
優(yōu)勢:
1.服務(wù)器負(fù)載,和網(wǎng)絡(luò)流量能大幅度減少。 (已確認(rèn))
2.模塊的粒子度,靈活性,復(fù)用性將大大增強(qiáng)。 (可預(yù)見)
3.模塊(類)之間的依賴性清晰,且易維護(hù)。 (可預(yù)見)
4.整個系統(tǒng)運(yùn)行性能將提高。 (適客戶端的環(huán)境而定)
5.系統(tǒng)開發(fā)周期能減少 (視項目具體情況而定)
注:此文摘自http://bbs.51js.com/thread-21119-1-3.html