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;

	@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&&params.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没落了吗?

posted @ 2012-10-18 21:06  李克华  阅读(679)  评论(0编辑  收藏  举报