深入dwr2之三 Dwr2頁面請求處理機制分析之engine.js

beifengwang發表於2014-03-27

DWREnginedwr在客戶端的存根,它其中的方法基本上不需要使用者來直接呼叫;通常你會在伺服器的dwr.xml定義需要暴露的java類及其可呼叫方法,dwr會根據這個配置檔案自動生成一個dwr/interface/**.js檔案,對應你暴露的java類及其方法,你會在本地呼叫**.js檔案定義的方法,和呼叫java的方法一樣,除了多了一個回撥引數,然後這個方法會委託DWREngine._execute發出請求;

Engine.jsutil.js不同之處在於,util.js是靜態js檔案,可以直接從jar檔案中拿出來,頁面可以直接引用;而engine.js則有部分動態內容,這決定了它必須經過servelt資源請求,在servelt為動態內容賦值之後,才可以返回給客戶端;

/** The original page id sent from the server */

dwr.engine._origScriptSessionId = "${scriptSessionId}";


/** The session cookie name */

dwr.engine._sessionCookieName = "${sessionCookieName}"; // JSESSIONID


/** Is GET enabled for the benefit of Safari? */

dwr.engine._allowGetForSafariButMakeForgeryEasier = "${allowGetForSafariButMakeForgeryEasier}";


/** The script prefix to strip in the case of scriptTagProtection. */

dwr.engine._scriptTagProtection = "${scriptTagProtection}";


/** The default path to the DWR servlet */

dwr.engine._defaultPath = "${defaultPath}";


/** Do we use XHR for reverse ajax because we are not streaming? */

dwr.engine._pollWithXhr = "${pollWithXhr}";


這些變數值,會在頁面每次重新整理時,伺服器會重新賦值;


一、下面是engine.js中一些變數和方法的解釋:

1、origScriptSessionId

原始指令碼sessionid,隨每次重新整理而改變;它與我們所說的httpsessionid是有區別的,httpsessionid是儲存在伺服器端,origScriptSessionId是儲存在客戶端的;

2、dwr.engine._getJSessionId

得到我們所說的httpsessionid,這個id在整個會話生命週期內不變;

3、dwr.engine._sessionCookieName

_getJSessionId方法引用,用來獲取httpsessionid的;

4、scriptSessionId

頁面sessionid,由origScriptSessionId加上一個隨機數生成;它是客戶端發給server的;每次傳送值都不相同;

5、preHooks

前鉤方法dwr進行遠端方法呼叫的之前呼叫

6、postHooks

後鉤方法dwr進行遠端方法呼叫的之後呼叫;

7、DWREngine.beginBatch()

開始批處理; 包裝請求頭

8、DWREngine.endBatch()

提交批處理;

9、rpcType

dwr的請求型別;


DWREngine.defaultMessageHandler(abc);預設的訊息控制程式碼;


DWREngine.setTextHtmlHandler;當接收到html時發生的事件;


DWREngine.setErrorHandler(abc); 預設錯誤控制程式碼;


DWREngine.setWarningHandler(abc);預設警告控制程式碼;


DWREngine.setTimeout(0); 超時時間設定,預設是0;



//三種呼叫方法;

DWREngine.XMLHttpRequest = 1;

DWREngine.IFrame = 2;

DWREngine.ScriptTag = 3;


DWREngine.setMethod(<1 or 2 or 3>);設定呼叫遠端的方法;


DWREngine.setVerb = function();設定傳送資料的方法;


DWREngine.setOrdered();設定xhr的請求按順序執行.<官方強烈建議不要用這個,會變的很慢而且無法預測.>


DWREngine.setAsync ();設定xhr的請求方法是否非同步?預設是true(非同步);


二、url對應的處理handler

1、createUrlMapping(container, "/engine.js", "engineHandlerUrl", EngineHandler.class);

2、org.directwebremoting.servlet.EngineHandler.java

繼承了FileHandler,並且setDynamic(true);

首先根據/engine.js scriptCache 裡取,如果沒有的話根據/org/directwebremoting/engine.js,classpath路徑載入;從輸入流每行過濾${}的字元,由LocalUtil類替換成真正的內容;

scriptCompressed :是否保留javascrpt檔案中的空行和註釋;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29212814/viewspace-1130597/,如需轉載,請註明出處,否則將追究法律責任。

相關文章