您的位置:首页 > 编程语言 > Java开发

Java ADF开发入门-添加命令和工具

2009-05-29 22:07 483 查看
添加命令和工具

继前一讲的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适当的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: