二次开发(arcgis server for java)(7)

2019-04-14 15:58

12、ArcGIS Server Java讲座--如何在用JSF在服务器端处理Ajax请求

服务器端的处理才是整个事件的Key,那么我们来看看整个请求,回复的过程,我们通过

下面的图看看我们服务器端的代码怎么样才可以plug in进去:

看了这个图您肯定已经明白了,我们有机会得到客户端发送过来的HTTP请求,得到这个请求,

28

得到请求里面的参数,我们就可以捋起袖子,大干一番了。

我们用什么方式去处理呢,最简单的一个方法是自己写一个servlet,在servlet的Dopost方法里面,写上处理这个请求的代码,并且把结果以XML的方式返回回去,那么我们这里用一个简单的例子:

throws java.io.IOException {

String action = req.getParameter(\ String item = req.getParameter(\

if ((action != null)&&(item != null)) {

// Add or remove items from the Cart if (\ cart.addItem(item);

} else if (\ cart.removeItems(item); } }

// Serialize the Cart's state to XML String cartXml = cart.toXml();

// Write XML to response.

res.setContentType(\ res.getWriter().write(cartXml); }

这对于了解服务器端编程的人来说,是最简单不过的了。当然,我们用了JSF框架,肯定不会再通过Servlet技术去做这件事情。我们这里用JSF的PhaseListener进行处理。什么是PhaseListener,我们来看一下PhaseListener的JavaDoc:

extends java.util.EventListener, java.io.Serializable

An interface implemented by objects that wish to be notified at the beginning and ending of processing for each standard phase of the request processing lifecycle.

原来,这个接口捕捉到每个Request的声明周期,在请求开始处理和请求处理结束时我们可以插入我们自己的代码。这个接口的两个最重要的方法如下:

Handle a notification that the processing for a particular phase has just been completed. void beforePhase(javax.faces.event.PhaseEvent event)

Handle a notification that the processing for a particular phase of the request processing lifecycle is about to begin.

29

处理结束和处理开始两个方法,我们可以在这两个方法里面写入我们自己的代码,对用户过来的请求进行处理。

比如,我们可以在afterPhase方法里面,插入下面的代码对数据进行处理: ExternalContext externalContext = facesContext.getExternalContext(); Map paramMap = externalContext.getRequestParameterMap();

通过paramMap里面可以得到所有的参数,当然,我们并不是对每一个请求都会进行处理,所以,在客户端Javascript发送Ajax请求得时候,可以添加一个自定义的参数,比如我们前面文档中的ajaxdemo=ajaxdemo参数,这样我们可以判断一下当前是不是我们要处理的请求:

if (! AJAX_DEMO.equals(paramMap.get(AJAX_DEMO))) return;

接下去的代码,就可以处理我们的各种各样的请求了,我们在这里要举的例子是如何得到当前地图的比例尺。下次讲座再深入探讨吧。

13、ArcGIS Server Java讲座----利用Ajax得到当前地图的比例尺(服务器端)

现在我们进入实战阶段,看看我们怎么可以在服务器端得到当前地图的范围,这个代码中你将学到如何从faces Context里面得到当前form中的控件,以及如何利用ESRI提高的工具,简化我们响应AJAX请求的过程:

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

首先我们得到页面上的form,form是一个container,通过它我们可以得到form中的其它组件,比如我们的地图控件:

我们可以用下面的方法得到这个Mapcontrol和WebMap:

MapControl mc = (MapControl) form.findComponent((String) paramMap.get(MAPID)); WebMap wm = mc.getWebMap();

得到了这个WebMap,哈哈,可以得到Everything了,因为你可以从WebMap中得到WebContext。

30

这个时候,想得到那个比例尺,是再简单也不过的事情了,用下面的代码即可:

wm.getMapScale();

得到了比例尺了,接下去怎么办呢?把它返回到客户端,我们的Ajax客户端认的是XML的流,咋办呢?最笨的办法当然是是一个一个String的组装成XML,然后调用Response的Write写回到客户端,比如下面的代码:

public String toXml() {

StringBuffer xml = new StringBuffer(); xml.append(\ xml.append(“”);

xml.append(“100”); xml.append(\ return xml.toString(); }

生成了XML代码,然后用下面的代码把结果返回给客户端: Response res=(Response)externalContext.getResponse(); res.setContentType(\res.getWriter().write(scaleXml);

当然,各位看官想来都是JAVA高手,对于这样的写法实在感觉不舒服,正待想办法用标准的XML工具来写时,你会发现,ESRI已经为您想到了,写好了几个工具类来供你调用了。我们来看看怎么用这些工具:

用下面的代码创建一个标准的XML文档: Document doc = XMLUtil.newDocument(); 用下面的代码新建一个element:

Element responseElement = XMLUtil.createElement(doc, \用下面的代码将我们的比例尺数据写到刚才新建的Element里面:

XMLUtil.createElement(\然后用下面的语句将XML文档写入到客户端: AJAXUtil.writeResponse(facesContext, doc);

很可惜的是,ESRI这些类的代码是不公开的,不过你可以猜一猜,这些方法里面到底发生了什么事情。

31

OK,皮球又被提到了客户端了,我们下一个讲座来看看,如何解析服务器端返回的XML文档,并且更新页面上的输入框。

14、ArcGIS Server Java讲座--用Ajax得到地图比例尺(客户端代码)

上个讲座我们讲到,服务器端已经得到了当前地图的比例尺,我们需要在客户端做一个处理,把这个比例尺数据给用户看。我们在页面上放一个文本框,用来显示比例尺数据,如下面的代码所示:

Scale

我们如何将服务器传过来的数据更新这个文本框呢?来看看前面讲座中提到的往服务器端发送请求时候的那个回调函数:

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

我们把回调函数的代码也贴在这里: function updateInfoResponse(xmlHttp) {

if (xmlHttp != null && xmlHttp.readyState == 4 && xmlHttp.status == 200) { var xml = xmlHttp.responseXML;

var scale=xml.getElementsByTagName(\ document.getElementById(\ } }

这个代码相比大家都能看明白了,先判断服务器端是不是已经处理结束,并且服务器的状态一切正常,然后得到服务器返回的xml,通过getElementsByTagName把里面包含着的比例尺数据提取出来,组合中我们熟悉的文本,然后把这个文本填充到ID为scale的文本框中。

我们来总结一下,我们发送了一个请求,这个请求包含了MapID参数,和一个标志参数ajaxdemo,MapID参数可以让服务器得到MapControl的实例和WebMap,进而得到比例尺。Ajaxdemo让服务器端的处理程序可以正确的辨识这个请求是我们这个PhaseListener需要处理的请求,处理结束后,返回XML到客户端。客户端的回调函数处理XML文档,提取出比例尺信息,写入到页面的文本框中。撩起Ajax神秘的面纱后,发现原来Ajax不过如此,老酒装新瓶,重新包装了一下。

32


二次开发(arcgis server for java)(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:苯-甲苯物系连续精馏塔的设计

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: