Arcgis Server ADF ajax前后台交互(备忘)
在没有使用使用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;@Overridepublic 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 blocke.printStackTrace();}finally{context.responseComplete();}}}@Overridepublic void beforePhase(PhaseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic PhaseId getPhaseId() {// TODO Auto-generated method stubreturn 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)”>当前地图范围</a>。其他代码省略。
看到这么一个庞然大物,我不禁要问ESRI没落了吗?
posted on
今天不想走,明天就要跑了。