今天我们来讲讲如何自定义Functionality,自定义Functionality有很多用处。它最大的用处是可以访问数据源。我们来看看已经存在的Functionality:
AGSMapFunctionality, AIMSMapFunctionality, AWSMapFunctionality, EJBMapFunctionality, WMSMapFunctionality等等等等,查看GISFunctionality接口的子类你可以看到ADF中更多的Functionality。
这些Functionality无一不跟后台的资源有关。我们来看看Functionality接口的定义:
每个functionality都需要实现Functionality这个接口,这个接口里面有三个方法,初始化方法,destroy方法和得到资源的方法。GISResource对应于一个特定的资源,比如我们最常用的资源就是AGSLocalMapResource,当然也可以是ArcIMS的Resource,取决于你把这个functionality注册到哪个Resource中。我们来看一个例子,虽然Functionality一般跟资源有关,但是也可以做其它的事情,比如我们这里举一个非常简单的例子,FixedZoomin:
非常简单的一个例子,从GISResource里面得到WebContext,然后得到WebMap,修改WebMap的Extent,放大功能就实现了。你说非得跟资源有关系,那么确实也有点关系,因为我们还是使用了后台的数据来进行操作。需要说明的是,我们这个代码对于所有的Resource都是适用的,不管你后台使用了ArcIMS,还是其它的Resource。ADF的妙处也在这里。
写好了这个Funcionality,那么我们来看看如何部署的,每一个Functionality都需要部署到某个Resource中,那么我来看一下,这个functionality如何来部署:
部署完成了,如何使用呢?随便在你的一个tools里面,或者task的运行代码里面,添加下面的代码:
就可以了。这只是一个简单的例子,而且是绕了一个远的例子。大家可以发掘一下Functionlity的使用方法。在下一次讲座中,我们将详细解释一个对Resource进行操作的例子。
AGSMapFunctionality, AIMSMapFunctionality, AWSMapFunctionality, EJBMapFunctionality, WMSMapFunctionality等等等等,查看GISFunctionality接口的子类你可以看到ADF中更多的Functionality。
这些Functionality无一不跟后台的资源有关。我们来看看Functionality接口的定义:
public void initFunctionality(GISResource arg0) {} public void destroyFunctionality() {} public GISResource getResource() { return null; }
每个functionality都需要实现Functionality这个接口,这个接口里面有三个方法,初始化方法,destroy方法和得到资源的方法。GISResource对应于一个特定的资源,比如我们最常用的资源就是AGSLocalMapResource,当然也可以是ArcIMS的Resource,取决于你把这个functionality注册到哪个Resource中。我们来看一个例子,虽然Functionality一般跟资源有关,但是也可以做其它的事情,比如我们这里举一个非常简单的例子,FixedZoomin:
public class DemoFunction implements GISFunctionality { WebContext ctx; public void zoomInFunction(){ WebMap wmap = ctx.getWebMap(); WebExtent ext = wmap.getCurrentExtent(); ext.expand(0.5); wmap.setCurrentExtent(ext); ctx.refresh(); } public void initFunctionality(GISResource arg0) { ctx=arg0.getWebContext(); System.out.print("Demo Function inited"); } public void destroyFunctionality() { System.out.print("Demo Function destroyed"); } public GISResource getResource() { return null; } }
非常简单的一个例子,从GISResource里面得到WebContext,然后得到WebMap,修改WebMap的Extent,放大功能就实现了。你说非得跟资源有关系,那么确实也有点关系,因为我们还是使用了后台的数据来进行操作。需要说明的是,我们这个代码对于所有的Resource都是适用的,不管你后台使用了ArcIMS,还是其它的Resource。ADF的妙处也在这里。
写好了这个Funcionality,那么我们来看看如何部署的,每一个Functionality都需要部署到某个Resource中,那么我来看一下,这个functionality如何来部署:
<managed-bean> <managed-bean-name>ags1</managed-bean-name> <managed-bean-class>com.esri.adf.web.ags.data.AGSLocalMapResource</managed-bean-class> <managed-bean-scope>none</managed-bean-scope> <managed-property> <property-name>functionalities</property-name> <map-entries> <!--……略去其它的functionality-> <map-entry> <key>demoFunction</key> <value>#{demoFunction}</value> </map-entry> </map-entries> </managed-property> </managed-bean>
部署完成了,如何使用呢?随便在你的一个tools里面,或者task的运行代码里面,添加下面的代码:
GISResource rec=(GISResource)evt.getWebContext().getResources().get("ags1"); DemoFunction df=(DemoFunction)rec.getFunctionality("demoFunction"); df.zoomInFunction();
就可以了。这只是一个简单的例子,而且是绕了一个远的例子。大家可以发掘一下Functionlity的使用方法。在下一次讲座中,我们将详细解释一个对Resource进行操作的例子。