Java ADF 运行原理剖析(2)

     Task是实现业务逻辑的重要部分。Task可以让用户输入参数,通过Command和Tools的组合,完成任务,返回结果。Task过Command+Tools简单相加之处在于Task提供了一个多样化组合的面板。

      A.Parameter   String       keyword

      B.Command   void方法    query(TaskEvent event)

      C.Tool           void方法    select(MapEvent event)

      A 定义了传递的参数 B.Command命令,通过TaskEvent获取消息,C.Tool工具,通过MapEvent捕获消息。下面以CustomTask和CustomTaskInfo为例,分析Task整个实现过程。

      CustomTask.Java关键代码:

public class CustomTask {

   

     private String layoutType;

     private Map<String,String> layoutOptions;

     private CustomTaskInfo taskInfo = new CustomTaskInfo();

     private String keyWord;

   

    public void query(TaskEvent event) {

       WebContext webContext = event.getWebContext();

       WebQuery webQuery = (WebQuery) webContext.getAttribute("query");

       TextCriteria textCriteria = new TextCriteria();

       textCriteria.setMaxRecordCount(100);

       textCriteria.setSearchText(this.keyWord);

    List<QueryResult> listQueryResult = webQuery.query(textCriteria,

              webQuery.getQueryLayers());

       webContext.getWebGraphics().clearGraphics();

       for (int i = 0; i < listQueryResult.size(); i++) {

           QueryResult queryResult = listQueryResult.get(i);

           queryResult.highlight();

       }

       webContext.refresh();

    }

  public void select (MapEvent event){

       WebContext webContext = event.getWebContext();

       WebGeometry webGeometry = (WebPolygon) event.getWebGeometry().toMapGeometry(webContext.getWebMap());

       WebQuery webQuery = (WebQuery) webContext.getAttribute("query");

       List<WebLayerInfo> layers = webQuery.getQueryLayers();

       List<WebLayerInfo> queryLayers = new ArrayList<WebLayerInfo>();

       for (WebLayerInfo layer : layers){

           if (layer.getName().equals("QXZF")){

              queryLayers.add(layer); break;

              }

           }

       IdentifyCriteria identifyCriteria = new IdentifyCriteria();

       identifyCriteria.setWebGeometry(webGeometry);

       List<QueryResult> listQueryResult = webQuery.query(identifyCriteria, queryLayers);

      

       //---------------------------高亮显示-------------------------

    /*  webContext.getWebGraphics().clearGraphics();

       for (int i = 0; i < listQueryResult.size(); i++) {

           QueryResult queryResult = listQueryResult.get(i);

           queryResult.highlight();

       }

       webContext.refresh();

       */

       //---------------------WebSimpleMarkerSymbol---------------------

       /*WebSimpleMarkerSymbol symbol = new WebSimpleMarkerSymbol();

       symbol.setMarkerType(WebSimpleMarkerSymbol.CIRCLE);

       symbol.setAntialiasing(true);

       symbol.setTransparency(0.7);

       symbol.setColor("255,255,0");

       symbol.setOutlineColor("255,0,0");*/

       //---------------------WebPictureMarkerSymbol--------------------

       /*WebPictureMarkerSymbol symbol = new WebPictureMarkerSymbol();

       symbol.setFileName("images/esri-logo.gif");*/

       //---------------------WebTrueTypeMarkerSymbol-------------------

       WebTrueTypeMarkerSymbol symbol=new WebTrueTypeMarkerSymbol();

        symbol.setFontName("ESRI Business");

symbol.setCharacterIndex(0);

       symbol.setFontColor("0,255,0");

symbol.setFontSize(50);

       symbol.setFontStyle(WebTrueTypeMarkerSymbol.UNDERLINE);

       webContext.getWebGraphics().clearGraphics();

       for (int i = 0; i < listQueryResult.size(); i++){

           QueryResult queryResult = listQueryResult.get(i);

          

           GraphicElement element = new GraphicElement();

           element.setGeometry(queryResult.getHighlightGeometry());

           element.setSymbol(symbol);

           webContext.getWebGraphics().addGraphics(element);

           }

      

    }

}

      以上是一段以两种不同方式查询显示的代码,public void query(TaskEvent event) 通过输入参数,对选择的数据集高亮显示。public void select (MapEvent event)相对复杂一些,根据选定图层,定义了以多边形框选取的方式,得到数据集,除了进行简单的高亮显示之外,还采取的其他的符号化方式,标注部分为不同符号化代码。

 

     CustomTaskInfo.Java代码片段:

public class CustomTaskInfo extends SimpleTaskInfo{

    TabularLayout[] layouts = new TabularLayout[1];

    //任务面板外观描述

