基于java的arcgis server开发(5)

2019-08-30 22:53

Task框架的基本构成就是这样了,祝大家使用愉快。下节将介绍TaskResult的使用。

7、Server Java 开发实战---自定义command

这个文档大家如果喜欢看英文,在ESRI的帮助里面就有。本文和ESRI的帮助文档类似,当然,我写的会加入自己的一些东西。

咱开发人员拿到一个开发平台,当然是要用来开发的,而且我们最好把它改得面目全非,才能显出开发人员我的水平所在。对于那些拿着模版生成一个web gis站点就去问客户要钱的事情,对于一个有自尊的开发人员,一般是不屑做的。

所以,我们今天就讲讲如何自定义命令和工具,先说说自定义命令吧。

命令事实上是command,也就是平常所在html页面里面的command,这些command里面就是命令按钮。在我们的ArcGIS Server的Web ADF里面,command被用来做一些不用跟地图交互的工作;比如缩放到全图:你不需要跟地图做任何交互,只要一按按钮,地图就缩放到全图。其它用处,就靠大家去发挥想象了,相信大家在以后的项目中会经常用到。我们以一个例子作为说明:

package com.demo;

import javax.faces.event.ActionEvent; import com.esri.adf.web.data.WebContext; import com.esri.adf.web.data.geometry.WebExtent; import com.esri.adf.web.faces.event.MapEvent; import com.esri.adf.web.faces.event.MapToolAction; public class MyFullExtent { WebContext context;

public WebContext getContext() { return context; }

public void setContext(WebContext context) { this.context = context;

} public void setFullExtent(){ try{

19

WebExtent ex=context.getWebMap().getFullExtent(); context.getWebMap().setCurrentExtent(ex); context.refresh(); }catch(Exception ex){ ex.printStackTrace(); } } }

这是无比简单的一个command,简单到我都不好意思发出来给大家看了。注意这个类没有实现任何接口,也没有扩展任何现有的类,除了祖宗Object。它有一个WebContext,从上面一个讲座我们可以知道,这个类可是我们整个Web ADF的关键,有了它,可以得到所有的东西了。

这个类关键的方法是setFullExtent,里面的几行代码用来将地图缩放到全图,大家看看代码应该就可以明白。

怎么进行部署呢?就像普通的managed bean一样进行部署就可以了,打开jsf application的心脏faces-config.xml文件,在里面添加如下配置:

myFullExtent

com.demo. MyFullExtent session

context #{mapContext}

注意我们把web context作为一个属性,用来初始化MyFullExtent,#{mapContext}指向了一个在faces-config.xml文件中定义的另外一个Bean,这个bean我们上次讲座已经详细解释过了。这里说一句废话,算是提醒一下,有请求过来的时候,先实例化这个类,然后再设置属性,有的工程师想在实例化里面进行一些操作,就必要用webContext,会报告空指针错误,因为这个时候webContext属性还没有被设置。

类写好了,也配置好了,怎么用呢,再给个例子:

20

自定义command就这样完成了。

8、 ArcGIS Server Java 讲座--ADF 体系结构 第一部分

这两天一直在等待9.2 Engine到货,好调试我写的例子,但是看来还得等一下,所以今天的这个讲座将向前跨越一大步。等Enging到货后把前面的部分,也就是如何自己写一个ADF补上。 有很多人看了前面的讲座问我,怎么讲了半天,还是没有讲到如何对server进行开发,就像吃浙大的豆沙包,咬了一大口,发现离馅还有300里。这句话提醒了我:那么今天我们直接吃豆沙馅了。

在讲一些sample之前,我们来看看整个ADF的体系架构,ADF里面有大部分类是纯JAVA的。它是构建在JSF之上的,所以它严格地遵守JSF的规范,所有的Bean都放在faces-config.xml和web.xml这样的配置文件中。我们今天吃豆沙馅,所以就讲讲这两个文件里面的配置;

Faces-config.xml文件中有如下配置:

esriWebSession

com.esri.adf.web.data.WebSession session

webApplication #{esriWebApplication} < /managed-bean>

这里定义了一个managed bean指向了WebSession的类,这个WebSession类实现了一个接口,这个接口是HttpSessionListener,看看这个接口的Javadoc吧;这个接口做两件事情:每当往Session中存入一个对象(setAttribute)或从Session中删除一个对象的时候,如果这个对象实现了此监听器接口,应用服务器将会自动调用接口相应的方法。你有机会在这两个方法里面做一些事情,最好的莫过于初始化存放在session中的变量。如果你一定要问我,Managed Bean的scope如果是session,那么在每个新session中,都会初始化这个managed bean,调用它的constructor,这样不是也可以实现managed bean地初始化么?如果你一定要这样写,也可以,但是系统的可扩展性很差啦。 在ADF中,如果我们写了一个类,并且希望这个类能够被ADF初始化,我们直接实现

