ADF Callback体系结构
Web ADF(Application Develop Framework)是ArcGIS专用Web程序开发框架,分.NET和Java两个开发环境版本。ADF为Web程序引进功能丰富GIS功能,其一系列定制组件及控件实现了Web程序中的GIS开发。开发者不仅可以使用模板程序轻易实现基本地图操作功能,如显示地图比例尺、缩放等,同时也可在开发环境下用设计器定制Web程序。
Asp.Net 2.0中, 客户端是通过回调管理器提供了一个扩展框架来实现回调,在Asp.Net 2.0 Callback基础上,ArcGIS Server提出了ADF Callback框架,实现了对包含有ADF组件页面的异步数据调用和局部无刷新显示,ADF Callback框架主要内容包括:
1 ADF JavaScript 函数库
Asp.net 2.0回调事件中,服务器处理完成并返回浏览器,JavaScript解析返回值并利用浏览器内嵌技术(DOM、DHTML)动态更新页面。为支持ADF组件的异步局部刷新,ADF Callback框架提供了庞大的客户端JavaScript 函数库,JavaScript 函数库包括众多JS文件。 ADF组件在服务器预先封装JavaScript 函数库方法,系统运行时,客户端初始化加载页面,JavaScript代码以工作流方式嵌入到浏览器,一旦用户发生触发操作, JavaScript代码将生成XmlHttpRequest对象与服务器异步通信,响应返回时JavaScript代码解析字符串并调用方法动态更新页面。
2 工具栏控件
工具栏控件是ADF Callback框架中服务器与客户端交互的接口,工具栏控件通过已有或定制工具及命令定义不同的客户端操作,工具栏控件运行时必须与地图控件数据绑定,因此任何客户端操作都是针对地图控件发生。
在Web ADF Callback框架中,工具栏控件内部封装Callback机制。在Web开发中,客户端通过工具条与页面其他ADF控件交互操作,在客户端操作产生回调事件,服务器接收回调并执行自定义类,在自定义类中访问GIS资源将结果返回客户端页面。值得注意的是,如果要实现回调功能,在自定义类中应根据工具类型继承其相应接口(表1)。
表1 工具栏控件继承接口
工具类型 |
继承接口 |
描述 |
Tool |
IMapServerToolAction |
必须由客户端操作激活并在服务器端初始化后才能与地图控件进行交互 |
Command
|
IMapServerCommandAction |
客户端点击后产生服务器端操作 |
DropDownBox |
IMapServerDropDownBoxAction |
必须由客户端选择操作后产生操作 |
3 ADF组件回调
Web ADF Callback框架中大部分Web ADF 组件封装实现了ICallbackEventHandler接口, ADF组件能处理客户端回调请求并返回处理响应。Web ADF组件内容在服务器修改后,修改信息存储在CallbackResults属性并产生一个回调响应返回客户端。
一般而言, ADF Callback框架客户端触发如果由工具栏控件产生,其产生的回调能自动发送回客户端。但当普通Asp.net控件触发并在返回浏览器时需要动态更新客户端ADF组件时,此时就必须从服务器端ADF组件CallbackResults属性中获取其响应信息,并将其返回客户端。
4 Callback相关类
CallbackResults存储当前服务器回调信息,ADF组件CallbackResults属性返回集合类CallbackResultCollection,此集合类也包含自定义CallbackResults对象, 自定义CallbackResults对象可与页面其他组件(如:HTML表格,GridView, 图像, 文字)进行交互。这样做的最大好处在于到服务器响应字符串返回浏览器后,可以利用ADF JavaScript脚本库进行解析,而无须编写特定JavaScript代码。页面普通Asp.net刷新控件可通过客户端回调管理器的WebForm_DoCallback()函数参数定义,也可通过服务器端参数“_CALLBACKID”获取。
if (Page.IsCallback)
{
string control_id = Request.Params["__CALLBACKID"];
Control control = Page.FindControl(control_id);
}
5 回调事件参数
ADF Callback框架中刷新ADF组件或者普通Asp.NET控件时,为存储回调信息须构建CallBackResult对象,同时通过事件参数的选择确定客户更新内容(表2),其构造函数为:
CallbackResult(string controlType, string controlID, string eventArg, object[] parameters)
表2 工具栏控件继承接口
事件参数 |
描述 |
"content" |
设置HTML元素的outerHTML属性,HTML元素通过CallbackResult方法的ControlType以及controlID来定义 |
"innercontent" |
设置HTML元素的innerHTML属性 |
"image" |
设置图像元素的Src属性 |
"javascript" |
执行客户端的javascript函数 |
从表2可以看出,返回到客户端的字符串既可以用来刷新页面元素来控制界面内容和布局,同时也可以执行JavaScript函数。
ADF Callback 运行机制
Web ADF Callback框架中在客户端既可选择工具条等ADF组件,也可选择普通Asp.net控件进行回调响应请求发送,两种发送方式原理内部统一于Asp.Net Callback机制。
客户端页面加载初始化后,浏览器一旦触发回调事件,脚本函数负责处理回调信息及相关的上下文,并调用Asp.NET 2.0中 WebForm_DoCallback 函数将回调请求返回服务器,其实质上就是利用Microsoft.XMLHTTP 组件创建一个新的HttpRequest对象,并将客户端请求异步发送回服务器,其格式如下:
WebForm_DoCallback('Map1',argument,processCallbackResult,context,postBackError,false)
客户端回调请求到达后,服务器初始化并调用继承ICallbackEventHandler接口的ADF组件或者Page的RaiseCallbackEvent() 方法获取回调请求字符串后,定义RaiseCallbackEvent()方法处理回调请求,不同组件处理结果分别存入CallbackResults对象,处理结果由GetCallbackResult()返回。
ADF Callback框架中提供processCallbackResult方法处理返回客户端的回调响应,在回调响应返回客户端后,processCallbackResult函数根据事件参数解析客户端回调响应字符串并调用其他ADF Javascript函数库的其他方法解析DOM元素并更新页面。
图1 ADF Callback 运行机制原理