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使用全过程就完成了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)