在没有使用使用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)" οnclick="getExtent()">当前地图范围</a> 。其他代码省略。
看到这么一个庞然大物,我不禁要问ESRI没落了吗?