隨筆-18  評論-20  文章-0  trackbacks-0



          Tasks框架是一個(gè)很有意思的東西。如果你對Tasks框架還沒有概念,你可以參考一下web map application那個(gè)Sample,左邊浮動(dòng)的放大工具,查詢工具都是用Tasks框架構(gòu)成。有人會問,既然已經(jīng)有了commandtools,為什么還需要tasks呢?事實(shí)上tasks的目的是不同的;我們可以看一下web map application,可以看到,相同類型的buttontoos組合在一起,組成一個(gè)邏輯單元,這就是tasks的選擇條件。

          我們來看看如何編寫Tasks,編寫Tasks是非常有意思的事情。Taskstools一樣,也是一個(gè)普通的Java類即可,這個(gè)Java類可以從Object直接繼承。請看下面的Task的例子:


           

          1public class JSTasks {
          2public void doSomething(){
          3System.out.println("Task button clicked.");
          4                                  
          5}

          6}

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


           

          1 <managed-bean>
          2        <managed-bean-name>jsTask</managed-bean-name>
          3        <managed-bean-class>com.cj.ucdemo.JSTasks</managed-bean-class>
          4        <managed-bean-scope>session</managed-bean-scope>
          5  </managed-bean>

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

           

          1<a:task mapId="Map0" value="#{jsTask}"   rendered="true" />


          添加一個(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方法:

           

          1String parameter;
          2public String getParameter() {
          3return parameter;
          4}

          5public void setParameter(String parameter) {
          6this.parameter = parameter;
          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):

          public TaskDescriptor getTaskDescriptor() {

          TaskDescriptor td=new TaskDescriptor(JSTasks.class);

          td.setDisplayName("我的任務(wù)");

          return td;

          }


          此方法修改了task的標(biāo)題,將此類作為一個(gè)Managed-bean添加到faces-config.xml文件中,并且在.jsp頁面中修改task的使用如下:

          <a:task mapId="Map0"  value="#{jsTask}" rendered="true" taskInfo="#{jsTaskInfo}"/>


          修改后的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,它完整的代碼如下所示:

          public void doAnything(MapEvent te){

          //通過和地圖交互進(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里面指定的,我們來看下面的代碼:

          public TaskToolDescriptorModel[]

          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代碼,就非常容易了:

          public TaskParamDescriptorModel[] getParamDescriptors() {

          // 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的使用。

           

          posted on 2007-08-16 11:01 JavaPoint 閱讀(1928) 評論(8)  編輯  收藏 所屬分類: ArcGis

          評論:
          # re: Server Java講座-----擴(kuò)展Tasks框架 2007-10-11 16:05 | ss
          期待TaskResult的介紹說明哈 呵呵  回復(fù)  更多評論
            
          # re: Server Java講座-----擴(kuò)展Tasks框架 2007-10-16 16:41 | anty
          TaskResult??  回復(fù)  更多評論
            
          # re: Server Java講座-----擴(kuò)展Tasks框架[未登錄] 2007-10-18 13:56 | dd
          用模板生成的,會有tasks,Results,Result details ……   回復(fù)  更多評論
            
          # re: Server Java講座-----擴(kuò)展Tasks框架[未登錄] 2007-11-13 14:03 | tree
          不錯(cuò),很好!~我是剛學(xué)arcgis server java web adf開發(fā)的,請你講解下arcgis標(biāo)簽屬性的意思,好嗎?有關(guān)于這方面的書籍嗎?介紹下!~  回復(fù)  更多評論
            
          # re: Server Java講座-----擴(kuò)展Tasks框架 2007-11-30 11:58 | 一個(gè)問題
          為什么button這個(gè)按鈕出不來,可是輸入框已經(jīng)出來了,是不是還有什么地方要設(shè)置?  回復(fù)  更多評論
            
          # re: Server Java講座-----擴(kuò)展Tasks框架[未登錄] 2007-12-12 10:16 | bright
          講的比看英文爽多了,很簡潔,又清晰,呵呵,期待更多的好文章  回復(fù)  更多評論
            
          # re: Server Java講座-----擴(kuò)展Tasks框架[未登錄] 2007-12-12 10:31 | bright
          請問,關(guān)于參數(shù)的taskinfo代碼
          public TaskParamDescriptorModel[] getParamDescriptors() {

          // TODO Auto-generated method stub

          TaskParamDescriptorModel[] td=new TaskParamDescriptorModel[1];

          TaskParamDescriptorModel paraDesc=new TaskParamDescriptor(SearchTask.class,"searchText","查詢文本");

          td[0]=paraDesc;

          return td;

          }

          為什么是SearchTask.class?這個(gè)參數(shù)parameter不是
          JSTasks類中的嗎?TaskParamDescriptorModel paraDesc=new TaskParamDescriptor(SearchTask.class,"searchText","查詢文本");是不應(yīng)該是TaskParamDescriptorModel paraDesc=new TaskParamDescriptor(JSTasks.class,"parameter","查詢文本");  回復(fù)  更多評論
            
          # re: Server Java講座-----擴(kuò)展Tasks框架[未登錄] 2008-06-25 15:41 | terry
          哥們,你寫的對不?我怎么按你寫的,只能出來dosomething,并且也不能變成中文,,,  回復(fù)  更多評論
            
          主站蜘蛛池模板: 南木林县| 托克逊县| 鹤岗市| 永仁县| 吉林市| 铁岭市| 察哈| 万盛区| 康保县| 西峡县| 泸西县| 黑山县| 宜春市| 安塞县| 淳安县| 沁阳市| 富民县| 杭锦后旗| 新和县| 离岛区| 观塘区| 石渠县| 尼玛县| 长宁县| 宜城市| 德化县| 闽清县| 英吉沙县| 柳江县| 昌邑市| 永和县| 达州市| 盐山县| 永兴县| 舒兰市| 昌邑市| 鹤庆县| 高台县| 衡水市| 闽清县| 枣庄市|