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>