WebContextInitialize接口就可以了,ADF会自动初始化这个类,那么WebContextInitialize接口是什么呢?

首先,来看看我们的核心中的核心WebContext,Adf的广大Managed bean们都团结在WebContext周围,错了,是团结在WebContex里面;这个WebContext是这个Server ADF的容器。Context这个词翻译成上下文实在是不合适,我们还是叫它叫容器吧。

这个容器里面有什么?随便举个例子吧,它有很多的Attribute,比如有一个WebMap,所有容器

21

里面的Attribute都需要实现一个接口,这个接口的名字叫做WebContextInitialize,这个伟大的接口有两个方法:init和destroy。看看这两个方法,我不说你都能想到它们是用来做什么的。初始化这个attribute,和销毁这个attribute。看个帮助里面的例子吧:

WebContext context;

public void init(WebContext context) { this.context = context; //初始化其它资源或者变量 }

public void destroy() { context = null; //释放其它资源 } }

OK,这个attribute也将作为一个managed bean部署在faces-config.xml文件里面。这里引出的问题是,谁来调用这个init方法和destroy方法呢?对JSF来说,这两个只是普通的方法,JSF不会调用这两个方法来进行资源的初始化和释放。答案是WebContext来调用这些初始化和释放的方法,我们可以看WebContext的doc原文:

WebContext is responsible for making the callback methods implemented by the resources and attributes at appropriate junctures of the ADF application. The callback methods are declared in the WebContextInitialize, WebContextObserver and WebLifecycle interfaces.

原来是WebContext负责调用这三个接口的方法,初始化和释放资源。

我们看一下WebContext,发现它也是需要有人来初始化它的,那么WebContext是谁来负责的呢? 是WebSession。WebSession里面存放了所有的WebContext,并且保证这些WebContext们能够被正常的初始化和destroy,什么时候初始化,什么时候Destroy,当然由WebSession实现的,大名鼎鼎的HttpSessionBindingListener接口来实现,每次有一个用户访问或者用户退出时,该监听器会自动调用两个方法,用来初始化和摧毁WebContext。另外要说一句地时:一个session可以有多个webContext,你可以用getWebContexts()得到所有的WebContext。目前我们看到的所有的配置文件都只使用了一个WebContext,多个WebContext会使用在什么地方呢,这个问题大家先考虑一下,我在后面的讲座中会揭晓答案。

如果有多个用户访问时,就会产生多个并发用户,我们的Web Server会为每个用户都分配一个WebSession,这些Websession会放在哪里,答案是放在WebApplication中,我们打开faces-config.xml文件可以看到里面有一个webApplication的定义

esriWebApplication

22

com.esri.adf.web.data.WebApplication

再去看WebSesstion的定义,有指向esriWebApplication的引用。

现在的问题是,是谁,初始化了WebApplication,我们祭出最原始也是最强大的武器了:ServletContextListener出马了,看web.xml中下面的顶定义,

com.esri.adf.web.util.ADFServletContextListener

ADFServletContextListener 实现ServletContextListener接口,ServletContextListener有两个方法:contextInitialized()和contextDestroyed(); 分别在web application启动的时候和结束的时候调用,你要是觉得好玩,可以写一个listener玩玩,我这里写一个简单的listener现现丑:

public void contextInitialized(ServletContextEvent arg0) { System.out.println(\}

public void contextDestroyed(ServletContextEvent arg0) { System.out.println(\} }

ESRI使用了ADFServletContextListener,它实现了ServletContextListener接口,用来启动和destroy WebApplication。看看Javadoc的原文吧:

The ADFServletContextListener initializes a WebApplication object and sets it as an attribute on the ServletContext. When the ServletContext is destroyed, it destroys the associated WebApplication and attempts to clean up all server hosted objects in the current thread.

This class must be registered as a listener-class (in the web.xml file) for the web application.

现在大家都明白了吧,整个调用过程。Servelt容器启动的时候,会发送启动消息给

ADFServletContextListener,ADFServletContextListener负责创建WebApplication,WebApplication负责创建和存放WebSession,WebSession负责创建WebContext,WebContext负责创建所有的Attribute,对资源的使用等等。这一下大家都满意了吧。

谨以此文,纪念在浙大吃过的一千个豆沙包。

23


基于java的arcgis server开发(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:混凝土收缩徐变预测

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: