Tasks框架是一個(gè)很有意思的東西。如果你對Tasks框架還沒有概念,你可以參考一下web map application那個(gè)Sample,左邊浮動(dòng)的放大工具,查詢工具都是用Tasks框架構(gòu)成。有人會問,既然已經(jīng)有了command和tools,為什么還需要tasks呢?事實(shí)上tasks的目的是不同的;我們可以看一下web map application,可以看到,相同類型的button和toos組合在一起,組成一個(gè)邏輯單元,這就是tasks的選擇條件。
我們來看看如何編寫Tasks,編寫Tasks是非常有意思的事情。Tasks跟tools一樣,也是一個(gè)普通的Java類即可,這個(gè)Java類可以從Object直接繼承。請看下面的Task的例子:



2



3

4

5

6

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

2

3

4

5

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

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

2



3

4

5



6

7

看看我們的task工具條發(fā)生了什么變化,Task工具條如下圖所示:
可以看到,多了一個(gè)Parameter的輸入框,前面還有一個(gè)Label,很有意思吧。那個(gè)DoAnything是我加的另外一個(gè)方法。Task框架的擴(kuò)展已經(jīng)很明顯了吧:把相同的功能集合在一個(gè)類里面,這個(gè)類可以接受參數(shù)。例如我們可以利用這個(gè)task進(jìn)行buffer操作,這個(gè)輸入框就可以用來輸入buffer的距離。
看到這里,大家肯定想到了另外的幾個(gè)問題,比如:怎么把這些參數(shù),按鈕的名字修改成中文,上次給人培訓(xùn),有人說:用中文的變量名?也是一個(gè)辦法,但是考慮的JDK對中文變量的處理,似乎有問題。還有其它的問題包括怎么跟地圖進(jìn)行交互?怎么樣設(shè)置客戶端的動(dòng)作(畫多邊形還是畫Polyline)。我們當(dāng)然有另外的方法。
使用Taksinfo建立對Task的描述,所有的Taskinfo都需要繼承自SimpleTaskInfo類。大家可以打開doc看看SimpleTaskInfo的子類有那些。事實(shí)上,那些子類都是已經(jīng)存在的task的taskinfo,如果你需要做漢化,繼承這些類并且改寫其中的幾個(gè)方法即可。
我們來看看我們自己的類需要改寫SimpleTaskInfo的哪幾個(gè)方法:
TaskActionDescriptorModel[]getActionDescriptors();
此方法用來修改command按鈕的描述;command的意思是不需要和地圖進(jìn)行交互而是直接在服務(wù)器端執(zhí)行一個(gè)命令。
TaskParamDescriptorModel[]getParamDescriptors()
此方法修改參數(shù)的描述;
TaskToolDescriptorModel[]getToolDescriptors();
此方法修改工具的描述,工具的意思是需要和地圖進(jìn)行交互;
那么我們來寫一個(gè)類,直接說明如何使用這幾個(gè)方法,修改task的表現(xiàn):
TaskDescriptor td=new TaskDescriptor(JSTasks.class);
td.setDisplayName("我的任務(wù)");
return td;
}
此方法修改了task的標(biāo)題,將此類作為一個(gè)Managed-bean添加到faces-config.xml文件中,并且在.jsp頁面中修改task的使用如下:
修改后的Task如下所示:
可以看到task的標(biāo)題已經(jīng)改變。下面我們來看修改Action的標(biāo)題,代碼如下:
public TaskActionDescriptorModel[]
getActionDescriptors() {
TaskActionDescriptorModel[] td=new TaskActionDescriptorModel[1];
TaskActionDescriptorModel actionDesc=new TaskActionDescriptor(JSTasks.class,"doSomething","查詢");
td[0]=actionDesc;
return td;
}
需要說明的是TaskActionDescriptor(JSTasks.class,"doSomething","查詢")構(gòu)造函數(shù)的三個(gè)參數(shù),第一個(gè)是task類,第二個(gè)是方法名,第三個(gè)是修改后的方法名;構(gòu)造后放到數(shù)組中返回即可,如果有多個(gè)方法,可以如法炮制,都放到數(shù)組中。修改后的task有如下表現(xiàn):
你會發(fā)現(xiàn)另外一個(gè)action沒有了,別著急,因?yàn)槲覀冞€沒有把它放到數(shù)組中,而原來默認(rèn)的顯示方式已經(jīng)被我們修改了。
我們來修改doAnything工具,doAnything工具需要和地圖交互,注意它的參數(shù)是MapEvent而不是TaskEvent,它完整的代碼如下所示:
//通過和地圖交互進(jìn)行放大
WebContext ctx=te.getWebContext();
WebGeometry geom=te.getWebGeometry().toMapGeometry(ctx.getWebMap());
WebExtent ext = (WebExtent)geom;
ctx.getWebMap().setCurrentExtent(ext);
ctx.refresh();
}
如果跟地圖交互,就要涉及到客戶端執(zhí)行的操作,我們這里沒有任何地方指定客戶端的操作,這是在taskinfo里面指定的,我們來看下面的代碼:
getToolDescriptors() {
TaskToolDescriptor [] toolDesAry=new
TaskToolDescriptor[1];
TaskToolDescriptor toolDesc=new
TaskToolDescriptor(JSTasks.class, "doAnything", "交互放大",ClientActions.MAP_RECTANGLE);
toolDesAry[0]=toolDesc;
return toolDesAry;
}
注意TaskToolDescriptor構(gòu)造函數(shù)的4個(gè)參數(shù),第一個(gè)是task類,第二個(gè)是原方法名,第三個(gè)是替換后的方法名,第四個(gè)是客戶端的動(dòng)作。構(gòu)造完成后放到數(shù)組中,如果有多個(gè)tools,如法炮制即可。修改后的task如下所示:
有了上面的解釋,我們來看參數(shù)的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框架的基本構(gòu)成就是這樣了,祝大家使用愉快。下節(jié)將介紹TaskResult的使用。