在没有使用使用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没落了吗?