    public TaskDescriptor getTaskDescriptor() {

       TaskDescriptor descriptor = new TaskDescriptor(CustomTask.class,

              "queryTask", "Custom Task");

       return descriptor;

    }

 

    public TaskToolDescriptorModel[] getToolDescriptors() {

       TaskToolDescriptor[] descriptors = new TaskToolDescriptor[1];

       descriptors[0] = new TaskToolDescriptor(CustomTask.class, "select",

              "选择", "EsriMapPolygon");

       descriptors[0].setRendererType(TaskToolDescriptor.IMAGE_RENDERER_TYPE);

       descriptors[0].setDefaultImage("images/tasks/maptools/polygon.gif");

       descriptors[0].setHoverImage("images/tasks/maptools/polygonU.gif");

       descriptors[0].setSelectedImage("images/tasks/maptools/polygonD.gif");

       descriptors[0].setDisabledImage("images/tasks/maptools/polygonX.gif");

       return descriptors;

    }

 

    public TaskParamDescriptorModel[] getParamDescriptors() {

       TaskParamDescriptor[] descriptors = new TaskParamDescriptor[2];

       descriptors[0] = new TaskParamDescriptor(CustomTask.class, "keyWord",

              "关键词", "getKeyWord", "setKeyWord");

       descriptors[1] = new TaskParamDescriptor(CustomTask.class,"layoutType","布局","getLayoutOptions");

       descriptors[1].setRendererType(TaskParamDescriptor.SELECT_RENDERER_TYPE);

       return descriptors;

    }

 

    public TaskActionDescriptorModel[] getActionDescriptors() {

       TaskActionDescriptor[] descriptors = new TaskActionDescriptor[2];

       descriptors[0] = new TaskActionDescriptor(CustomTask.class, "query",

              "查询");

       descriptors[1] = new TaskActionDescriptor(CustomTask.class,"changeLayout","布局切换");

       return descriptors;

    }

    public TaskLayout[] getTaskLayout() {

       

       layouts[0] = new TabularLayout();

       layouts[0].addComponent(getParamDescriptors()[1], new TabularPosition(0,0,1,1));

       layouts[0].addComponent(getActionDescriptors()[1], new TabularPosition(0,1,1,1));

       layouts[0].addComponent(getParamDescriptors()[0], new TabularPosition(1,0,1,1));

       layouts[0].addComponent(getActionDescriptors()[0], new TabularPosition(1,1,1,1));

       layouts[0].addComponent(getToolDescriptors()[0], new TabularPosition(1,1,1,0));

       return layouts;

    }

  

      CustomTaskInfo.Java为我们定义了Task面板的样式,public TaskDescriptor getTaskDescriptor()定义了面板的整体外观,并且关联了处理该面板事物的CustomTask类。

      public TaskToolDescriptorModel[] getToolDescriptors()定义了工具样式,该函数返回值为数组类型,可以添加多个工具样式。

      public TaskParamDescriptorModel[] getParamDescriptors() 也是以返回数组的形式,它提供描述所有参数的样式,如以文本形式还是以列表选择的方式。

      public TaskActionDescriptorModel[] getActionDescriptors() 描述所有命令按钮的样式,设置按钮名称,添加回调函数。

      public TaskLayout[] getTaskLayout()

      最后在getTaskLayout中添加前面定义的面板元素,这样一个完整的Task就生成了。

      当然以上只是后台部分的内容,在faces-config配置文件中,可以看到一下配置信息:

     <map-entry>

          <key>queryTask</key>

          <value>#{queryTask}</value>

    </map-entry>

<managed-bean>

    <managed-bean-name>queryTask</managed-bean-name>

    <managed-bean-class>com.esri.adf.web.developer.CustomTask</managed-bean-class>

    <managed-bean-scope>none</managed-bean-scope>

</managed-bean>

      以上配置文件,注册了CustomTask 这bean,名称为queryTask,queryTask又被添加到MapContext属性的列表中。

      最后就剩下了前台部分,代码如下:

<a:task id="queryTask"

           taskInfo="#{queryTask.taskInfo}"

           mapId="map1" clientPostBack="true"

           windowingSupport="true"

           value="#{mapContext.attributes.queryTask}" />

     完成整个工作,部署工程,运行,下面为示例图(1):

Java ADF 运行原理剖析(2)_第1张图片

     输入南京,单击查询Command按钮,后台调用query函数,结果高亮显示。

 

    通过Tool,多边形选取,目标要素以符号化的形式显示。

  如下图(2):

Java ADF 运行原理剖析(2)_第2张图片

  以上就是一个Task基本功能的完成展示。

 

你可能感兴趣的:(java,Web,bean)