zoukankan      html  css  js  c++  java
  • 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没落了吗?

  • 相关阅读:
    使用Navicat for Oracle新建表空间、用户及权限赋予---来自烂泥
    NonAction与ChildActionOnly
    C# Monitor的Wait和Pulse方法使用详解
    机械键盘简介
    【转载】 中小型研发团队架构实践
    BinaryReader 自己写序列化
    显式接口实现
    AssemblyVersion和AssemblyFileVersion的区别
    自定义设置程序集版本重定向和程序集位置的信息
    单例模式中的属性实现
  • 原文地址:https://www.cnblogs.com/likehua/p/2730120.html
Copyright © 2011-2022 走看看