ArcServer的Ajax实现(2)
继续看看,继续写写,加深记忆。
这次实现用的是AJAXResponseRenderer,更是麻烦,和上面的区别好像在于这个的回调函数不在对页面有什么处理,上次是得到结果又写道页面中来,这次就是实现一个放大缩小,或是zoomto这种功能,好像是这样子的。
1、JSP文件
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
< select id = "zoomFactor" onchange =
"sendMapZoomRequest(document.getElementById('zoomFactor').value);" > < option
value = "0.2" > 0.2 < / option > < option value = "0.4" > 0.4 < / option >
< option value = "0.6" > 0.6 < / option > < option value = "0.8" > 0.8 < /
option > < option value = "1.0" selected = "true" > 1.0 < / option > <
option value = "1.2" > 1.2 < / option > < option value = "1.4" > 1.4 < /
option > < option value = "1.6" > 1.6 < / option > < option value = "1.8" >
1.8 < / option > < option value = "2.0" > 2.0 < / option > < / select >
2、JS文件,这个EsriControls.processPostBac,就在不执行什么代码了,就不对页面做什么处理 ,和上面的那个回调函数不一样了
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
var map = EsriControls.maps[mapId];
var params = "zoomto=zoomto&zoomtofeature=zoomtofeature&formId=" + map.formId + "&mapId=" + map.id ;
//回调
EsriUtils.sendAjaxRequest(EsriUtils.getServerUrl(map.formId), params, true, EsriControls.processPostBack);
3、Java文件,流程不怎么一样了,太复杂了,不懂。还涉及一个WEB-INF/ajax-renderers.xml文件,不知道怎么用。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
public class ZoomtoPhaseListener implements PhaseListener {
static final String ZOOMTO = "zoomto";
static final String ZOOMTOPOINT = "zoomtopoint";
static final String ZOOMTOFEATURE = "zoomtofeature";
static final String FORM_ID = "formId";
static final String MAP_ID = "mapId";
static final String FEATURENAME = "featureName";
public void afterPhase(PhaseEvent phaseEvent) {
FacesContext facesContext = phaseEvent.getFacesContext();
ExternalContext externalContext = facesContext.getExternalContext();
Map paramMap = externalContext.getRequestParameterMap();
//判断请求是否由这个PhaseListener来处理
if (! ZOOMTO.equals((String) paramMap.get(ZOOMTO)))
return;
if(ZOOMTOPOINT.equals((String)paramMap.get(ZOOMTOPOINT))){
processZoomToPoint(facesContext, paramMap);
}else if(ZOOMTOFEATURE.equals((String)paramMap.get(ZOOMTOFEATURE))){
processZoomToFeature(facesContext, paramMap);
}
}
private void processZoomToPoint(FacesContext facesContext,Map paramMap){
try {
// get Form from view
UIComponent form = facesContext.getViewRoot().findComponent((String) paramMap.get(FORM_ID));
// get MapControl
MapControl mapControl = (MapControl)form.findComponent((String) paramMap.get(MAP_ID));
// get WebMap
WebMap webMap = mapControl.getWebMap();
// get WebContext
WebContext webContext = webMap.getWebContext();
// set event source as map, since operation is to be performed on the map
Vector eventSources = new Vector();
eventSources.add(mapControl.getId());
AJAXResponseRenderer ajaxRenderer = new AJAXResponseRenderer(facesContext, eventSources, form);
//获取参数中的x、y坐标,居中并高亮显示
double x = Double.parseDouble((String)paramMap.get("x"));
double y = Double.parseDouble((String)paramMap.get("y"));
WebPoint pt = new WebPoint(x,y);
pt.setSpatialReference(webContext.getSpatialReference());
webMap.centerAt(pt, 1);
// 刷新控件的状态
webContext.refresh();
// 生成XML文档,写入到响应流中
Document doc = ajaxRenderer.renderResponse(facesContext);
//添加高亮显示的XML内容
Element flashElem = XMLUtil.createElement("flashfeatureset","",doc.getDocumentElement());
Element ptElem = XMLUtil.createElement("point", "", flashElem);
WebPoint ptScreen = pt.fromMapGeometry(webMap);
ptElem.setAttribute("x", String.valueOf(ptScreen.getX()));
ptElem.setAttribute("y", String.valueOf(ptScreen.getY()));
AJAXUtil.writeResponse(facesContext, doc);
logger.info("zoom to point");
} catch (Exception e) {
logger.info("Unable to render xml");
} finally {
//结束请求的phase周期
facesContext.responseComplete();
}
}
}
完了,第二个复杂了许多,不怎么理解,还有一种继承AJAXRenderer的,不知道做什么的,继续研究
这次实现用的是AJAXResponseRenderer,更是麻烦,和上面的区别好像在于这个的回调函数不在对页面有什么处理,上次是得到结果又写道页面中来,这次就是实现一个放大缩小,或是zoomto这种功能,好像是这样子的。
1、JSP文件
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
< select id = "zoomFactor" onchange =
"sendMapZoomRequest(document.getElementById('zoomFactor').value);" > < option
value = "0.2" > 0.2 < / option > < option value = "0.4" > 0.4 < / option >
< option value = "0.6" > 0.6 < / option > < option value = "0.8" > 0.8 < /
option > < option value = "1.0" selected = "true" > 1.0 < / option > <
option value = "1.2" > 1.2 < / option > < option value = "1.4" > 1.4 < /
option > < option value = "1.6" > 1.6 < / option > < option value = "1.8" >
1.8 < / option > < option value = "2.0" > 2.0 < / option > < / select >
2、JS文件,这个EsriControls.processPostBac,就在不执行什么代码了,就不对页面做什么处理 ,和上面的那个回调函数不一样了
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
var map = EsriControls.maps[mapId];
var params = "zoomto=zoomto&zoomtofeature=zoomtofeature&formId=" + map.formId + "&mapId=" + map.id ;
//回调
EsriUtils.sendAjaxRequest(EsriUtils.getServerUrl(map.formId), params, true, EsriControls.processPostBack);
3、Java文件,流程不怎么一样了,太复杂了,不懂。还涉及一个WEB-INF/ajax-renderers.xml文件,不知道怎么用。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class ZoomtoPhaseListener implements PhaseListener {
static final String ZOOMTO = "zoomto";
static final String ZOOMTOPOINT = "zoomtopoint";
static final String ZOOMTOFEATURE = "zoomtofeature";
static final String FORM_ID = "formId";
static final String MAP_ID = "mapId";
static final String FEATURENAME = "featureName";
public void afterPhase(PhaseEvent phaseEvent) {
FacesContext facesContext = phaseEvent.getFacesContext();
ExternalContext externalContext = facesContext.getExternalContext();
Map paramMap = externalContext.getRequestParameterMap();
//判断请求是否由这个PhaseListener来处理
if (! ZOOMTO.equals((String) paramMap.get(ZOOMTO)))
return;
if(ZOOMTOPOINT.equals((String)paramMap.get(ZOOMTOPOINT))){
processZoomToPoint(facesContext, paramMap);
}else if(ZOOMTOFEATURE.equals((String)paramMap.get(ZOOMTOFEATURE))){
processZoomToFeature(facesContext, paramMap);
}
}
private void processZoomToPoint(FacesContext facesContext,Map paramMap){
try {
// get Form from view
UIComponent form = facesContext.getViewRoot().findComponent((String) paramMap.get(FORM_ID));
// get MapControl
MapControl mapControl = (MapControl)form.findComponent((String) paramMap.get(MAP_ID));
// get WebMap
WebMap webMap = mapControl.getWebMap();
// get WebContext
WebContext webContext = webMap.getWebContext();
// set event source as map, since operation is to be performed on the map
Vector eventSources = new Vector();
eventSources.add(mapControl.getId());
AJAXResponseRenderer ajaxRenderer = new AJAXResponseRenderer(facesContext, eventSources, form);
//获取参数中的x、y坐标,居中并高亮显示
double x = Double.parseDouble((String)paramMap.get("x"));
double y = Double.parseDouble((String)paramMap.get("y"));
WebPoint pt = new WebPoint(x,y);
pt.setSpatialReference(webContext.getSpatialReference());
webMap.centerAt(pt, 1);
// 刷新控件的状态
webContext.refresh();
// 生成XML文档,写入到响应流中
Document doc = ajaxRenderer.renderResponse(facesContext);
//添加高亮显示的XML内容
Element flashElem = XMLUtil.createElement("flashfeatureset","",doc.getDocumentElement());
Element ptElem = XMLUtil.createElement("point", "", flashElem);
WebPoint ptScreen = pt.fromMapGeometry(webMap);
ptElem.setAttribute("x", String.valueOf(ptScreen.getX()));
ptElem.setAttribute("y", String.valueOf(ptScreen.getY()));
AJAXUtil.writeResponse(facesContext, doc);
logger.info("zoom to point");
} catch (Exception e) {
logger.info("Unable to render xml");
} finally {
//结束请求的phase周期
facesContext.responseComplete();
}
}
}
完了,第二个复杂了许多,不怎么理解,还有一种继承AJAXRenderer的,不知道做什么的,继续研究