看看我们的task工具条发生了什么变化,Task工具条如下图所示:
可以看到,多了一个Parameter的输入框,前面还有一个Label,很有意思吧。那个DoAnything是我加的另外一个方法。Task框架的扩展已经很明显了吧:把相同的功能集合在一个类里面,这个类可以接受参数。例如我们可以利用这个task进行buffer操作,这个输入框就可以用来输入buffer的距离。
看到这里,大家肯定想到了另外的几个问题,比如:怎么把这些参数,按钮的名字修改成中文,上次给人培训,有人说:用中文的变量名?也是一个办法,但是考虑的JDK对中文变量的处理,似乎有问题。还有其它的问题包括怎么跟地图进行交互?怎么样设置客户端的动作(画多边形还是画Polyline)。我们当然有另外的方法。
使用Taksinfo建立对Task的描述,所有的Taskinfo都需要继承自SimpleTaskInfo类。大家可以打开doc看看SimpleTaskInfo的子类有那些。事实上,那些子类都是已经存在的task的taskinfo,如果你需要做汉化,继承这些类并且改写其中的几个方法即可。
我们来看看我们自己的类需要改写SimpleTaskInfo的哪几个方法: TaskActionDescriptorModel[]getActionDescriptors();
此方法用来修改command按钮的描述;command的意思是不需要和地图进行交互而是直接在服务器端执行一个命令。
TaskParamDescriptorModel[]getParamDescriptors()
此方法修改参数的描述;
TaskToolDescriptorModel[]getToolDescriptors();
此方法修改工具的描述,工具的意思是需要和地图进行交互;
那么我们来写一个类,直接说明如何使用这几个方法,修改task的表现:
44
public TaskDescriptor getTaskDescriptor() {
TaskDescriptor td=new TaskDescriptor(JSTasks.class);
td.setDisplayName(\我的任务\
return td; }
此方法修改了task的标题,将此类作为一个Managed-bean添加到faces-config.xml文件中,并且在.jsp页面中修改task的使用如下:
修改后的Task如下所示:
可以看到task的标题已经改变。下面我们来看修改Action的标题,代码如下:
public TaskActionDescriptorModel[]
getActionDescriptors() {
TaskActionDescriptorModel[] td=new TaskActionDescriptorModel[1];
TaskActionDescriptorModel actionDesc=new TaskActionDescriptor(JSTasks.class,\查询\
td[0]=actionDesc;
return td;
45
}
需要说明的是TaskActionDescriptor(JSTasks.class,\查询\构造函数的三个参数,第一个是task类,第二个是方法名,第三个是修改后的方法名;构造后放到数组中返回即可,如果有多个方法,可以如法炮制,都放到数组中。修改后的task有如下表现:
你会发现另外一个action没有了,别着急,因为我们还没有把它放到数组中,而原来默认的显示方式已经被我们修改了。
我们来修改doAnything工具,doAnything工具需要和地图交互,注意它的参数是MapEvent而不是TaskEvent,它完整的代码如下所示:
public void doAnything(MapEvent te){
//通过和地图交互进行放大
WebContext ctx=te.getWebContext();
WebGeometry geom=te.getWebGeometry().toMapGeometry(ctx.getWebMap());
WebExtent ext = (WebExtent)geom;
ctx.getWebMap().setCurrentExtent(ext);
ctx.refresh(); }
如果跟地图交互,就要涉及到客户端执行的操作,我们这里没有任何地方指定客户端的操作,这是在taskinfo里面指定的,我们来看下面的代码:
46
public TaskToolDescriptorModel[]
getToolDescriptors() {
TaskToolDescriptor [] toolDesAry=new
TaskToolDescriptor[1];
TaskToolDescriptor toolDesc=new
TaskToolDescriptor(JSTasks.class, \交互放大\
toolDesAry[0]=toolDesc;
return toolDesAry; }
注意TaskToolDescriptor构造函数的4个参数,第一个是task类,第二个是原方法名,第三个是替换后的方法名,第四个是客户端的动作。构造完成后放到数组中,如果有多个tools,如法炮制即可。修改后的task如下所示:
有了上面的解释,我们来看参数的taskinfo代码,就非常容易了:
public TaskParamDescriptorModel[] getParamDescriptors() {
// TODO Auto-generated method stub
TaskParamDescriptorModel[] td=new TaskParamDescriptorModel[1];
TaskParamDescriptorModel paraDesc=new TaskParamDescriptor(SearchTask.class,\查询文本\
47
td[0]=paraDesc;
return td; }
修改后的task如下所示:
Task框架的基本构成就是这样了,祝大家使用愉快。下节将介绍TaskResult的使用。
18、ArcGIS Server Java讲座--自定义Tools开发
今天进行整理,发现自定义tools的教程忘记写了。今天把这个补全吧。
什么是tools,tools就是工具,它跟command的区别就是tools是要跟地图进行交互后再执行某个命令,而command是直接执行某个命令。最简单的tools和command的对比是放大是一个工具,而全图显示就是一个命令。
ESRI已经包含的工具包括:放大(zoom in),缩小(zoom out),平移(Pan)。
前面我们都是先说服务器端的处理代码,现在先来看看客户端的处理。跟地图交互,就会产生怎么交互的问题。拉框放大的时候是在地图上画的是一个长方形,测距的时候在地图上画的是一条线。如何控制这些客户端的功能呢?
查看com.esri.adf.web.faces.event.MapEvnet的帮助,里面详细说明了如何把客户端的操作如何和服务器端的代码建立联系。已有的客户端支持的操作包括: EsriMapCircle EsriMapContinuousPan EsriMapLine
48