1.arcgis 的地圖控制項是直接支援AJAX的.
如果我們需要在地圖操作時使用AJAX的話可以做如下操作
在body onload 時調用init方法.
function init()
{
var map = EsriControls.maps["Map0"];
map.addUpdateListener("request", updateInfoRequest);
}
這樣我們在對地圖進行操作時,就會調用 updateInfoRequest 方法.
function updateInfoRequest(){
var url = EsriUtils.getServerUrl("frmMap");
var map = EsriControls.maps["Map0"];
var params = "ajaxdemo=ajaxdemo&mapId=Map0&" + EsriUtils.buildRequestParams(map.formId);
var xmlHttp = EsriUtils.sendAjaxRequest(url,params,true,function()
{ updateInfoResponse(xmlHttp); });
}
updateInfoResponse 這個是ajax發送請求時返回時調用的回呼函數.
使用這個函數可以實現對我們的介面做更新.
function updateInfoResponse(xmlHttp) {
if (xmlHttp != null && xmlHttp.readyState == 4 && xmlHttp.status == 200) {
var xml = xmlHttp.responseXML;
var scale=xml.getElementsByTagName("scale").item(0).firstChild.nodeValue;
document.getElementById("scale").value = "1:" + scale
}
}
以上時用戶端的調用
服務端又是如何處理呢?
我們在服務端可以使用一個實現 PhaseListener 介面的類.
Ajax生命週期在server上是獨立執行的。這以為著瀏覽器發出一個攜帶一定參數的request並且期望得到一個特定格式的XML response。這個response可以由任何類型的JSF PhaseListeners或者servlet或者甚至是靜態XML檔案。現在我們看看怎樣使用PhaseListener用來處理一個request和返回一個response到瀏覽器。
當瀏覽器使用XMLHttpRequest對象向伺服器發送request,這個request遵循標準的JSF request 處理生命週期。這些components在Restore View phase階段被重建並且它們的狀態在Apply Request values phase階段被更新。因為我們需要這些在頁面上的components被更新,我們跳過PhaseListener.beforePhase()方法的處理。在PhaseListener.afterPhase方法我們處理request和呈現response到用戶端。
代碼如下:
public class AjaxDemoPhaseListener implements PhaseListener {
public PhaseId getPhaseId() {
// TODO Auto-generated method stub
//這裡表示在應用請求值階段進行處理
return PhaseId.APPLY_REQUEST_VALUES;
}
public void afterPhase(PhaseEvent phaseEvent) {
FacesContext facesContext = phaseEvent.getFacesContext();
ExternalContext externalContext = facesContext.getExternalContext();
Map paramMap = externalContext.getRequestParameterMap();
String formId = (String) paramMap.get("formId");
String mapId=(String)paramMap.get("mapId");
//這裡判斷是不是我們需要的請求,如果不是直接返回.
String ajaxdemo=(String) paramMap.get("ajaxdemo");
if(ajaxdemo==null || !ajaxdemo.equals("ajaxdemo"))
return;
UIComponent form = facesContext.getViewRoot().findComponent(formId);
MapControl mc = (MapControl) form.findComponent(mapId);
WebMap wm = mc.getWebMap();
String scale= String.valueOf(wm.getMapScale());
Document doc = XMLUtil.newDocument();
Element responseElement = XMLUtil.createElement(doc, "response", null, null);
XMLUtil.createElement("scale", scale, responseElement);
try {
AJAXUtil.writeResponse(facesContext, doc);
//
facesContext.responseComplete();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public void beforePhase(PhaseEvent phaseEvent) {
}
}
最後我們在 <lifecycle> 中註冊我們所寫的監聽器.
這樣arcgis的ajax使用全過程就完成了