2009年4月21日星期二

ArcGIS Server Java ADF 案例教程 16

三 WebContext的refresh方法

提示:本小节内容是ADF内部实现机制,对ADF的使用没有影响,如没有兴趣可以跳过。

当调用WebContext的refresh方法的时候, ADF会同步WebContext中所有相关属性。比如当我改变了WebMap的视图范围,然后再调用WebContext的refresh方法,那么ADF会通知WebContext中的WebOverview等对象去同步相关信息,比如同步改变视图范围等。以上过程ADF在后台是通过Observer机制实现的。当ADF调用WebContext的refresh方法时,ADF会通知所有注册到WebContext的WebContextObserver 对象,调用其update方法。实现WebContextObserver这个接口的大概有如下这些类:AWSTocFunctionality, ExtentHistory, MapToolsTask, PrintTask, RoutingTask, SearchAttributesTask, WebMap, WebOverview, WebScaleBar。

以上对WebContext的刷新都是在服务器端。但是,当一个Command被点击以后,服务器端的更新又是怎么被输出到浏览器端的呢?下面就让我们从浏览器端开始,详细地了解一下Command的工作原理。

以下是上一节的案例中用a:command标签在JSF页面中定义了一个Command,在下面我们看一下这段标签在浏览器中相应的输出:

以下是上面的标签在浏览器中的输出:
var zoomIn = new EsriMapServerAction("zoomIn", "");
zoomIn.clientPostBack = true;
zoomIn.defaultImage = "/AgsDemo/images/tasks/maptools/zoomin.png";
zoomIn.hoverImage = "/AgsDemo/images/tasks/maptools/zoominU.png";
zoomIn.selectedImage = "/AgsDemo/images/tasks/maptools/zoominD.png";
zoomIn.isDisabled = false;
zoomIn.showLoading = true;
toolbar.addToolItem(zoomIn);


可见,一个Command对应输出的是EsriMapServerAction这个JavaScript对象,这个对象在“/WebContent/js/esri_map.js”中定义。打开EsriMapServerAction的定义你会发现,当点击这个Command的时候,ADF会提交当前页面;当然,由于我们设置了clientPostBack属性为TRUE,因此交互通过AJAX方式进行,其回调函数为EsriControls的processPostBack函数——EsriControls在“/WebContent/js/esri_core.js”中定义,它包含了所有的ADF客户端组件。

提示:以上这段这里说的很简单,其实包含很多的内容,有兴趣的话可以在这几个JavaScript脚本中仔细研究相关对象和调用关系。

ADF在服务器端会有一个PostBackPhaseListener 去监听所有的AJAX请求,有兴趣的话你可以解开“/WebContent/WEB-INF/lib/arcgis_webcontrols.jar”这个库文件,在其中的“META-INF”目录下有一个“faces-config.xml”中定义了这个PhaseListener。

AJAX请求的参数中会有一个“doPostBack”值,当一个AJAX请求发到服务器的时候,PostBackPhaseListener会监听到这个请求并找到“doPostBack”这个值从而执行后续的操作。当这些操作完成以后,PostBackPhaseListener通过AJAXUtil 的writeResponse方法输出AJAX响应到请求的浏览器。

没有评论: