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的例子:



2



3

4

5

6

這個tasks實在是簡單吧,看看怎么部署上去,我們在xml文件中做如下定義:

2

3

4

5

這個配置文件也非常簡單,那么看來所有的訣竅在與如何在JSP頁面里面使用它。我們來看看:

添加一個task標簽,把這個標簽的mapId值指向地圖控件”Map0”,講它的值指向我們剛才定義的Managed Bean。訪問一下,大家看看下面的浮動窗口結果:
是不是很令人驚奇啊?事實上我們這個Bean中只有一個方法,但是Tasks框架聰明地把這個方法名給提取出來,作為button的名字。你點擊一下這個按鈕,在后臺就可以看到執行了這個方法,打印出了一條信息。簡單的說:方法就是按鈕!!
有了上個Task的基礎, 我們來看其它的Task就駕輕就熟了。事實上,整個Task就是一個類,Task的Caption就是這個類的類名。里面的每一個Public方法都是Task浮動條上的一個按鈕。那么參數怎么辦呢?我們來加一個參數,并且加上一個它的get方法和set方法:

2



3

4

5



6

7

看看我們的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的表現:
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,"doSomething","查詢");
td[0]=actionDesc;
return td;
}
需要說明的是TaskActionDescriptor(JSTasks.class,"doSomething","查詢")構造函數的三個參數,第一個是task類,第二個是方法名,第三個是修改后的方法名;構造后放到數組中返回即可,如果有多個方法,可以如法炮制,都放到數組中。修改后的task有如下表現:
你會發現另外一個action沒有了,別著急,因為我們還沒有把它放到數組中,而原來默認的顯示方式已經被我們修改了。
我們來修改doAnything工具,doAnything工具需要和地圖交互,注意它的參數是MapEvent而不是TaskEvent,它完整的代碼如下所示:
//通過和地圖交互進行放大
WebContext ctx=te.getWebContext();
WebGeometry geom=te.getWebGeometry().toMapGeometry(ctx.getWebMap());
WebExtent ext = (WebExtent)geom;
ctx.getWebMap().setCurrentExtent(ext);
ctx.refresh();
}
如果跟地圖交互,就要涉及到客戶端執行的操作,我們這里沒有任何地方指定客戶端的操作,這是在taskinfo里面指定的,我們來看下面的代碼:
getToolDescriptors() {
TaskToolDescriptor [] toolDesAry=new
TaskToolDescriptor[1];
TaskToolDescriptor toolDesc=new
TaskToolDescriptor(JSTasks.class, "doAnything", "交互放大",ClientActions.MAP_RECTANGLE);
toolDesAry[0]=toolDesc;
return toolDesAry;
}
注意TaskToolDescriptor構造函數的4個參數,第一個是task類,第二個是原方法名,第三個是替換后的方法名,第四個是客戶端的動作。構造完成后放到數組中,如果有多個tools,如法炮制即可。修改后的task如下所示:
有了上面的解釋,我們來看參數的taskinfo代碼,就非常容易了:
// TODO Auto-generated method stub
TaskParamDescriptorModel[] td=new TaskParamDescriptorModel[1];
TaskParamDescriptorModel paraDesc=new TaskParamDescriptor(SearchTask.class,"searchText","查詢文本");
td[0]=paraDesc;
return td;
}
修改后的task如下所示:
Task框架的基本構成就是這樣了,祝大家使用愉快。下節將介紹TaskResult的使用。