小秋的家

home

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  1 Posts :: 91 Stories :: 17 Comments :: 0 Trackbacks

 

1.在页面端,首先撰写自定义的javascript方法,有了这个方法,就可以在前端页面的任何地方去触发地图事件了:

function test(str){

    //需要传递到后台的自定义参数

    var str1=encodeURI(encodeURI(str));


    //“mapForm”是地图页面上的表单名,从该表单获取向后台提交的URL

    var url = EsriUtils.getServerUrl("mapForm");



    //“map1”是地图页面上的地图ID

    var map = EsriControls.maps["map1"];


      //定义需要传递的参数列表,最后的“EsriUtils.buildRequestParams(map.formId)”为固定写法

    var params = "addpointInt=addpointInt";//这个参数用来在后台判断当前应该做什么操作,从而决定调用哪个处理类,参数名和值都是自定义的

    params += " &mapId=map1 ";//地图的ID

    params += " &str="+str1;//自定义的参数

    params += " &"+EsriUtils.buildRequestParams(map.formId);//固定写法

   

    //调用sendAjaxRequest方法,发送请求,其中的function(){testCallBack(xmlHttp);}为回调方法

    var xmlHttp = EsriUtils.sendAjaxRequest(url,params,true,function(){testCallBack(xmlHttp);});

}


2.然后是相关的回调方法,回调方法就可以根据自己的需要随意进行操作了,这只是非常普通的AJAX回调方法

function testCallBack(xmlHttp){

    if (xmlHttp != null && xmlHttp.readyState == 4 && xmlHttp.status == 200) {

        var xml = xmlHttp.responseXML;

        var map = EsriControls.maps["map1"];

        // map.refresh();

        // alert("run here");

        map.resize(map.bounds.width, map.bounds.height);

    }

}


3.然后是撰写后台程序,用以捕捉前台所触发的AJAX事件。这是一个listener,需要实现接口javax.faces.event.PhaseListener:

 

import java.util.Map;

 

import javax.faces.context.ExternalContext;

import javax.faces.context.FacesContext;

import javax.faces.event.PhaseEvent;

import javax.faces.event.PhaseId;

import javax.faces.event.PhaseListener;

 

public class SelfPhaseListener implements PhaseListener {

        //////////////////////////////ajax处理代码

    public PhaseId getPhaseId() {

        // TODO Auto-generated method stub

 

        //这里表示在应用请求值阶段进行处理

        return PhaseId.APPLY_REQUEST_VALUES;//.APPLY_REQUEST_VALUES;//选择action的回调处理过程

    }

     

     

    public void afterPhase(PhaseEvent phaseEvent) {

        //从FacesContext中获得由前端javascript方法传递来的参数列表

        FacesContext facesContext = phaseEvent.getFacesContext();

        ExternalContext externalContext = facesContext.getExternalContext();

        Map paramMap = externalContext.getRequestParameterMap();

       


        //这里判断是不是我们需要的请求,如果不是直接返回。这个“addpointInt”即是先前所定义的javasctipt方法中的一个参数

        if("addpointInt".equals((String) paramMap.get("addpointInt"))){

                    //这个AddPointPhaseListener类就是自定义的用来进行后台处理的类

            AddPointPhaseListener addpoint=new AddPointPhaseListener();

            addpoint.excute(paramMap, facesContext);

        }

     }

 

 

    @Override

    public void beforePhase(PhaseEvent arg0) {

       // TODO Auto-generated method stub

      

    }

}


4.接下来写一个用来处理具体业务的类:

import java.util.Map;

 

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

 

import com.esri.adf.web.data.TocFunctionality;

import com.esri.adf.web.data.WebContext;

import com.esri.adf.web.data.WebMap;

import com.esri.adf.web.faces.component.MapControl;

import com.esri.adf.web.faces.renderkit.xml.ajax.AJAXUtil;

import com.esri.adf.web.util.XMLUtil;

 

public class AddPointPhaseListener {

    @SuppressWarnings("deprecation")

    public void excute(Map paramMap,FacesContext facesContext) {

        try {

            //get form element from view。获得页面上的表单对象

            UIComponent form = facesContext.getViewRoot().findComponent((String) paramMap.get("mapForm"));

            if(form == null){

                return;

            }

 

            //get map control。获得mapControl

            MapControl mc = (MapControl) form.findComponent((String) paramMap.get("mapId"));

            if(mc == null){

                return;

            }

 

 

            //get web map, web context & clear graphics。获得WebMap,WebContext,就可以进行地图操作了

            WebMap wm = mc.getWebMap();

            WebContext wc = wm.getWebContext();

            wc.getWebQuery().clearGraphics();

            

            // read information form string of js function

            //获得从页面javasctipt方法传递来的参数列表

            String str=java.net.URLDecoder.decode((String) paramMap.get("str"), "UTF-8");

            ///////////////////////

            //如果需要返回的话,像这样用XML的形式返回数据

            //create and populate xml response document

            Document doc = XMLUtil.newDocument();

            Element responseTag = XMLUtil.createElement(doc, "response", null, null);

            responseTag.setAttribute("test", "hello");

            //write response

            AJAXUtil.writeResponse(facesContext, doc);

            

        }

        catch (Exception e) {

        }

        finally {

            facesContext.responseComplete();

        }

    }

}



5.最后,需要在faces-context.xml文件中通过注册生命周期的方式,来使以上这些代码生效:

<!-- MapViewer Phase Listener -->

<lifecycle>

    <!-- 这是默认的listener -->

    <phase-listener>

        com.esri.adf.web.templates.MapViewerPhaseListener

    </phase-listener>


    <!-- 这是先前自定义的Listener -->

    <phase-listener>

        com.megait.gis.listener.SelfPhaseListener

    </phase-listener>

</lifecycle>
posted on 2009-11-25 15:58 棋剑小秋 阅读(1323) 评论(0)  编辑  收藏 所属分类: GIS

只有注册用户登录后才能发表评论。


网站导航: