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 = <h utputText value="#{featureCounter.countedFeatures}" rendered="#{featureCounter.countedFeatures >
0}"/>

小结

添加自定义命令或工具的步骤:

1. 创建一个类,添加业务逻辑
2. 声明这个类作为一个managed-bean
3. 添加命令和工具标签到JSP页面中,并绑定managed-bean适当的方法 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值