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使用全过程就完成了