Java ADF開發入門-添加命令和工具

添加命令和工具

繼前一講的ADF工程,那裏只有兩個工具“放大”和“縮小”以及一個命令“放大到全部”。你可以添加更多的工具和命令到你的Web ADF應用
中,本文介紹如何添加欲定義的工具或命令和自定義的工具和命令。

添加一個命令: 命令是一個觸發服務端動作而不需要進一步地客戶端交互地JSP頁面元素。命令的一個例子是"放大到全部" 按鈕。用戶一點擊該按鈕,服務端就執行一個方法。工具在執行一個服務端方法前需要進一步的客戶端交互。

Web ADF提供瞭如下的標準命令:
Zoom to full extent
Zoom to previous extent
Zoom to next extent
Directional pan
Tools

像下面的例子,一個"右移"的命令將添加到應用中顯示瞭如何將添加預定義的命令到Web ADF應用中。"右移"命令允許用戶右移地圖當用戶點擊該按鈕時。

添加命令的步驟:

  • 在JSP頁面中添加<a:command>標籤
  • 爲該命令指定"actionListener"
  • 設置該命令標籤的屬性

  
這裏是一個添加向右移動的例子:

<a:command>
    <f:actionListener type="com.esri.adf.web.faces.event.DirectionalPanListener"/>
    <f:attribute name="contextId" value="mapContext" />
    <f:attribute name="direction" value="right" />
</a:command>
   
對於"右移"命令,你必須設置"contextId"和"direction"屬性並且指定actionListener爲"com.esri.adf.web.faces.event.DirectionalPanListener"。其他屬性如圖片等如果必要也可以加以設置。

添加工具:工具在執行一個服務端方法前需要進一步的客戶端交互。工具的一個例子是"框選放大"。用戶點擊按鈕,還要在地圖上拖拽一個方框表示欲放大的區域,然後服務端的方法才執行。地圖和工具的交互是工具欄必須指定它的關聯地圖的原因。
工具的clientAction屬性指定哪一種客戶端腳本被執行。clientAction屬性可以取以下的值:
EsriMapCircle
EsriMapContinuousPan
EsriMapLine
EsriMapOval
EsriMapPan
EsriMapPoint
EsriMapPolygon
EsriMapPolyline
EsriMapRectangle

調用的服務端方法可以用serverAction或serverMethod屬性指定。serverAction屬性需要一個實現com.esri.web.adf.faces.event.MapToolAction接口的Java類的全名。serverMethod屬性需要一個綁定接受com.esri.adf.web.faces.event.MapEvent 參數的方法。服務器端的方法用clientPostBack屬性設置異步地或者同步地調用。

Web ADF提供了以下標準地工具:
Zoom in
Zoom out
Pan

作爲一個例子,一個"移動"工具將加到應用中顯示瞭如何將添加預定義的工具到Web ADF應用中。"移動"命令允許用戶移動地圖當用戶拖拽地圖時。

添加工具的步驟:

  • 在頁面添加<a:tool>標籤
  • 指定"clientAction"和"serverAction"屬性
  • 設置工具的其他屬性

這裏是一個添加移動工具的例子:

<a:tool id="pan" defaultImage="images/pan.gif" hoverImage="images/panU.gif"
        selectedImage="images/panD.gif" clientAction="EsriMapPan"
        serverAction="com.esri.adf.web.faces.event.PanToolAction" clientPostBack="true"/>
   
在這個例子中"id"屬性是工具的id,"*Image" 屬性指定了工具按鈕的不同狀態的圖片。"clientAction" 指定了當用戶點擊工具按鈕的客戶端
動作,"serverAction"指定了客戶端動作結束後服務器端的動作。最後,"clientPostBack"指定了在這個工具操作中AJAX是否支持。

現在你應該基本瞭解了Web ADF應用,各個組件如何結合在一起工作,怎麼渲染客戶端,你可以繼續擴展這基本框架,創建自定義的命令和工具。

寫自定義命令和工具

這一節將寫一個自定義的命令和自定義的工具。自定義的命令將計算一個圖層的所有可見的要素個數。 自定義的工具將計算一個圖層上框選範圍內的所有要素個數。

實現Java類

你必須創建一個實現計算要素邏輯的FeatureCounter類。這個類將使用ArcGIS Server API來計算要素個數,所以它需要一個指向WebContext的引用來取得這個API 。添加一個屬性context來保存這個引用,並且添加爲它添加getter/setter方法。你待會兒將看到如何初始化這個屬性。同樣添加一個屬性countedFeatures來保存要素個數,並且爲它添加getter/setter方法。

