一般在寫Ajax時,最直覺的使用方法就是利用Ajax Object來要求Server給與回應, 再依回應的內容解西倒底是完成動作?還是有錯誤產生,如必填欄位未填。
這裡介紹一個小技巧,在編譯式的網頁伺服器語言可能比較合適使用。
大概的原理是利用程式在執行有錯誤時Throw Exception來當做錯誤訊息, 回傳給client,而client只要接收到503的錯誤,則就可以知道動作並未完成, 反之則是完成。
範例使用prototype來使用Ajax,傳送及回應,有需要可以參考:
Ajax 使用prototype.js 1
以下是載行結果,當有填值時,則回應填寫的值,
沒填值的時候就回傳錯誤訊息。(Exception)
1需要建立一個class extends Exception
裡面需實作String getMessage(),這是要給ErrorPage取得值使用的
package myexception; public class AjaxException extends Exception { private String message ; public AjaxException(String message) { this.message = message; } public String getMessage() { return this.message; } }
2建立一個ErrorPage,當有錯誤時利用這個網頁來顯示資料Error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%><%=exception.getMessage()%>
3建立主程式,執行Ajax要求並處理回傳 -MyAjax.jsp
其中onFailure 處理503,也就是錯誤回傳
onSuccess 處理200,也就是執行完成
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="js/prototype-1.6.0.3.js"> </script> </head> <body style="background-color:#ff0f01"> <script type="text/javascript"> function myclick(){ //prototype的Ajax class new Ajax.Request("TestAjax.jsp",{method:'post', postBody:'id='+$F("myid"), onCreate:function (transport) { //建立Ajax時要啟動的function }, onSuccess: function(transport) {//成功執行的話 alert("成功:"+transport.responseText); },onFailure:function(transport) {//有出錯誤的話 alert("有錯誤產生:"+transport.responseText); } }); } </script> <input type="text" id="myid" name="myid" /> <input type="button" value="取得答案" onclick="myclick();" /> </body> </html>
4建立Ajax要求的伺服器回應頁,記得要指定errorPage -TestAjax.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="Error.jsp"%><% String id = request.getParameter("id"); if(id==null || id.trim().length()==0)//沒傳值進來的話 throw new myexception.AjaxException("沒有傳送參數"); else out.println(id); %>