10.5 常用proxy
1. MemoryProxy
2. HttpProxy
3. ScriptTagProxy
10.5.1 MemoryProxy
MemoryProxy只能從JavaScript對象獲得數據,可以直接把數組,或JSON和XML格式的數據交給它處理,如下面的代碼所示:
var proxy = new Ext.data.MemoryProxy([
['id1','name1','descn1'],
['id2','name2','descn2']
]);
10.5.2 HttpProxy
HttpProxy使用HTTP協議,通過Ajax去後臺取數據,構造它時需要設置url:'xxx.jsp'參數。這裏的url可以替換成任何一個合法的網址,這樣HttpProxy才知道去哪裏獲取數據,如下面的代碼所示:
var proxy = new Ext.data.HttpProxy({url:'xxx.jsp'});
後臺需要返回EXT所需要的JSON格式的數據,下面的內容就是後臺使用JSP的一個範例,如下面的代碼所示:
response.setContentType("application/x-json");
Writer out = response.getWriter();
out.print("[" +
"['id1','name1','descn1']" +
"['id2','name2','descn2']" +
"]");
請注意,這裏的HttpProxy不支持跨域,它只能從同一域中獲得數據。如果想跨域,請參考下面的ScriptTagProxy。
10.5.3 ScriptTagProxy
ScriptTagProxy的用法幾乎和HttpProxy一樣,如下面的代碼所示:
var proxy = new Ext.data.ScriptTagProxy({url:'xxx.jsp'});
從這裏也看不出來它是如何支持跨域的,我們還需要在後臺進行相應的處理,如下面的代碼所示:
String cb = request.getParameter("callback");
response.setContentType("text/javascript");
Writer out = response.getWriter();
out.write(cb + "(");
out.print("[" +
"['id1','name1','descn1']" +
"['id2','name2','descn2']" +
"]");
out.write(");");
其中的關鍵就在於從請求中獲得的callback參數,這個參數叫做回調函數。ScriptTagProxy會在當前的HTML頁面裏添加一個<script type="text/javascript"src="xxx.jsp"></script>標籤,然後把後臺返回的內容添加到這個標籤中,這樣就可以解決跨域訪問數據的問題。爲了讓後臺返回的內容可以在動態生成的標籤中運行,EXT會生成一個名爲callback的回調函數,並把回調函數的名稱傳遞給後臺,由後臺生成callback(data)形式的響應內容,然後返回給前臺自動運行。
雖然上述處理過程比較難理解,但是我們只需要瞭解ScriptTagProxy的用法就足夠了。如果還想進一步瞭解ScriptTagProxy的運行過程,可以使用Firebug查看動態生成的HTML以及響應的JSON內容。
最後我們來分析一下EXT的API文檔中提供的示例,這段後臺代碼會自動判斷請求的類型,返回支持ScriptTagProxy或HttpProxy的數據,如代碼清單10-2所示:
代碼清單10-2 在後臺同時支持HttpProxy和ScriptTagProxy
boolean scriptTag = false;
String cb = request.getParameter("callback");
if (cb != null) {
scriptTag = true;
response.setContentType("text/javascript");
} else {
response.setContentType("application/x-json");
}
Writer out = response.getWriter();
if (scriptTag) {
out.write(cb + "(");
}
out.print(dataBlock.toJsonString());
if (scriptTag) {
out.write(");");
}
代碼中通過判斷請求中是否包含callback參數來決定返回何種數據類型。如果包含,就返回ScriptTagProxy需要的數據;否則,就當作HttpProxy處理。