這裏是這個類剛開始的樣子:

package com.mypackage;
public class FeatureCounter {
   private WebContext context;
   public WebContext getContext() {return context;}
   public void setContext(WebContext context) {this.context = context;}
   private int countedFeatures;
   public int getCountedFeatures() {return countedFeatures};
   public void setCountedFeatures(int count) {this.countedFeatures = count;}
}

接下來,添加一個私有方法countFeatures(),接受一個類型爲com.esri.adf.web.data.WebContext的參數,該方法將做計算一個範圍之內的所有要素的工作,然後把結果存儲在屬性countedFeatures裏。
private void countFeatures(WebExtent extent){
   //Get the MapServerPort so we can execute methods through ArcGIS Server API
   AGSMapResource agsMap = ((AGSMapResource)context.getResources().get("ags1"));
   MapServerPort mapServer = agsMap.getMapServer();
   //Make a new envelope from the web extent
   EnvelopeN env = new EnvelopeN(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY(),
     null, null, null, null, null);
   //Setup a spatial filter for an Intersection relationship
   SpatialFilter spatialFilter = new SpatialFilter();
   spatialFilter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);
   spatialFilter.setWhereClause("");
   spatialFilter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);
   spatialFilter.setSpatialRelDescription("");
   spatialFilter.setGeometryFieldName("");
   //Set the envelope as the geometry
   spatialFilter.setFilterGeometry(env);
   //MapServer::queryFeatureCount() executes on the server and can throw a RemoteException
   try{
     //Count features in 4th layer which intersect with the envelope
     int layerId = 3;
     this.countedFeatures =
       mapServer.queryFeatureCount(mapServer.getDefaultMapName(), layerId, spatialFilter);
   }catch(RemoteException rme){
     //Rethrow this as ADFAGSException so that it can participate in the exception framework
     throw new ADFAGSException("Could not execute MapServer::queryFeatureCount()",rme);
   }
}

現在我們已經有了業務邏輯,你需要添加命令和工具調用的方法。先添加命令的方法,創建一個方法countFeaturesInFullExtent(),不接受任何參數,用代表全範圍的WebExtent參數調用countFeatures()。:
public String countFeaturesInFullExtent(){
   //Get the full extent
   WebExtent fullExtent  = context.getWebMap().getFullExtent()
   //Delegate to countFeatures()
   this.countFeatures(fullExtent);
   //Don't want to navigate to another page
   return null;
}

然後,添加工具方法,添加一個方法countFeaturesInRectangle(), 接受一個類型爲 com.esri.adf.web.faces.event.MapEvent的參數,然後用代表用戶選擇範圍的WebExtent參數調用countFeatures():
public int countFeaturesInRectange(MapEvent event){
   //Get the chosen extent
   WebMap webMap = context.getWebMap();
   WebExtent chosenExent = (WebExtent) event.getWebGeometry().toMapGeometry(webMap);
   //Delegate to countFeatures()
   this.countFeatures(chosenExent);
   //Don't want to navigate to another page
   return null;
}

聲明這個Java類作爲一個managed-bean。你需要在WEB-INF/faces-config.xml聲明FeatureCounter作爲managed-bean並且用一個WebContext初始化context屬性。
<managed-bean>
   <managed-bean-name>featureCounter</managed-bean-name>
   <managed-bean-class>com.mypackage.FeatureCounter</managed-bean-class>
   <managed-bean-scope>request</managed-bean-scope>
   <managed-property>
    <property-name>webContext</property-name>
    <value>#{mapContext}</value>
   </managed-property>
</managed-bean>

在JSP頁面添加命令和工具

工具標籤必須指定"EsriMapRectangle"作爲clientAction屬性。這允許用戶在地圖上畫一個方框,該方框被作爲MapEvent參數傳遞給
serverMethod指定的方法:
<a:toolbar id="Toolbar" mapId="Map0" ... >
   ...
   <a:tool id="countFeatures1" clientAction="EsriMapRectangle" serverMethod="#
{featureCounter.countFeaturesInRectangle}" toolText="Count Features in Extent"/>
   <a:command id="countFeatures2" action="#{featureCounter.countFeaturesInFullExtent}" toolText="Count All Features"
/>
   ...
</a:toolbar>
....
Feature Count = <hutputText value="#{featureCounter.countedFeatures}" rendered="#{featureCounter.countedFeatures >
0}"/>

小結

添加自定義命令或工具的步驟:

1. 創建一個類,添加業務邏輯
2. 聲明這個類作爲一個managed-bean
3. 添加命令和工具標籤到JSP頁面中,並綁定managed-bean適當的方法 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章