JSF2中Ajax事件和錯(cuò)誤
JSF2的Ajax支持包含一個(gè)非常基本的功能以聽(tīng)取JSF2客戶端處理代碼中的事件和錯(cuò)誤。它假設(shè)該功能會(huì)被部分開(kāi)發(fā)員使用以監(jiān)視事件,例如,當(dāng)出現(xiàn)一個(gè)明顯的Ajax請(qǐng)求時(shí),圖像會(huì)變成黃色,而沒(méi)有這樣的Ajax請(qǐng)求時(shí)則是黑色。本文將嘗試解決JSF2中的Ajax事件和錯(cuò)誤。
閑話少說(shuō),以下就是從Mojarra的Ajax樣本中截取的一部分代碼:
在出現(xiàn)Ajax調(diào)用的頁(yè)面,我們會(huì)有以下域:
- < h3> Status:< /h3>
- < textarea id="statusArea" cols="40" rows="10" readonly="readonly" />
一個(gè)簡(jiǎn)單的文本區(qū)域,甚至都沒(méi)有引入后端服務(wù)器數(shù)據(jù)模型。
然后,在我們的javascript中我們會(huì)看到這樣的代碼:
- var statusUpdate = function statusUpdate(data) {
- var statusArea = document.getElementById("statusArea");
- var text = statusArea.value;
- texttext = text + "Name: "+data.source.id;
- if (data.type === "event") {
- texttext = text +" Event: "+data.name+"\n";
- }
- else { // otherwise, it's an error
- texttext = text + " Error: "+data.name+"\n";
- }
- statusArea.value = text;
- };
- // Setup the statusUpdate function to hear all events on the page
- jsf.ajax.addOnEvent(statusUpdate);
- jsf.ajax.addOnError(statusUpdate);
運(yùn)行代碼的時(shí)候,你會(huì)看到一組數(shù)據(jù)流向頁(yè)面其他地方出現(xiàn)的Ajax事件和錯(cuò)誤一樣通過(guò)文本區(qū)域。嘗試樣本代碼可以看到更多。
到底發(fā)生了什么:首先,我們定義了一個(gè)JavaScript函數(shù),將其設(shè)置為可變量,然后調(diào)用兩個(gè)JSF Ajax 應(yīng)用程序接口函數(shù):assOnEvent和assOnError。這些函數(shù)使用statusUpdate函數(shù)作為其回調(diào),作為第一個(gè)參數(shù)傳送數(shù)據(jù)對(duì)象。
該數(shù)據(jù)對(duì)象,就事件而言,存在三個(gè)命名的事件:開(kāi)始,完成以及成功。
◆開(kāi)始——在請(qǐng)求被發(fā)送前就發(fā)生了。
◆完成——一旦請(qǐng)求完成,且還未調(diào)用javax.faces.response前發(fā)生。
◆成功——在響應(yīng)方法結(jié)束后發(fā)生
這意味著對(duì)于一般的請(qǐng)求,這三項(xiàng)事件都會(huì)被調(diào)用,而如果出現(xiàn)某種錯(cuò)誤,那么就只有開(kāi)始和完成兩項(xiàng)事件會(huì)被調(diào)用。而就錯(cuò)誤而言,有四種可能的命名錯(cuò)誤:
◆httpError——如果客戶接收到任何HTTP狀態(tài)不是200到299中間的任何數(shù)就會(huì)出現(xiàn)這一錯(cuò)誤。
◆emptyResponse——當(dāng)連接被放棄而沒(méi)有出現(xiàn)任何響應(yīng)的時(shí)候發(fā)生。
◆malformedXML——這意味著接收到的XML不能被正確地分析。
◆serverError——當(dāng)錯(cuò)誤在服務(wù)器上生成且被傳送回客戶端時(shí)出現(xiàn)這一錯(cuò)誤。
數(shù)據(jù)有效負(fù)載包括:
◆類型——事件或錯(cuò)誤之一。
◆名稱——Ajax事件和錯(cuò)誤名稱,如上所述。
◆源——觸發(fā)事件的DOM要素。
◆對(duì)于那些稱為serverError的錯(cuò)誤,也存在一個(gè)errorName和errorMessage域,目的是為了發(fā)送并完成服務(wù)器錯(cuò)誤。
◆附加的responseCode,responseXML和responseTxt,作為XMLHttpResponse對(duì)象。
因此,你什么時(shí)候需要使用這一功能呢?可能不會(huì)經(jīng)常使用。但是由于它沒(méi)有在任何其他其他留下記載,筆者希望能對(duì)其作出一些描述。
【編輯推薦】