ExtJS常用proxy

10.5 常用proxy

1.  MemoryProxy

2.  HttpProxy

3.  ScriptTagProxy

 

10.5.1 MemoryProxy

MemoryProxy只能從JavaScript對象獲得數據,可以直接把數組,或JSONXML格式的數據交給它處理,如下面的代碼所示:

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內容。

最後我們來分析一下EXTAPI文檔中提供的示例,這段後臺代碼會自動判斷請求的類型,返回支持ScriptTagProxyHttpProxy的數據,如代碼清單10-2所示:

代碼清單10-2 在後臺同時支持HttpProxyScriptTagProxy

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處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章