java adf_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页面中添加标签

为该命令指定"actionListener"

设置该命令标签的属性

这里是一个添加向右移动的例子:

对于"右移"命令,你必须设置"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应用中。"移动"命令允许用户移动地图当用户拖拽地图时。

添加工具的步骤:

在页面添加标签

指定"clientAction"和"serverAction"属性

设置工具的其他属性

这里是一个添加移动工具的例子:

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属性。

featureCounter

com.mypackage.FeatureCounter

request

webContext

#{mapContext}

在JSP页面添加命令和工具

工具标签必须指定"EsriMapRectangle"作为clientAction属性。这允许用户在地图上画一个方框,该方框被作为MapEvent参数传递给

serverMethod指定的方法:

...

/>

...

....

Feature Count =

shocked.gifutputText value="#{featureCounter.countedFeatures}" rendered="#{featureCounter.countedFeatures >

0}"/>

小结

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

1. 创建一个类,添加业务逻辑

2. 声明这个类作为一个managed-bean

3. 添加命令和工具标签到JSP页面中,并绑定managed-bean适当的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值