二    自定义一个地图放大5倍的Functionality【案例】
在这个小节,我们去实现一个GISFunctionality去封装前面实现过的使地图放大5倍的功能。
首先,当然是新建一个Functionality类并添加到ADF应用中去。前面我们经常通过直接编辑代码的方式去定义类和配置文件,这主要是为了帮助你理解ADF应用的配置和各个元素的相互关系。现在估计你也有一定了解了,我们也就尽量省事些,多使用ArcGIS的eclipse插件去完成这些工作吧。
让我们打开eclipse的菜单【ArcGIS】-【Class Templates】-【Functionality】,在新建的窗口上填上我们希望实现的Functionality的包名、类名、实例化 Managed Bean的名称、注册到的Resource等,完成以后ADF会自动新建一个实现GISFunctionality接口的类,并把这个类实例化后注册到 ADF应用的配置文件中去。

arcgis用java编写插件 arcgis java开发_eclipse插件

图 26    通过ArcGIS的IDE插件添加自定义Functionality

下面我们需要对新生成的这个Functionality类进行编码以实现自己的功能:

public class Zoom5Functionality implements GISFunctionality
 {
     private GISResource resource;
     public void zoomIn5()
     {
         WebContext webContext = resource.getWebContext();
         webContext.getWebMap().getCurrentExtent().expand(0.2);
         webContext.refresh();
     }
     public void zoomOut5()
     {
         WebContext webContext = resource.getWebContext();
         webContext.getWebMap().getCurrentExtent().expand(5);
         webContext.refresh();
     }
     public void initFunctionality(GISResource resource){this.resource = resource;    }
     public void destroyFunctionality()    {}
     public GISResource getResource()    {return this.resource;}
 }


这样,这个Zoom5Functionality就具有了两个功能:zoomIn5和zoomOut5,分别对应了放大地图5倍和缩小地图5倍。接下来就让我们在页面上放一个Command去调用Zoom5Functionality的zoomIn5功能:

defaultImage="images/tasks/maptools/zoomin.png"
            hoverImage="images/tasks/maptools/zoominU.png"
            selectedImage="images/tasks/maptools/zoominD.png"
            clientPostBack="true" >


   

当然,服务器上还需要一个监听器去处理这个Command的请求,并实际去调用Zoom5Functionality的方法:

public class ZoomInListener implements ActionListener
 {
     public void processAction(ActionEvent event) throws AbortProcessingException
     {
         WebContext webContext = WebUtil.getWebContext(event.getComponent());
         GISResource resource = webContext.getResourceById("agswsWorld");
         Zoom5Functionality functionality = 
 (Zoom5Functionality)resource.getFunctionality("zoom5Functionality");
         functionality.zoomIn5();
     }
 }


或许你会觉得这样做有点多此一举,简单的功能干嘛要做一个Functionality来封装一下呢——当然了,这主要是因为这里演示的这个功能实在是太简单了。如果你有复杂的逻辑需要封装,而且还想灵活地配置某些资源需要这个功能,某些资源则不需要,那么Functionality就可以帮你大忙了。
这里还需要特别提一下的就是GISFunctionality的initFunctionality方法,这个方法在Functionality被初始化的时候调用,这个时候其实还可以对GISResource作一些操作,比如根据权限验证来选择需要显示的图层等等。