ArcGIS Server Java ADF 案例教程 33

自定义AJAX请求获得地图范围【案例】
比如你现在想随时知道当前地图的边界范围,也就是说每次地图范围更新后,希望服务器可以输出一个包含边界范围的AJAX响应到浏览器,那么首先你需要在用户对地图进行操作的时候发送一个AJAX请求。这个请求你可以在每次地图被更新的时候去调用,比如一开始就通过addUpdateListener给 Map添加一个监听:


function onBodyLoad()
{
map = EsriControls.maps['map'];
map.addUpdateListener("onMapUpdate", onMapUpdate);
}
function onMapUpdate()
{
var formId = map.formId;
var url = EsriUtils.getServerUrl(formId);
var params = "getMapInfo=true&" + EsriUtils.buildRequestParams(formId);
EsriUtils.sendAjaxRequest(url, params, true, processMapInfo);
}
这个时候,服务器就接收到了用户发出的参数中带有getMapInfo属性的AJAX请求,我们将通过这个属性来判断是不是用户的自定义请求,需要服务器额外返回当前的地图范围给浏览器。
下面是服务器端的处理,主要是实现一个PhaseListener对请求进行监听并过滤:
public class MapUpdatePhaseListener implements PhaseListener
{
public void afterPhase(PhaseEvent event)
{
FacesContext facesContext = event.getFacesContext();
Map params = facesContext.getExternalContext().getRequestParameterMap();
WebContext webContext = WebUtil.getWebContext(facesContext.getViewRoot());
WebMap webMap = webContext.getWebMap();
if ("true".equals(params.get("getMapInfo")))
{
WebExtent extent = webMap.getCurrentExtent();
double xmax = extent.getMaxX();
double ymax = extent.getMaxY();
double xmin = extent.getMinX();
double ymin = extent.getMinY();
Document doc = XMLUtil.newDocument();
Element mapInfo = XMLUtil.createElement(doc, "mapInfo", "", null);
XMLUtil.createElement(doc, "xmax", String.valueOf(xmax), mapInfo);
XMLUtil.createElement(doc, "xmin", String.valueOf(xmin), mapInfo);
XMLUtil.createElement(doc, "ymax", String.valueOf(ymax), mapInfo);
XMLUtil.createElement(doc, "ymin", String.valueOf(ymin), mapInfo);
try
{
AJAXUtil.writeResponse(facesContext, doc);
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
facesContext.responseComplete();
}
}
}
public void beforePhase(PhaseEvent event) { }
public PhaseId getPhaseId()
{
return PhaseId.APPLY_REQUEST_VALUES;
}
}
从这个PhaseListener中,我们过滤出了请求中含有getMapInfo属性的AJAX请求,如果这个属性值为true,那么表示需要输出包含地图范围的AJAX响应,此时,通过构造一个XML的Document,并加上需要输出的xmin、xmax、ymin、ymax等值后,通过 AJAXUtil的writeResponse方法来输出到客户端。
下面让我们回到客户端,看看发送AJAX请求时设置的回调函数processMapInfo:
function processMapInfo(xh)
{
if (xh != null && xh.readyState == 4 && xh.status == 200)
{
var xml = EsriUtils.getXmlDocument(xh);
var xmax = EsriUtils.getXmlText(xml.getElementsByTagName("xmax").item(0));
var xmin = EsriUtils.getXmlText(xml.getElementsByTagName("xmin").item(0));
var ymax = EsriUtils.getXmlText(xml.getElementsByTagName("ymax").item(0));
var ymin = EsriUtils.getXmlText(xml.getElementsByTagName("ymin").item(0));
document.getElementById("xmax").innerHTML = xmax;
document.getElementById("xmin").innerHTML = xmin;
document.getElementById("ymax").innerHTML = ymax;
document.getElementById("ymin").innerHTML = ymin;
}
}
这个函数的参数xh就是AJAX请求(XMLHttpRequest),通过它我们可以获得AJAX响应的具体内容。当获得响应的内容以后,你就可以继续进行任意的处理了,比如上面的代码就是通过几个div把地图范围的坐标给显示出来。

图 24 自定义AJAX请求获得地图范围

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值