ArcGIS+Server+Java讲座.docx
《ArcGIS+Server+Java讲座.docx》由会员分享,可在线阅读,更多相关《ArcGIS+Server+Java讲座.docx(103页珍藏版)》请在冰豆网上搜索。
ArcGIS+Server+Java讲座
ArcGISServer9.2forJava讲座
1、前言------为什么我们选择JSF,而不是其它framework1
2、ArcGISServerJava开发JSF基础2
3、ArcGISServerJavaADF开发的JSF知识介绍5
4、ArcGISServer开发初步--自定义工具7
5、使用图片和TrueType字体进行标注10
6、ServerJava讲座-----扩展Tasks框架13
7、ServerJava开发实战---自定义command19
8、ArcGISServerJava讲座--ADF体系结构第一部分21
9、ArcGISServerJAVA讲座--实现后台JSFBean和前台Javascript的联动24
10、ArcGISServerJAVA讲座--AJAX基础25
11、ArcGISServerJAVA开发讲座---ADF中的Ajax函数27
12、ArcGISServerJava讲座--如何在用JSF在服务器端处理Ajax请求29
13、ArcGISServerJava讲座----利用Ajax得到当前地图的比例尺(服务器端)32
14、ArcGISServerJava讲座--用Ajax得到地图比例尺(客户端代码)33
15、ArcGISServerJAVA讲座自定义Functionality35
16、ArcGISServerJava讲座---用自定义functionality实现用户权限控制37
17、ServerJava讲座-----扩展Tasks框架42
18、ArcGISServerJava讲座--自定义Tools开发48
19、ArcGISServerJava讲座-空间查询和高亮显示的实现52
20、ServerJava自定义开发-NetworkAnalysis54
21、ArcGISServer开发——控制图层是否可见59
22、航线查询问题-ServerJava的实现方法59
23、ArcGis航线查询完全例子64
24、ArcGisServer中如何在Task中实现下拉列表和checkbox和radiobutton.(完整例子)73
25、ArcGISServer开发——标注74
26、ArcGISServerJava开发--BornforSOA系列前言75
27、ArcGISServerJava开发--BornforSOA系列WebService基础75
28、ArcGISServerJava讲座:
BornForSOA--Server对于SOAP的支持81
29、ServerJava开发--BornforSOA系列通过代理类访问ArcGISServerWebService84
1、前言------为什么我们选择JSF,而不是其它framework
在正式开讲之前,我们来探讨一下为什么要使用JSF来实现SERVERADF,这也是很多开发商跟我讨论时经常会问到的问题。
世界上有300种Java的framework,这个数字是我几个月前听到的,现在可能已经不止这个数了。
我曾经用过的framework包括Structs,Hibernate,Spring。
这些framework不但能加速开发,而且会带来全新的程序设计理念。
我当时的感觉是:
原来程序还可以这样写!
当然,这些framework都是开源免费,你不用担心自己的良心受到谴责,也不用担心比尔盖茨半夜敲门收钱。
在这300多种framework中,ESRI为什么选择了JSF?
各个framework有各个framework的好处。
JSF最大的优点就是:
像Swing和AWT一样,JSF是一个可以提供一组标准的、可重用的GUI组件的开发框架。
原因之一:
行为与表示的完全分离。
行为和表现不分离的一个典型例子是普通的JSP技术,这一技术很好,因为很容易在HTML(和类HTML)页面中混合Java代码。
这样我们就可以使用强大的JavaAPI的功能。
当然,很明显的坏处是行为表现黏合在一起。
而且代码不容易重用。
这让我想起刚使用JSP技术时,在文本编辑器下写JSP页面,读写数据库,并且在同一个页面上显示出来的痛苦回忆。
Model1架构的出现使开发人员可以用javabean的方式进行开发,舒服多了。
当然,还有更好的。
这就不得不提到著名的MVC结构,(MVC)model-view-controller架构提供了一系列的设计模式,这些模式让你可以轻松地应用于程序地开发,特别是有界面程序的开发。
现在又有多少的程序是没有界面的呢?
Model包装了商业逻辑,也包含了数据持久的代码,包括存取数据库或者存取文件。
Model最好不要跟View有任何关系,它最好不要知道谁将显示结果,是一个Swing界面,还是JSF界面,还是普通的JSP界面。
为了做到这一点,事先的规划要花一些时间,但是相信我,这些花的时间带来的价值将超过你的想象。
如果设计得当,许多用ArcGISEngine开发的代码可以轻松在Server中使用,不需要修改任何代码。
.net也是一样。
View只用来显示显示逻辑,不能有任何商务逻辑。
controller是view和model的桥梁,它和model进行交互,并且把结果显示在Model中。
显示页面的选择也由controller进行选择。
我会在后面的讲座中详细解释JSF中的Controller的实现。
Structs,Spring都实现了MVC的架构。
但是它们都没有像JSF这样,提供一个事件驱动的组件对象模型。
大家可以想一想,一个平常在HTML中使用的标签, ,在JSF框架中变成了一个组件,这个组件还可以有事件,而且可以对这个事件可以进行编程。
这是多么得激动人心啊!
GIS程序需要和用户进行良好地交互,选择一个事件驱动的framework,可以更加容易编程和实现。
原因之二:
事件容易捆绑到服务器端代码。
JSF提供了多个事件驱动的GUI控件,比如最最常见的commandbutton。
这些commandbutton会产生事件,我们有机会对事件进行编程;我在以前的讲座中曾经讲过,ArcGISServer的MapControl和commandbutton是兄弟,他们都继承自ponent.UICommand;是不是感觉很奇妙啊?
继承自UICommand的原因是要利用UICommand的很多事件,对鼠标在MapControl上的动作,比如放大,缩小,需要产生事件,这些事件提交到相应的监听器,监听器会对事件进行处理。
有关于MapControl的问题先提这些,在后面的讲座中我会详细解释。
举一个简单的例子吧,一个最简单不过的fullextent工具,如果我自己来写,可以写成这样:
commandButtonid="redisplayCommand"type="submit"value="FullExtent"actionListener="#{getMapBean.getFullMap}"/>
这个按钮,用来缩放到全图,它的监听器是绑定到getMapBean的getFullMap方法,在该方法里面,我会将地图的大小缩放到全图范围。
代码我会稍后贴上来。
这就是JSF的事件捆绑到服务器代码的功能。
普通的一个button,点击事件可以映射到后台Bean的某一个方法,在后台方法里面执行商业逻辑,进行数据存取。
这个概念跟普通的Swing程序的事件和监听器机制十分类似,Java程序员们看了肯定倍感亲切。
注意,刚才这个button没有利用任何ADF的类,在我们的ADF中,所有要建大厦的材料都已经给您准备好,fullExtent功能只需要三行代码即可实现。
事件容易捆绑到服务器端代码,这是ESRI选择JSF作为我们ADF底层的另外一个重要的原因。
2、ArcGISServerJava开发JSF基础
有很多开发人员问我,如果我已经有了一个JSP的Application,为了使用JSF,为了使用我们新版的ArcGISServer的JavaADF,我需要重新修改写我的程序以让它们适应整个JSF框架么?
这是一个很有意思的问题,我可以想象出大家头皮发麻,左右为难的感觉,这也引出了今天的话题,Servlet容器是如何对JSF的程序进行处理的呢?
随便找一个JSF的Application,可以是我们的ArcGISServer的Sample,也可以是任何您从网上下载的JSF例子,打开web.xml文件,你就可以看到该文件里面有如下的servlet映射:
FacesServlet
javax.faces.webapp.FacesServlet
1
FacesServlet
*.jsf
这是Java程序员最熟悉不过的Servlet配置了,该Servlet映射是什么意思呢?
将所有对后缀名为jsf的请求,都交由javax.faces.webapp.FacesServlet来处理。
哦,另外插一句,JSF的标准是公开的,如果你觉得这个FacesServlet不好,你大可以自己写一个JSF处理Servlet。
将所有对jsf的请求自己来处理。
事实上,已经有人这么做了,这就是Myfaces,可以参考Apache的网站。
言归正转,如何将JSF的应用集成到已经有的应用程序中呢,您一定已经想到了。
事实上事情很简单,在访问某个JSF页面的时候,映射到某个目录即可。
这个目录在web.xml进行了设置,比如下面的配置就可以把所有的对faces的请求,让FaceServlet来处理:
FacesServlet
/faces/*
所以,如果你在根目录了放了一个hello.jsp页面,这个jsp页面使用了JSF框架,那么你在访问这个jsp页面时用http:
//servername/faces/hello.jsp就可以了,你的容器会把这样的请求提交FaceServlet来处理,这个时候,就轮到FaceServlet来大显身手了,它会忠实地执行你的请求。
JSF的ManagedBean是保存在session中的,所以你在JSF页面和普通JSP之间切换页面的时候,不会丢失信息,反过来也一样。
JSF自己有自己的PageNavigation系统,但是它仍然可以跟普通的JSP页面互相切换,我们在后面的讲座中会讲到。
所以如果你已经存在的一个项目,想上我们的ArcGISServer,利用其基于JSF的ADF进行开发,也是完全可以的。
当然,新的应用最好用JSF框架开发,开始时可能需要一点时间去学习,对于你后面会用到的强大的JSF的功能,这些投资是完全值得的。
欢迎大家进入美妙的JSF的世界。
了解了Servlet是如何处理你的JSF请求的,那么接下去我们来看看,让JSF程序跑起来需要什么必要条件,一个Servlet容器是必需的,这个一般取决于公司给我们配什么,或者客户要求什么。
一般免费的好选择是Tomcat,价格便宜量又足,我们大家都用它。
当然如果项目大,经费充足,IBM的J2EE容器Websphere和Bea公司的Weblogic也是一个好选择。
选用大公司J2EE容器有一个好处,即使三更或者五更出了问题,你照样可以拍着桌子让他们的工程师过来帮你解决问题,如果你用我们ESRI的软件,你也可以这样;而用免费的软件三更出了问题只有我们自己出马了,当然,google和XX在这个时候看在点击率的份上,还是可以拉我们一把的。
除了一个好的容器,还需要一个JSF的实现,用SUN的ReferenceImplementation总是不会错的,人家是标准的制定者嘛,名字也起做“参考实现”,写来让你参考的。
也可以选择功能更加强大的Myfaces。
ESRI的ArcGISServerADF遵循标准的JSF,所以ADF可以跑在Sun的JSF实现,或者Myfaces上。
我们这次所有的教程都是基于sun的标准的JSF实现。
还有其它的JSF实现,大家可以根据自己的爱好,择优选择之。
如果你觉得都不好用,大可以参考标准自己写一个实现,除了你的老板(要投入更多的开发经费)和你的team(要干更多的活),是没有人有意见的。
如果您像我一样选择了SUN的参考实现,那么去SUN的网站上去下载一个JSF的开发包吧,如果不想下载,随便找一个ServerJavaADF的例子,在WEB-INF/lib目录里面有JSF的包,名为jsf-api.jar和jsf-impl.jar的两个包就是;注意那个JSP的标准标签库jstl.jar,把它跟jsf的包放在一起,你不一定用标准标签库,但是JSF用到了它。
我把JSF的doc放在这里给大家下载,因为这个东西实在不好找,有人知道好的下载URL,可以在这里贴一个。
把这些包放在一个webapplication的lib目录里面有,你的程序你可以使用JSF的强大功能了。
让我也来俗气一下,写一个简单的helloworld作为今天的结束吧。
注意在你的webapplication里面的web.xml配置文件添加了FaceServlet的声明和URI映射。
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<%@pagec%>
<%@tagliburi="prefix="f"%>
<%@tagliburi="prefix="h"%>
view>
欢迎来到ArcGISServerADF世界
formid="welcomeForm">
outputTextid="welcomeOutput"value="欢迎来到ArcGISServerJavaADF教程!
"style="color:
red;"/>
messageid="errors"for="helloInput"style="color:
red"/>
outputLabelfor="helloInput">
outputTextid="helloInputLabel"
value="123"/>
outputLabel>
form>
view>
保存后访问Http:
//servername:
port/faces/hello.jsp即可,如果页面能够出来,那么恭喜您,您已经迈入了JSFwonderland的大门。
3、ArcGISServerJavaADF开发的JSF知识介绍
ArcGISServer的JavaADF开发使用到了JSF的知识,下面结合ArcGISServer的开发,介绍一下JSF的知识
Struts和JSF/Tapestry都属于表现层框架,这两种分属不同性质的框架,后者是一种事件驱动型的组件模型,而Struts只是单纯的MVC模式框架。
首先事件是指从客户端页面(浏览器)由用户操作触发的事件,Struts使用Action来接受浏览器表单提交的事件,这里使用了Command模式,每个继承Action的子类都必须实现一个方法execute。
在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:
在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为applicationevent,applicationevent和componentevent相比是一种粗粒度的事件。
struts重要的表单对象ActionForm是一种对象,它代表了一种应用,这个对象中至少包含几个字段,这些字段是Jsp页面表单中的input字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时,单纯使用Struts就不太可能,当然通过结合JavaScript也是可以转弯实现的。
而这种情况使用JSF就可以方便实现,
inputTextid="userId"value="#{login.userId}">
valueChangeListenertype="logindemo.UserLoginChanged"/>
inputText>
#{login.userId}表示从名为login的JavaBean的getUserId获得的结果,这个功能使用struts也可以实现,name="login"property="userId"
关键是第二行,这里表示如果userId的值改变并且确定提交后,将触发调用类UserLoginChanged的processValueChanged(...)方法。
JSF可以为组件提供两种事件:
ValueChanged和Action.相当于struts中表单提交Action机制,它的JSF写法如下:
commandButtonid="login"commandName="login">
actionListenertype=”logindemo.LoginActionListener”/>
commandButton>
从代码可以看出,这两种事件是通过Listerner这样观察者模式贴在具体组件字段上的,而Struts此类事件是原始的一种表单提交Submit触发机制。
如果说前者比较语言化(编程语言习惯做法类似Swing编程);后者是属于WEB化,因为它是来自Html表单。
基本配置
Struts和JSF都是一种框架,JSF必须需要两种包JSF核心包、JSTL包(标签库),此外,JSF还将使用到Apache项目的一些commons包,这些Apache包只要部署在你的服务器中既可。
JSF包下载地址:
Implementation。
JSTL包下载在http:
//jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi
所以,从JSF的驱动包组成看,其开源基因也占据很大的比重,JSF是一个SUN伙伴们工业标准和开源之间的一个混血儿。
上述两个地址下载的jar合并在一起就是JSF所需要的全部驱动包了。
在ArcGISServer的项目下的lib目录下有相关的库文件如下:
commons-beanutils.jarcommons-collections.jarcommons-digester.jarcommons-lang-2.0.jarcommons-logging.jarjsf-api.jarjsf-impl.jarjstl.jarstandard.jar
与Struts的驱动包一样,这些驱动包必须位于Web项目的WEB-INF/lib,和Struts一样的是也必须在web.xml中有如下配置:
FacesServlet
javax.faces.webapp.FacesServlet
1
FacesServlet
*.faces
这里和Struts的web.xml配置相似,简直一模一样。
正如Struts的struts-config.xml一样,JSF也有类似的faces-config.xml配置文件:
/index.jsp
login
/welcome.jsp
user
com.corejsf.UserBean
session
在Struts-config.xml中有ActionFormAction以及Jsp之间的流程关系,在faces-config.xml中,也有这样的流程,我们具体解释一下Navigation:
举例:
如果在mapviewer.jsp中有一个事件:
commandButtonlabel="Login"action="login"/>
action的值必须匹配form-outcome值,上述Navigation配置表示:
如果在index.jsp中有一个login事件,那么事件触发后下一个页面将是welcome.jsp
JSF有一个独立的事件发生和页面导航的流程安排,这个思路比struts要非常清晰。
UI界面
JSF和Struts一样,