在沒有使用使用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)" onclick="getExtent()">當前地圖範圍</a> 。其他代碼省略。
看到這麼一個龐然大物,我不禁要問ESRI沒落了嗎?