就是看帮助,写写,加深一下记忆。
1、JSP文件中
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
<pre class="code"><body onload="init()">
…
<a:map id="map" value="#{mapContext.webMap}" … />
…
Map Information :
<table><tbody>
<tr>
<td>MinX : </td><td><span id="minx"></span></td>
</tr><tr>
<td>MinY : </td><td><span id="miny"></span></td>
</tr><tr>
<td>MaxX : </td><td><span id="maxx"></span></td>
</tr><tr>
<td>MaxY : </td><td><span id="maxy"></span></td>
</tr><tr>
<td>Scale : </td><td><span id="map-scale"></span></td>
</tr>
</tbody></table>
…
</body>
</pre>2、JS文件
帮助中的例子是这样的:
在init()中给map添加一个监听事件,map更新就调用updatMapInformationRequest(),
但实际就没有见到有代码用这个,用的是:
EsriControls.addPostBackTagHandler("selectAllLayerValue", selectAllLayer);
不知道了,等等再看看。
init()
{
map.addUpdateListener("mapInformationListener", updateMapInformationRequest);
}
在js文件中添加
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
var url = EsriUtils.getServerUrl(map.formId);
var params = "mapinformation=mapinformation&formId=" + map.formId + "&mapId=" +
map.id + "&" + EsriUtils.buildRequestParams(map.formId);
var xmlHttp = EsriUtils.sendAjaxRequest(url, params, true, function(){
updateMapInformationResponse(xmlHttp);
}
);
3、Java文件
客户端sendAjaxRequest之后就到了PhaserListenser了,不知道它是怎么使发送的请求找到处理请求的PhaseListenser类的,难道把所有faces-config。xml中的Listenser都执行一遍吗?
下面就是PhaseListenser的代码了,
if ("layerFields".equals((String) paramMap.get("layerFields")))
来判断是不是处理这个事件。
之后就创建XML节点,然后返回。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
public class NationNameListener implements PhaseListener {
private static final long serialVersionUID = 1L;
/**
* 地图服务对象
* */
private WebContext wctx;
/**
* 地图服务对象
* */
private DviewMap dviewMap = new DviewMap();
/**
* 获取的图层编号
* */
private int[] layerIds = null;
/**
* 指定指定要素定位的所有图层
* */
private final String allLayers = "orAllLayers";
public PhaseId getPhaseId() {
return PhaseId.APPLY_REQUEST_VALUES;
}
public void beforePhase(PhaseEvent phaseEvent) {}
/**
* 方法说明:监听客户端事件,返回对应的图层信息
* @param phaseEvent 客户端事件
* */
public void afterPhase(PhaseEvent phaseEvent) {
FacesContext facesContext = phaseEvent.getFacesContext();
ExternalContext externalContext = facesContext.getExternalContext();
Map paramMap = externalContext.getRequestParameterMap();
/**
* 如果当前需要获取所有图层
* */
if(allLayers.equalsIgnoreCase((String)paramMap.get("orAllLayers"))){
/**
*为容器为空则初始化地图容器
* */
wctx = dviewMap.getWebContext(facesContext, paramMap, (String) paramMap.get("formId"), (String) paramMap.get("mapId"));
/**
* 获取到的所有图层信息
* */
Hashtable<String,String> orAllLayers = dviewMap.getAllVisibleLayersIdName(wctx, (String) paramMap.get("formId"), (String) paramMap.get("mapId"));
/**
* 创建文档对象
* */
Document doc = XMLUtil.newDocument();
/**
* 创建节点
* */
Element responseTag = XMLUtil.createElement(doc, "response",null, null);
/**
* 如果有可见图层
* */
if(orAllLayers!=null){
/**
* 创建文档信息
* */
MapViewerElementsRenderer.appendMapLayerResponse(responseTag, orAllLayers);
}
/**
* 将创建的文档发送到客户端
* */
try {
AJAXUtil.writeResponse(facesContext, doc);
} catch (IOException e) {
e.printStackTrace();
}finally{
facesContext.responseComplete();
}
return;
}
}4、faces-config。xml
< lifecycle > < phase - listener >
com.esri.arcgis.sample.mapinformation.MapInformationPhaseListener < / phase -
listener > < / lifecycle >
不知道这个东西什么时候调用?
5、JS文件
在这个中间执行回调函数了。得到Java类中创建的Element的值,再在Js中DOM了。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
var layersResult = function viewLayersResult(xh){
if (xh != null && xh.readyState == 4 && xh.status == 200) {
var xml = EsriUtils.getXmlDocument(xh);
var headerTag = xml.getElementsByTagName("layers").item(0);
var layerTags = xml.getElementsByTagName("layer");
for(var i=0,il=layerTags.length;i<il;i++){
var layerTag = layerTags[i];
var layerName = layerTag.getAttribute("name");
var layerId = layerTag.getAttribute("id");
var shapeType = layerTag.getAttribute("shapeType");
layerRes[layerId] = shapeType;
var opt = new Option(layerName,layerId);
alllayersOption.options[alllayersOption.options.length] = opt;
opt = null;
}
if(editOrSelect=="edit" || editOrSelect=="sign"){
changeLayer(editOrSelect);
}
}
}这是看到的第一种流程,代码中用到的最多。