您的位置:首页 > 其它

Arcgis Server ADF ajax前后台交互(备忘)

2012-10-18 21:06 435 查看
在没有使用使用arcgis server adf之前  我觉得使用ajax是一件so easy的事儿  可是使用adf以前  我感觉相当的郁闷。ok 废话少说,直接进入正题。

场景:我要从后台获得当前视野范围内地图的范围,并通过xml返回给用户。

步骤:

1、写一个类MapExtentListener,让它实现PhaseListener接口。代码如下所示:

package com.esri.adf.web.templates;

import java.io.IOException;
import java.util.Map;

import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.WebMap;
import com.esri.adf.web.data.geometry.WebExtent;
import com.esri.adf.web.faces.renderkit.xml.ajax.AJAXUtil;
import com.esri.adf.web.util.WebUtil;
import com.esri.adf.web.util.XMLUtil;
/**
* 获得地图视野范围
* @author  likehua
* */
public class MapExtentListener implements PhaseListener{
private static final long serialVersionUID = 1L;

@Override
public void afterPhase(PhaseEvent arg0) {
FacesContext context=arg0.getFacesContext();
Map params=context.getExternalContext().getRequestParameterMap();
WebContext webContext=WebUtil.getWebContext(context.getViewRoot());
WebMap map=webContext.getWebMap();
if(params.get("getMapExtent")!=null&¶ms.get("getMapExtent").equals("true")){
WebExtent extent=map.getCurrentExtent();
double minx=extent.getMinX();
double miny=extent.getMinY();
double maxx=extent.getMaxX();
double maxy=extent.getMaxY();

Document  respone=XMLUtil.newDocument();
Element  mapExtent=XMLUtil.createElement(respone,"MapExtent","",null);
XMLUtil.createElement(respone, "maxx", String.valueOf(maxx), mapExtent);
XMLUtil.createElement(respone, "minx", String.valueOf(minx), mapExtent);
XMLUtil.createElement(respone, "maxy", String.valueOf(maxy), mapExtent);
XMLUtil.createElement(respone, "miny", String.valueOf(miny), mapExtent);

try {
AJAXUtil.writeResponse(context, respone);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
context.responseComplete();
}
}

}

@Override
public void beforePhase(PhaseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public PhaseId getPhaseId() {
// TODO Auto-generated method stub
return PhaseId.APPLY_REQUEST_VALUES;
}

}


2、在jsf中配置该类,配置文件(WebContent/WEB-INF/faces-config.xml)如下所示:

<lifecycle>
<phase-listener>com.esri.adf.web.templates.MapExtentListener</phase-listener>
</lifecycle>


3、在前端写一段js代码,向后台发送请求。提起js代码,我又想骂那个天杀的dojo框架+arcgis js api ,容量十分庞大,一不小心就让你的IDE挂掉。代码如下:

function requestMapExtent(){
var formId = map.formId;
var url = adf.Utils.getServerUrl(formId);
var params = "getMapExtent=true&" + adf.Utils.buildRequestParams(formId);
adf.Utils.sendAjaxRequest(url, params, true, processMapInfo);

}
function processMapInfo(res){
alert(res.responseText);
}
function  getExtent(){

map=adf.Controls.maps['map1'];
requestMapExtent();
}


HTML入口:<a href="javascript:void(0)" onclick="getExtent()">当前地图范围</a> 。其他代码省略。

看到这么一个庞然大物,我不禁要问ESRI没落了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: