//Logic to remove a layer and all its descendants
private MapLayerInfo[] removeLayer(MapLayerInfo unwantedLayerInfo, MapLayerInfo[] oldLayerInfos) {
//新建一个MapLayerInfo
MapLayerInfo[] newLayerInfos = new MapLayerInfo[oldLayerInfos.length-1]; ArrayList descendantLayers = new ArrayList(); for(int i=0,j=0;i if(oldLayerInfos.getLayerID()!=unwantedLayerInfo.getLayerID()) newLayerInfos[j++] = oldLayerInfos; if(oldLayerInfos.getParentLayerID()==unwantedLayerInfo.getLayerID()) descendantLayers.add(oldLayerInfos); } for(int i=0;i newLayerInfos = removeLayer((MapLayerInfo)descendantLayers.get(i),newLayerInfos); } return newLayerInfos; } 我们注意到这是一个递归函数,用于把该层下面所有的其它附属层都删除: 这个functionality写完了,我们来看看如何部署,部署的时候,先把它作为一个Managed Bean部署,用下面可代码即可,可以在faces-config.xml文件里面,也可以在ags-functionality.xml里面: 将它作为一个managedBean部署后,下面就把它部署到resource中,注意部署的时候,要将其部署到map之后,toc之前,因为ADF初始化是按顺序初始化,我们的权限控制需要从Map中读出层的信息,然后修改MapDesc,从而影响TOC的信息,所以,进行如下的部署配置: 39 com.esri.adf.web.ags.data.AGSLocalMapResource 40 OK,这个安全控制的functionality已经完成了。但是我们要对整个WebApplication加上安全控制,需要在web.xml做修改,添加如下的配置: DIGEST //声明什么资源将收到安全控制,这里我们把整个目录都控制,当然你也可以控制胆敢目录 41 这两个组在什么地方定义呢?如果是Tomcat,我们可以在$TOMCAT_HOME/conf/tomcat-users.xml中定义,定义如下: 这样我们就控制了整个Web Application,并且对于不同的用户组,赋予了不同的层的查看权限。每次用户访问这个网站的时候,都会被提示要求输入用户名和密码,按照我们在Tomcat-users里面的定义进行输入即可。 还有用户会问道,如果我希望对属性字段的编辑进行控制怎么办;事实上原理是类似的,你让用户修改属性字段时,肯定要传输一个字段列表,你可以根据不同的用户组,对这个字段列表进行控制。 另外,这里我们用了WEB容器的用户和权限进行控制,事实上你不必依赖于Web容器,你可以在数据库中存放你自己定义的用户名和组,进行控制。 权限控制简单的讲就是这样子,.net里面也类似,有机会的话,我会写一个.net版本的给大家看看。 注:本讲座内容参考了并翻译了ESRI的JAVA帮助的部分内容。 17、Server Java讲座-----扩展Tasks框架 Tasks框架是一个很有意思的东西。如果你对Tasks框架还没有概念,你可以参考一下web map application那个Sample,左边浮动的放大工具,查询工具都是用Tasks框架构成。有人会问,既然已经有了command和tools,为什么还需要tasks呢?事实上tasks的目的是不同的;我们可以看一下web map application,可以看到,相同类型的button和toos组合在一起,组成一个逻辑单元,这就是tasks的选择条件。 我们来看看如何编写Tasks,编写Tasks是非常有意思的事情。Tasks跟tools一样,也是一个普通的Java类即可,这个Java类可以从Object直接继承。请看下面的Task的例子: 1public class JSTasks { public void doSomething(){ System.out.println(\ } 42 2345 6} 这个tasks实在是简单吧,看看怎么部署上去,我们在xml文件中做如下定义: 1 2345 这个配置文件也非常简单,那么看来所有的诀窍在与如何在JSP页面里面使用它。我们来看看: 1 添加一个task标签,把这个标签的mapId值指向地图控件”Map0”,讲它的值指向我们刚才定义的Managed Bean。访问一下,大家看看下面的浮动窗口结果: 是不是很令人惊奇啊?事实上我们这个Bean中只有一个方法,但是Tasks框架聪明地把这个方法名给提取出来,作为button的名字。你点击一下这个按钮,在后台就可以看到执行了这个方法,打印出了一条信息。简单的说:方法就是按钮!! 有了上个Task的基础, 我们来看其它的Task就驾轻就熟了。事实上,整个Task就是一个类,Task的Caption就是这个类的类名。里面的每一个Public方法都是Task浮动条上的一个按钮。那么参数怎么办呢?我们来加一个参数,并且加上一个它的get方法和set方法: 1String parameter; public String getParameter() { return parameter; } public void setParameter(String parameter) { this.parameter = parameter; } 234567 43