記得以前通常我們在調用 DWR 的遠程方法是這樣寫
Remote.method(params,function(data){ //服務端執行後客戶端的邏輯,如 alert("服務端執行後返回的數據:"+data); }); Remote.method(params,function(data){ //服務端執行後客戶端的邏輯,如 alert("服務端執行後返回的數據:"+data); });
第一個至倒數第二個參數為客戶端傳向服務端的數據,最後一個參數直接就是一個回調函數。因為服務端根據 Java 對象生成的 js 代碼就是:
Remote.method = function(p0, callback) { dwr.engine._execute(Remote._path, 'Remote', 'method', p0, callback); }
所以很直觀的把第二個參數理解為就是一個回調函數。當然要注意了,上面說的遠程方法都是一個參數,如果為多個參數的話,callback 總是最後一個參數,如:
Remote.method= function(p0, p1, callback) { dwr.engine._execute(Remote._path, 'Remote', 'method', p0, p1, callback); }
你的 DWR 程序要是一切順利,那都好說,算你幸運;而要是碰到了遠程方法在處理你的請求時拋出了異常,你將會看到 DWR 只會給你一個 alert("Error") 簡單顯示錯了,而這是不夠的。所以你需要去琢磨如何主動捕獲種這一錯誤,更友好的展示給用戶。所以若碰到遠程調用的異常,你同樣是幸運的,因為又可以思考來學到一著。
那個 alert("Error") 其實是 DWR 的全局錯誤處理,可通過 dwr.engine.setErrorHandler(errorHandler) 來改變它的默認行為的,如
function errh(errorString, exception) { alert("提示你自定義的全局出錯信息。"); } dwr.engine.setErrorHandler(errh);
也許我們很少這麼做,因為全局性的錯誤處理滿足不了個性化的遠程調用。我們可以把錯誤處理 errorHandler 寫在遠程調用的函數參數中。回頭看前面那個 callback,當它是一個函數時,就是個成功調用後的處理函數,它也可以是個包含幾個函數的對象,此時遠程調用就要這麼寫:
Remote.method(params,{ callback:function(data){ //調用成功時的處理函數 //服務端執行後客戶端的邏輯,如 alert("服務端執行後返回的數據:"+data); }, errorHandler:function(errorString, exception) {//執行異常時 alert('修改 XXX 時出錯,請檢查 XXX 雲雲:'+ errorString) } } ); Remote.method(params,{ callback:function(data){ //調用成功時的處理函數 //服務端執行後客戶端的邏輯,如 alert("服務端執行後返回的數據:"+data); }, errorHandler:function(errorString, exception) {//執行異常時 alert('修改 XXX 時出錯,請檢查 XXX 雲雲:'+ errorString) } } );
更深入的,callback 中不可以包括另外兩個函數屬性:exceptionHandler、warningHandler 和 textHtmlHandler。沒有 exceptionHandler 處理函數就會去應用 errorHandler 函數,並且如果在 callback 函數中的 js 出錯也會跑到 errorHandler 去執行的。詳細的用法請見:http://directwebremoting.org/dwr/other/errors.html。
再,還能在 dwr.xml 中配置有關異常的 convert,如:
<convert match="java.lang.Exception" converter="exception"/>
這樣你就能通過 errorHandler 的 errorString、exception 獲取更詳細的信息。有進一步的實際需求時再來深入。