geoserver开发手册系列

geoserver开发手册系列

ID:21881724

大小:1.06 MB

页数:66页

时间:2018-10-25

上传者:U-960
geoserver开发手册系列_第1页
geoserver开发手册系列_第2页
geoserver开发手册系列_第3页
geoserver开发手册系列_第4页
geoserver开发手册系列_第5页
资源描述:

《geoserver开发手册系列》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

WORD文档可编辑目录写在前面3一介绍4二工具4Java4Maven4Subversion4三源代码4源代码5提交5库结构5分支结构6快速入门6取出源代码7由Maven构建7由Maven生成Eclipse工程文件9导入模块进Eclipse9在Eclipse中运行GeoServer12访问GeoServer首页13Maven指南13安装Maven13运行Maven13构建13跳过测试14离线构建14构建扩展14Profiles15Eclipse15构建Web模块15使用Jetty运行web模块16Eclipse指南16导入模块17运行和调试17设置数据目录17更改Jetty默认端口18配置Jetty的JNDI资源19Eclipse首选项20代码格式化21代码模板22文本编辑器22编译器23OWS服务24OWS服务概览24实现一个简单的OWS服务24技术资料专业分享 WORD文档可编辑建立25创建插件27试一试30REST服务34简介34RESTful服务实现35基于Maps的Restful服务实现43基于反射的Restful服务实现49GeoServer中的Wicket开发55Web用户接口61简介61实现一个WicketUI扩展63写在前面...3一介绍...4二工具...4Java.4Maven.4Subversion.4三源代码...4源代码...4提交...5库结构...5分支结构...5四快速入门...6取出源代码...6由Maven构建...6由Maven生成Eclipse工程文件...7导入模块进Eclipse.7在Eclipse中运行GeoServer.10访问GeoServer首页...11五Maven指南...11六Eclipse指南...11七编程指南...12技术资料专业分享 WORD文档可编辑八释放指南...12九释放测试检查列表...12十CITE测试指南...12十一政策与步骤写在前面我一直对OSGeo的软件和应用很感兴趣,希望致力于这些软件在中国的普及与应用,《GeoServer开发手册》是这些工作的一部分。在近几年开源WebMap/GIS实践应用中,GeoServer的热度一直稳中有升。下图是Google趋势就GeoServer、MapServer的分析图表。图1GeoServer、MapServer趋势分析尤其有意思的是,在GeoServer的使用国家分布来看,以德国居多,其次就是中国(见图2)。可见,在中国或者说中文环境下,使用开源地理信息服务器GeoServer比较多。我个人也比较喜欢GeoServer,因为我觉得它的配置、使用比起MapServer方便,至少不需要去编辑某些文件。技术资料专业分享 WORD文档可编辑图2GeoServer搜索量前5名国家(见Google趋势)此次翻译以2.0.2版本为原型,对于翻译中出现不正确的地方,希望大家不吝赐教,与我交流。一介绍空。二工具在GeoServer开发者环境搭建以前,需要安装以下工具:JavaGeoServer开发需要JDK1.5及其以上版本,可从SunMicrosystems获取。注:除了可以使用Sun提供的JDK以外,也可以使用其它的,但这里我们推荐使用Sun的。MavenGeoserver使用Maven工具构建。当前推荐版本是2.1.0,可从Apache获取。虽然2.1.0是推荐的,但2.0.8以上版本同样可用。SubversionGeoserver源代码由subversion库完成存储和版本管理。对于不同平台有多种subversion客户端可获取。更多细节请访问:http://subversion.tigris.org/getting.html。三源代码技术资料专业分享 WORD文档可编辑源代码GeoServer源代码存放在:http://svn.codehaus.org/geoserver。使用以下方式取出开发版/trunk版本svncohttp://svn.codehaus.org/geoserver/trunkgeoserver使用以下方式取出稳定版/stable版本:svncohttp://svn.codehaus.org/geoserver/branches/1.7.xgeoserver警告:Geoserver库包含大量空间数据。从上取出这些数据对于低带宽用户来说相对就很慢或者很昂贵,这种情况下,用户可以通过以下方式仅获取源代码:svncohttp://svn.codehaus.org/geoserver/trunk/src提交通过以下步骤提交到代码库:1.安装subversion配置文件,请看后面备注。2.注册获取提交权限。3.将库切换到”https”协议,例如:[rootofcheckout]%svnswitchhttps://svn.codehaus.org/geoserver/trunk库结构http://svn.codehaus.org/geoserver/  branches/  spike/  tags/  trunk/lbranches包含以前所有稳定的开发分支,1.6.x,1.7.x,etc…技术资料专业分享 WORD文档可编辑lspike包含实验版本和原型ltags包含以前所有释放版本ltrunk为当前开发分支。分支结构每个开发分支都有如下所示的结构:http://svn.codehaus.org/geoserver/  doc/  src/  data/ldoc包含用户和开发人员向导的源文件lsrc包含Geoserver本身的Java源码ldata包含多种GeoServer的数据目录快速入门本章介绍快速搭建、运行GeoServer开发环境具体步骤。我们假定您已经安装好所有必须的工具(内容见第二章)。注:本章的上的是为了尽快的让开发者搭建和运行GeoServer。对于一些更加深入的介绍请见Maven指南和Eclipse指南。l取出源代码l由Maven构建l由Maven生成Eclipse工程文件l导入模块进Eclipsel在Eclipse里运行GeoServerl访问GeoServer首页取出源代码技术资料专业分享 WORD文档可编辑由subversion库中取出源代码。选取trunk作为最新开发源码,或者那些基本不可能经常更新的版本的稳定分支。要么是:svncohttps://svn.codehaus.org/geoserver/trunkgeoserver-trunk或者(稳定的1.7.x分支)svncohttps://svn.codehaus.org/geoserver/branches/1.7.xgeoserver-1.7.x在这页示例里面,我们假定你取出源码到一个名为geoserver的目录,不过,最好还是把名字取得更详细一点为好。由Maven构建修改目录到源树的根,执行以下maven构建命令:cdgeoserver/srcmvncleaninstall成功构建后会产生类似于以下的输出:[INFO][INFO][INFO]------------------------------------------------------------------------[INFO]ReactorSummary:[INFO]------------------------------------------------------------------------[INFO]GeoServer.............................................SUCCESS[10.271s]技术资料专业分享 WORD文档可编辑[INFO]GeoServerMavenPlugins...............................SUCCESS[0.865s][INFO]ConfigurationDeploymentPlugIn.......................SUCCESS[3.820s][INFO]GeoServerMavenArchetypes............................SUCCESS[0.054s][INFO]GeoServerWFSOutputFormatArchetype.................SUCCESS[0.390s][INFO]CorePlatformModule..................................SUCCESS[5.270s][INFO]DataModule...........................................SUCCESS[4.521s][INFO]OpenWebServiceModule...............................SUCCESS[2.730s][INFO]MainModule...........................................SUCCESS[10.077s][INFO]WebCoverageServiceModule...........................SUCCESS[3.785s][INFO]WebCoverageService1.1.1Module.....................SUCCESS[5.254s][INFO]ValidationModule.....................................SUCCESS[1.131s][INFO]WebFeatureServiceModule............................SUCCESS[6.695s][INFO]WebFeatureServiceModule............................SUCCESS[1.197s][INFO]WebMapServiceModule................................SUCCESS[8.519s][INFO]GeoserverRESTSupportCode...........................SUCCESS[3.366s][INFO]GeoWebCache(GWC)Module..............................SUCCESS[0.255s]技术资料专业分享 WORD文档可编辑[INFO]WebApplicationModule................................SUCCESS[27.386s][INFO]CommunitySpace.......................................SUCCESS[0.312s][INFO]GeoServerExtensions..................................SUCCESS[0.071s][INFO]------------------------------------------------------------------------[INFO]------------------------------------------------------------------------[INFO]BUILDSUCCESSFUL[INFO]------------------------------------------------------------------------由Maven生成Eclipse工程文件生成Eclipse使用的.project文件和.classpath文件:mvneclipse:eclipse导入模块进Eclipse1.启动运行Eclipse集成开发环境2.打开Eclipse首选项Preferences3.依次点击进入:Java,BuildPath,ClasspathVariables,点击New技术资料专业分享 WORD文档可编辑4.创建类路径变量名称”M2_REPO”,并且设置它的值为本地Maven库的位置,点击OK。5.单击OK以应用新的Eclipse首选项。6.在包浏览PackageExplorer右键并单击导入Import…技术资料专业分享 WORD文档可编辑7.选择已有工程导入工作区ExistingProjectsintoWorkspace,单击下一步:8.进入geoserver/src目录9.确保所有模块都被选取,单击完成Finish技术资料专业分享 WORD文档可编辑在Eclipse中运行GeoServer1.在包浏览PackageExplorer中选择web-app模块(1.7.x或更早版本是web)2.点击进入org.geoserver.web包(1.7.x或更早版本是org.vfny.geoserver.jetty)3.在Start类上右键,单击Runas,JavaApplication技术资料专业分享 WORD文档可编辑访问GeoServer首页l几秒后,就可通过http://localhost:8080/geoserver访问到GeoServerl默认的用户admin的密码是geoserverMaven指南本章是使用Maven构建GeoServer的参考。安装Maven见工具(第二章)运行MavenMaven提供了从模块编译到生成测试覆盖报告的多种命令。大部分maven命令可在源树的根运行,或者某个特模块。注:在准备由源树的根运行maven命令时,请记住要将取出的根目录变换到src目录。在由源树的根运行一个命令时,或者从包含其它模块的目录时,命令将会为所有模块运行。当从单个模块运行命令时,它只为这个模块运行。构建GeoServer最常用的命令是安装命令:技术资料专业分享 WORD文档可编辑mvncleaninstall虽然clean命令不是必须的,但我们还是推荐用上。上面的命令做了以下的事:l编译源代码l运行单元测试l安装成果到本地Maven库跳过测试通常在构建时跳过单元测试很有用处。在构建命令中添加-DskipTests标志就可以只编译单元测试而不会运行测试。mvn-DskipTestscleaninstall离线构建Maven操作会自动下载待构建模块中声明的依赖库。当处理快照(SNAPSHOT)依赖时,这就有可能会有问题。Maven每次执行一天内的首次构建时,会尝试更新它的快照依赖。由于GeoServer依赖GeoTools库的快照版本,这时可能会有问题。最终导致Maven下载大量GeoTools更新模块并且急剧增加构建时间。而如果你只是本地构建geotools,这些就显得不必要了。这时,可以使用“离线”方式运行Maven来改进:mvn-ocleaninstall在离线模式中,Maven不会下载任何外部依赖,也不会更新任何快照依赖。构建扩展默认情况下,扩展没有被包含在构建中。它们得通过Profile来明确增加到构建中。比如下面的示例就将restconfig扩展添加到构建中:mvncleaninstall-Prestconfig可以同时添加多个扩展同时使用:技术资料专业分享 WORD文档可编辑mvncleaninstall-Prestconfig,oracle有个特殊的名为allExtensions的Profile可以添加所有扩展:mvncleaninstall-PallExtensionsProfilesEclipseMaven的Eclipse插件用于为模块生成eclipse工程:mvneclipse:eclipse经过此操作后,这些模块就可以导入Eclipse工作区。该插件有个很有用的功能就是可下载第三方依赖的相关源代码。这是通过添加downloadSources标志来做的:mvn-DdownloadSourceseclipse:eclipse警告:当你首次启用downloadSources标志时,构建过程需要很长时间,因为它要下载GeoServer所依赖的每个库的源代码。构建Web模块当安装好web模块后,它会通过内建的特殊配置构建。默认情况下它注是minimal配置。尽管如此,它也可以通过设置configId和configDirectory标志来定制任意配置。比如:mvncleaninstall-DconfigId=release-DconfigDirectory=/home/jdeolive/geoserver_1.7.x/data上面命令可使用GeoServer上的release配置构建web模块。configId是包含的配置目录名称,configDirectory是包含的配置目录的父级目录。configDirectory可以像刚才的一样的绝对路径,也可以是针对web模块自身的相对路径:mvncleaninstall-DconfigId=release-DconfigDirectory=../../../data技术资料专业分享 WORD文档可编辑上面的命令与之前有同样的效果,尽管是引用了相对于web模块的路径。该路径,../../../data,在GeoServer取出(checkout)的代码目录结构是标准结构的情况下可用。使用Jetty运行web模块Maven的jetty插件可用于运行嵌入了jetty容器的基于web的模块:cdgeoserver_1.7.x/src/webmvnjetty:run注:该命令必须从web模块运行,如果从其它模块运行就会失败。上面的命令将会使用自带的数据目录来运行GeoServer。为了使用其它的数据目录可以启用GEOSERVER_DATA_DIR标志:mvn-DGEOSERVER_DATA_DIR=/path/to/datadirjetty:runEclipse指南本章是使用Eclipse开发GeoServer的参考。l导入模块l运行和调试l设置数据目录l更改Jetty默认端口l配置Jetty中JNDI资源lEclipse首选项l代码格式化l代码模块l文本编辑器l编译器技术资料专业分享 WORD文档可编辑导入模块参见Maven指南中的Eclipse部分。运行和调试运行和调试web-app模块中org.geoserver.web.Start类。具体步骤见快速入门。设置数据目录如果未设置,GeoServer默认会使用web-app模块里的minimal目录作为它的数据目录。若要修改,执行以下步骤:1.在Eclipse菜单中打开调试配置(DebugConfigurations)2.先把Start配置,选择Argument面板,并且填写-DGEOSERVER_DATA_DIR参数,设置数据目录为绝对路径。技术资料专业分享 WORD文档可编辑更改Jetty默认端口如果未设置,Jetty默认会使用8080端口。修改请按以下方式:1.打开上节所说的Start配置中的Argument面板。2.填写-Djetty.port参数,设置它到期望的端口技术资料专业分享 WORD文档可编辑配置Jetty的JNDI资源JNDI资源如数据资源可以通过提供系统属性中名为jetty.config.file的Jetty服务器配置文件来配置,这个可以在Start配置中的Argument面板上通过VMargument参数指定。配置文件路径是相对于web-app模块根路径的,该模块是启动配置运行的地方。例如:-Djetty.config.file=../../../../../settings/jetty.xml以下的Jetty服务器配置文件就配置了一个JNDI数据源:jdbc/demo,它是一个Oracle数据库的连接池。          jdbc/demo                  技术资料专业分享 WORD文档可编辑               oracle.jdbc.driver.OracleDriver               jdbc:oracle:thin:@oracle.example.com:1521:demodb               claudius               s3cr3t               20               10               0               10000               300000               300000               20               true               100               true               SELECTSYSDATEFROMDUAL                         Jetty没有在GeoServer的WEB-INF/web.xml指定reference-ref,因此没必要修改该文件。GeoServerweb-app模块和数据目录没有特定于Jetty的相关信息,因此JNDI资源可以被测试在Jetty下,以便于后面在Tomcat下的开发。也可以看看GeoServer用户手册中Tomcat中建立JNDI连接池章节。Eclipse首选项技术资料专业分享 WORD文档可编辑代码格式化1.下载文件:http://svn.osgeo.org/geotools/trunk/build/eclipse/formatter.xml2.转到首选项中Java,CodeStyle,Formatter,点击Import…3.选择步骤1中下载的formatter.xml文件。4.点击Apply技术资料专业分享 WORD文档可编辑代码模板1.下载文件:http://svn.osgeo.org/geotools/trunk/build/eclipse/codetemplates.xml2.转到首选项Java,CodeStyle,Formatter,点击Important…3.选择步骤1中下载的formatter.xml文件。4.点击Apply文本编辑器1.转到General,Editors,TextEditors2.选中InsertSpacefortabs3.选中Showprintmargin,将Printmargincolumn设置为1004.选中Showlinenumbers5.选中Showwhitespacecharacters(可选)注:显示空白字符可帮助我们发现无意中提交不必要的空格。技术资料专业分享 WORD文档可编辑6.点击Apply编译器1.转到Java,Compiler,Building2.扩展开Outputfolder,并将.svn/加到Filteredresources列表中。技术资料专业分享 WORD文档可编辑3.点击ApplyOWS服务本节介绍GeoServer中OWS服务(原文为RESTful服务,可能为笔误)如何工作。OWS服务概览TBA实现一个简单的OWS服务本节将通过以下场景来介绍如何给GeoServer创建一个简单的GeoServerOWS服务。该服务需要提供一个能广告叫做“sayHello”的单一操作的功能(capabilities)文档。该sayHello操作的结果是一个简单的字符串:“HelloWorld”。内容:实现一个简单的OWS服务l 建立技术资料专业分享 WORD文档可编辑l 创建插件l 试一试建立创建插件的第一步是为它建立一个maven工程。该工程我们称为“hello”。1.     在本地文件系统中任意地方创建一个名为hello的新目录。2.     给hello目录添加名为pom.xml文件。 4.0.0 org.geoservercommunity2.0.1 org.geoserver技术资料专业分享 WORD文档可编辑hellojar1.0HelloWorldServiceModule org.geoservermain2.0.1 opengeoopengeohttp://repo.opengeo.org技术资料专业分享 WORD文档可编辑 3.     在hello目录下创建Java源文件目录。hello/+pom.xml+src/+main/+java/创建插件插件是一系列由springbeans实现的扩展。实例中扩展兴趣点是一个HelloWorld的POJO。1.     创建一个名为HelloWorld的类:importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse; publicclassHelloWorld{ publicHelloWorld(){//Donothing技术资料专业分享 WORD文档可编辑} publicvoidsayHello(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.getOutputStream().write("HelloWorld".getBytes());}}该服务相对比较简单。它提供了一个一个名为sayHello的方法,带有HttpServletRequest,HttpServletResponse参数。该函数的参数列表会由org.geoserver.ows.Dispatcher自动发现。2.     创建applicationContext.xml文件将上面的类申明为一个bean。     sayHello 到此,hello工程内容应该是看上去像下面这样了:技术资料专业分享 WORD文档可编辑hello/+pom.xml+src/+main/+java/+HelloWorld.java+applicationContext.xml试一试1.     安装hello模块。[hello]%mvninstall[hello]%mvninstall [INFO]Scanningforprojects...[INFO]----------------------------------------------------------------------------[INFO]BuildingHelloWorldServiceModule[INFO]task-segment:[install][INFO]----------------------------------------------------------------------------[INFO][resources:resources][INFO]Usingdefaultencodingtocopyfilteredresources.技术资料专业分享 WORD文档可编辑[INFO][compiler:compile][INFO]Compiling1sourcefileto/home/ak/geoserver/community/hello/target/classes[INFO][resources:testResources][INFO]Usingdefaultencodingtocopyfilteredresources.[INFO][compiler:testCompile][INFO]Nosourcestocompile[INFO][surefire:test][INFO]Noteststorun.[INFO][jar:jar][INFO]Buildingjar:/home/ak/geoserver/community/hello/target/hello-1.0.jar[INFO][jar:test-jar{execution:default}][WARNING]JARwillbeempty-nocontentwasmarkedforinclusion![INFO]Buildingjar:/home/ak/geoserver/community/hello/target/hello-1.0-tests.jar[INFO][install:install][INFO]Installing/home/ak/geoserver/community/hello/target/hello-1.0.jarto/home/ak/.m2/repository/org/geoserver/hello/1.0/hello-1.0.jar[INFO]Installing/home/ak/geoserver/community/hello/target/hello-1.0-tests.jarto/home/ak/.m2/repository/org/geoserver/hello/1.0/hello-1.0-tests.jar[INFO]------------------------------------------------------------------------[INFO]BUILDSUCCESSFUL[INFO]------------------------------------------------------------------------技术资料专业分享 WORD文档可编辑[INFO]Totaltime:6seconds[INFO]Finishedat:FriSep2114:52:31EDT2007[INFO]FinalMemory:27M/178M[INFO]-----------------------------------------------------------------------1.拷贝target/hello-1.0.jar文件到到你的GeoServer安装的WEB-INF/lib目录。2.重启GeoServer。3.访问:http:/geoserver/ows?request=sayHello&service=hello&version=1.0.0请求request我们服务内定义的方法服务serviceapplicationContext.xml文件中Service描述符的名称版本versionapplicationContext.xml文件中Service描述符的版本可选方法1.与web模块一起构建技术资料专业分享 WORD文档可编辑另外一个可选方法是在新的插件工程上从web模块申明一个依赖。1.     像上面一样安装hello模块。2.     编辑web/pom.xml,添加如下依赖:org.geoserverhello1.03.     安装、运行web模块[web]mvninstalljetty:run4.      访问:http://localhost:8080/geoserver/ows?request=sayHello&service=hello&version=1.0.0可选方法2:由GeoServer源中运行作为尝试插件开发的一种可选方法:1.     安装hello模块。2.     更改路径到web模块3.     安装web模块。4.     拷贝/target/hello-1.0.jar文件到/target/geoserver/WEB-INF/lib目录:[/dev/geoserver/web]%cp~/hello/target/hello-1.0.jartarget/geoserver/WEB-INF/lib5. 使用Jetty运行打包的war。技术资料专业分享 WORD文档可编辑[/dev/geoserver/web]%mvnjetty6:run-exploded6. 访问:http://localhost:8080/geoserver/ows?request=sayHello&service=hello&version=1.0.0REST服务本节是GeoServer中运行RESTful服务的的预览。简介GeoServer使用著名的Restlet库提供系统所有REST相关功能。Restlet是由Java编写的轻量级rest框架,它能很好的集成基于已有的servlet的应用程序Rest派发GeoServer里面,所有路径/rest下面的请求都被认为是一个restful请求。这每一个请求都交由一个rest派发器来处理。派发器的工作职责是请每个请求导向到相关的处理终端上。该终端就是restlet。Restlet由spring环境加载,因此它们是可插拔的。RestletsRestlet是处理派发器转发来的调用,与org.restlet.Restlet类相对应。我们可以扩展该类以实现一个服务端点(服务点)。同样,我们也可以为了某个特殊目的扩展出一个子类。下节描述的就是一个名为finder的子类。技术资料专业分享 WORD文档可编辑Finders和资源Restful服务通常是实现了某一个资源。Finder对象是一个特殊的restlet,它的职责是为特定的请求找到正确的资源。该资源就作为一个最终的终点,并处理请求。相关的类是org.restlet.Finder和org.restlet.resource.Resource。表达Representations¶Repreentation,通常是指特殊状态的状态或者资源编码的格式。例如,当某个特殊资源请求进来时,该资源的表达就返回给了客户端。RESTful服务实现本节描述GeoServer如何实现一个restful服务,将以“helloworld”为示例。该服务非常简单,将会向一个GET请求返回一个“HelloWorld”的文本。预置条件在开始之前,GeoServer必须在本地系统上构建成功。具体细节见源代码和快速入门两节。创建新模块1.     在本地系统某处创建一个名为hello_rest的新模块。2.     添加如下pom.xml文件到新模块根部:4.0.0技术资料专业分享 WORD文档可编辑 org.geoserverhello_restjar1.0-SNAPSHOThello_rest org.geoserverrest2.0-SNAPSHOTorg.geoservermain2.0-SNAPSHOTteststest技术资料专业分享 WORD文档可编辑junitjunit3.8.1testcom.mockrunnermockrunner0.3.1test  maven-compiler-plugin1.51.5技术资料专业分享 WORD文档可编辑 1.     在新模块根部创建src/main/java目录[hello_rest]%mkdir-psrc/main/java创建资源类1.     当创建新的资源时,我们可以拿到org.geoserver.rest.AbstractResource类。在org.geoserver.hellorest包内创建一个名为HelloResource的新类,它由AbstractResource扩展。packageorg.geoserver.hellorest; importjava.util.List;importorg.geoserver.rest.AbstractResource;importorg.geoserver.rest.format.DataFormat;importorg.restlet.data.Request;importorg.restlet.data.Response; 技术资料专业分享 WORD文档可编辑publicclassHelloResourceextendsAbstractResource{@OverrideprotectedListcreateSupportedFormats(Requestrequest,Responseresponse){ returnnull;}}2.第一个要实现的方法是createSupportedFormats()。该方法的目的是创建一个由扩展到特殊格式的映射。那么好,现在我们的目标就是给客户端的“.txt”扩展请求返回“HelloWorld”的文本。importjava.util.ArrayList;importorg.geoserver.rest.format.StringFormat;... @OverrideprotectedListcreateSupportedFormats(Requestrequest,Responseresponse){ Listformats=newArrayList();formats.add(newStringFormat(MediaType.TEXT_PLAIN)); 技术资料专业分享 WORD文档可编辑returnformats;}2.     接下来需要覆盖handleGet()方法。该方法在资源的GET请求拿到时调用。@OverridepublicvoidhandleGet(){//gettheappropriateformatDataFormatformat=getFormatGet(); //transformthestring"HelloWorld"totheappropriateresponsegetResponse().setEntity(format.toRepresentation("HelloWorld"));}上面代码使用getFormatGet()方法,该方法的目的是确定客户端请求的扩展,并为它找到对应的格式。在本例中,当客户端请求“.txt”扩展时,就可看到前面步骤中的StringFormat创建了。创建应用程序环境1.     下面一步是创建应用程序环境,用以告知GeoServer上节中所创建的资源。在hello_rest模块根部创建src/main/resources目录。[hello_rest]%mkdirsrc/main/resources2.     在hello_rest模块根部创建src/main/resources目录中添加如下的applicationContext.xml文件。技术资料专业分享 WORD文档可编辑  /hello.{format}hello 这部分里面有两点需要注意。第一个是前一节中创建的HelloResource类的实例hellobean。第二个是helloMappingbean,它定义了uri的模块,该uri是用来访问资源的。上面的映射描述了资源将被定位在/rest/hello.{format},其中format是代表客户端请求格式。就像实现程序里的那样,hello.txt是唯一受支持的表达格式。技术资料专业分享 WORD文档可编辑测试1.     hello_rest模块根部创建/src/test/java目录。[hello_rest]%mkdir-psrc/test/java2.     在org.geoserver.hellorest包内创建名为HelloResourceTest的测试类,该类由org.geoserver.test.GeoServerTestSupport扩展而来: packageorg.geoserver.hellorest; importorg.geoserver.test.GeoServerTestSupport; publicclassHelloResourceTestextendsGeoServerTestSupport{ publicvoidtest()throwsException{ }}3.     为/rest/hello.txt的GET请求添加一个状态,并且断言到它等于“HelloWorld”字符串。publicvoidtest()throwsException{assertEquals("HelloWorld",getAsString("/rest/hello.txt"));技术资料专业分享 WORD文档可编辑}4.     构建并且测试hello_test模块。[hello_rest]%mvninstall基于Maps的Restful服务实现前一节中我们介绍了如何实现一个简单的restful服务。本节将介绍如何为请求所表达的资源支持额外的格式利用已有的基类,以节省时间。我们所使用的类是org.geoserver.rest.MapResource。MapResource的目的是资源由包含在java.util.Map中的数据结构来提供。在该map集合中,MapResource类可自动以XML或者JSON格式为资源创建表达形式。预置条件本节建立在上一节中RESTful服务实现的实例基础上。创建新的资源类1.     org.geoserver.hellorest包中创建名为HelloMapResource的新类,该类由MapResource扩展: packageorg.geoserver.hellorest; importjava.util.Map;importorg.geoserver.rest.MapResource; 技术资料专业分享 WORD文档可编辑publicclassHelloMapResourceextendsMapResource{@OverridepublicMapgetMap()throwsException{ returnnull;}}2.     第一个方法是实现getMap()。该方法的目的是创建一个基于map的数据结构用来表达资源。现在我们来创建一个简单的map,它仅一个key为“message”,包含了“HelloWorld”字符串:@OverridepublicMapgetMap()throwsException{HashMapmap=newHashMap();map.put("message","HelloWorld"); returnmap;}更新应用程序环境(上下文)1.     下一步是更新应用程序环境,告知GeoServer前面所创建的新的资源。更新applicationContext.xml文件,如下所示:技术资料专业分享 WORD文档可编辑  /hello.{format}helloMap 这段中有两件事需要注意。第一个是helloMapbean的添加。第二个是helloMappingbean的修改,它现在映射的是helloMapbean,而非hellobean。技术资料专业分享 WORD文档可编辑测试在org.geoserver.hellorest包中创建一个新的名为HelloMapResourceTest测试类,它由org.geoserver.test.GeoServerTestSupport扩展而来:packageorg.geoserver.hellorest; importorg.geoserver.test.GeoServerTestSupport; publicclassHelloMapResourceTestextendsGeoServerTestSupport{ }2.为构建/rest/hello.xmlGET请求添加一个名为testGetAsXML()的测试方法:... importorg.w3c.dom.Document;importorg.w3c.dom.Node; ... publicvoidtestGetAsXML()throwsException{//maketherequest,parsingtheresultasadom技术资料专业分享 WORD文档可编辑Documentdom=getAsDOM("/rest/hello.xml"); //printouttheresultprint(dom); //makeassertionsNodemessage=getFirstElementByTagName(dom,"message");assertNotNull(message);assertEquals("HelloWorld",message.getFirstChild().getNodeValue());}3.为/rest/hello.json的GET请求添加名为testGetAsJSON()的测试方法。... importnet.sf.json.JSON;importnet.sf.json.JSONObject; ... publicvoidtestGetAsJSON()throwsException{//maketherequest,parsingtheresultintoajsonobjectJSONjson=getAsJSON("/rest/hello.json");技术资料专业分享 WORD文档可编辑 //printouttheresultprint(json); //makeassertionsassertTrue(jsoninstanceofJSONObject);assertEquals("HelloWorld",((JSONObject)json).get("message"));}4.构建并测试hello_tes模块。[hello_rest]%mvncleaninstall-Dtest=HelloMapResourceTest基于反射的Restful服务实现上一节中我们介绍了利用MapResource基类可更高效实现RESTful服务的范例。本节我们将介绍另外一个不同的基类,但却有同样的功效。该类是org.geoserver.rest.ReflectiveResource。该类的基本思想是资源由任意一个对象来提供。ReflectiveResource类使用反射来自动创建XML或者JSON格式的资源结果表达。预置条件本节建立在上一节基于Maps的Restful服务实现的示例的基础上。创建一个新的Javabean1.     ReflectiveResource的使用需要一个基础对象来工作。在org.geoserver.hellorest包中创建一个名为Hello的类:技术资料专业分享 WORD文档可编辑 packageorg.geoserver.hellorest; publicclassHello{ Stringmessage; publicHello(Stringmessage){this.message=message;} publicStringgetMessage(){returnmessage;}}创建新的资源类1.     在org.geoserver.hellorest包中创建一个新的名为HelloReflectiveResource的类,它由ReflectiveResource类扩展而来。 packageorg.geoserver.hellorest;技术资料专业分享 WORD文档可编辑 importorg.geoserver.rest.ReflectiveResource; publicclassHelloReflectiveResourceextendsReflectiveResource{ @OverrideprotectedObjecthandleObjectGet()throwsException{returnnull;}}2.第一个实现的方法是handleObjectGet()。该方法的目的是返回基础类以表达资源。本例中就是前一步所创建的Hello类的实例。@OverrideprotectedObjecthandleObjectGet()throwsException{returnnewHello("HelloWorld");}更新应用程序环境1.     接下来是更新应用程序环境,告知GeoServer前一节中所创建的新的资源。更新applicationContext.xml文件,如下所示: 技术资料专业分享 WORD文档可编辑  /hello.{format}helloReflective 技术资料专业分享 WORD文档可编辑有两点需要注意。第一件是helloReflectivebean的添加。第二件是helloMappingbean的修改,它映射到了helloReflectivebean。测试1.     在org.geoserver.hellorest包中创建一个名为HelloReflectiveResourceTest的类,它由org.geoserver.test.GeoServerTestSupport扩展而来: packageorg.geoserver.hellorest; importorg.geoserver.test.GeoServerTestSupport; publicclassHelloReflectiveResourceTestextendsGeoServerTestSupport{ }2.     为构建/rest/hello.xml的GET请求添加一个名为testGetAsXML()的方法。 ... importorg.w3c.dom.Document;importorg.w3c.dom.Node; 技术资料专业分享 WORD文档可编辑... publicvoidtestGetAsXML()throwsException{//maketherequest,parsingtheresultasadomDocumentdom=getAsDOM("/rest/hello.xml"); //printouttheresultprint(dom); //makeassertionsNodemessage=getFirstElementByTagName(dom,"message");assertNotNull(message);assertEquals("HelloWorld",message.getFirstChild().getNodeValue());}3.     为/rest/hello.json的GET请求添加一个名为testGetAsJSON()的方法。 ... importnet.sf.json.JSON;importnet.sf.json.JSONObject; 技术资料专业分享 WORD文档可编辑... publicvoidtestGetAsJSON()throwsException{//maketherequest,parsingtheresultintoajsonobjectJSONjson=getAsJSON("/rest/hello.json"); //printouttheresultprint(json); //makeassertionsassertTrue(jsoninstanceofJSONObject);JSONObjecthello=((JSONObject)json).getJSONObject("org.geoserver.hellorest.Hello");assertEquals("HelloWorld",hello.get("message"));}4.     构建并测试hello_test模块。[hello_rest]%mvncleaninstall-Dtest=HelloMapReflectiveResourceTestGeoServer中的Wicket开发本节介绍GeoServer2中基于Wicket配置接口创建页面。关于Wicket的更多信息,可去http://wicket.apache.org/取出工程站点。技术资料专业分享 WORD文档可编辑添加一页在Wicket里面,每个页面都有相应的Java类。为了添加一个页面,我们需要创建新类以扩展org.geoserver.web.GeoServerBasePage,我们也同样需要创建一个链接来引导用户到该页面。(总体上,Wicket页面没有可靠的URL,因此我们必须在已有页面明确的创建一个链接,让Wicket生成合适的URL。)在类不需要参数到它的构建函数的情况下,我们可以用Spring插入一个链接。在Sping创建链接要求我们的页面链接文本必须国际化。我们呆会会对国际化进行更加深入的讨论。GeoServer的最简单的可能的Wicket扩展包含3个文件。有个Java类定义(在src/main/java/org/geoserver/web/example/MyPage.java文件中)。packageorg.geoserver.web.example; importorg.geoserver.web.GeoServerBasePage; publicclassMyPageextendsGeoServerBasePage{//Wewillfillintherestlater,fornowthepagecanjustbeblank}同样也需要一个Spring应用环境文档(src/main/java/applicationContext.xml):技术资料专业分享 WORD文档可编辑第三个需要的文件是国际化字符串的默认字典,存于src/main/java/GeoServerApplication.properties文件:org.geoserver.web.example.MyPage.page.title=MyExamplePageorg.geoserver.web.example.MyPage.page.description=AnexamplepagefordeveloperstryingtoextendtheGeoServerUI.如果你使用了这些三个文件创建了一个jar,并且把它添加到GeoServer类路径(Classpath)中,我们就能在左侧看到新的链接。加到页面到这我们已经给UI添加一个页面,但是这个还不是很有趣。在Wicket里面,页面以HTML文件提供他们的内容,该HTML文件与Java代码有着同样的名称,当然扩展名不同。关于这些文件的有些具体细节与标准HTML不同;一方面,它们必须是标准有效的XML,Wicket才能处理。另外,Wicket使用少量的技术资料专业分享 WORD文档可编辑“特殊”元素来描述哪里需要Java代码检测并处理成HTML。下面是GeoServer管理控制台最常用的:Wicket元素目的Wicket:id属性告知Wicket将要使用的名称,当匹配到Wicket组件的。不需要内容,但是扩展该页的类可以此处插入内容。封装的内容将会在的地方插入到父页,与wicket:extend相似,但是用于创建特定的组件而非扩展的页。包含这个标记(能用于页面pages或者面板panels)的页面头部需要添加的这节内容(像包含的CSS或JavaScript代码)封装那些将会重写到页面的链接,CSS文件和它管理的其它资源。(这会允许你引用那些相对于Java源代码的路径的资源,而不是渲染后的HTML)。DefaultText告知Wicket到国际化数据库查找字符串,如果找到了就替换成需要的文本。Wicket只提供很少的组件,其中一些见于Wicket组件参考。总体上,Wicket组件需要一个模型对象来处理getting,setting,和转换组件相关的值的to/from字符串。这个示例的目的是,我们将会集中于一个最简单的,即为Label,它会在运行时替换所绑定的值的元素内容。由以上的内容我们继续,我们可以把一个字符串提供给Label的构造函数,并且它透明式的转换成一个模型:packageorg.geoserver.web.example; importorg.geoserver.web.GeoServerBasePage;importorg.apache.wicket.markup.html.basic.Label;技术资料专业分享 WORD文档可编辑 publicclassMyPageextendsGeoServerBasePage{publicMyPage(){add(newLabel("label","HelloWorld"));}}相关的HTML源是src/main/java/org/geoserver/web/example/MyPage.html:Greetings,GeoServerUser!MymessageforyouisthanksforusingGeoServer.当然,我们可以使用Wicket来做很多更加复杂(并且有用)的事,但是这个示例演示的是最通用功能:仅仅是添加一些动作到HTML元素。在导航菜单外部添加链接当然,我们不能在左边菜单中添加全部的东西;一方面,它只定义了静态链接集,GeoServer绑定这些链接到很多不同配置的资源。加一方面,有些页面需要传参数给它们的构造函数。如果你需要添加特定的链接到页面上,你可以使用WicketLinks组件,并且定制onClick技术资料专业分享 WORD文档可编辑行为来调用相应的构造函数。(你也可以在处理用户输入的其它方法里使用setResponsePage,如form提交。更详细的信息请查询Wicket文档。)一个示例://...importorg.apache.wicket.markup.html.link.Link;//... add(newLink("link"){publicvoidonClick(){setResponsePage(newMyPage());}});相对应的HTML将像:Followthislovelylink.使它国际化在GeoServerUI,我们使用一个定制的资源查找工具,以供任意模块提供资源字符。你所需要做的是引入你的i18n值在名为GeoServerApplication.properties的Java属性文件,在你的src目录的根部(比如project/src/main/java/GeoServerApplication.properties)。元素使得文本国际化变得十分容易,但是在你需要插入值到句子中依语言不同而变化的位置时,你将会使用到一些更加复杂的方法。在Wicket里面,i18n值字符串能定义参数,通过这些参数能提供放置动态值到国际化字符串的能力。详见:技术资料专业分享 WORD文档可编辑http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/org/apache/wicket/model/StringResourceModel.htmlf添加资源通常在HTML里面,你会需要包含一些有用的东西,如CSS文件,JavaScript库,或者包含到页面上的图片。Wicket允许你使用URL来描述这些相对于你的Java源文件,使用封装在标签里面的相对路径。Wicket会在运行时使用正确的路径来重写这些链接。尽管如此,对于类似于不是继承于父类的资源,因此如果你需要包含多个包里都有的资源,你就需要一个新的类供两个类中共享资源。看GeoServerUI核心模块中的XMLEditor组件,作为组件的示例,它也是起这个功能。UI设计准则下面是GeoServer中Wicket页面的UI设计简单准则:表单Forms在表单里面,将每个字段分组作为包含一个标签和一个字段的一项放在一个无序列表中。对于单选按钮和复选框,标签应当放在字段后面;对于其它的,标签就可放在字段的前面,比如:

  • Foo
避免用户需要特殊知识比如,当需要一个值列表时,可以提供一个工具允许用户一次一个元素地操作列表,而不是给一个逗号分隔的值列表定制组件我们推荐创建一个可持续利用的Wicket技术资料专业分享 WORD文档可编辑组件用于任意一个复杂的值,这些值可能被用户编辑,比如外框或者自由字符串列表。通过提取并封装成一个组件,就能更易于提供一个兼容的、丰富的编辑功能给用户。Web用户接口简介GeoServer使用著名的Wicket网络应用程序框架作为它的用户接口。Wicket与很多Java网络框架不同的是它是基于组件的而非JSP模板的。这点使得Wicket对于很多javat程序员来说是一个显得更加自然的网络框架,因为这些人对于Swing编程比网络编程更熟。插件原生的Wicket组件可由类路径(classpath)加载。这就意味着网络应用程序可以基于模块方式构建,而不是单一方式。GeoServer将这种理念更前进一步,提供一个可插拔的用户接口,在该接口中Wicket组件可通过Spring和规则的GeoServer插件机制进行插拔。插件化的每个组件由组件描述符描述,每个组件描述符是org.geoserver.web.ComponentInfo类的一个实例:publicabstractclassComponentInfoimplementsSerializable{ /***theidofthecomponent*/Stringid;/***thetitleofthecomponent*/Stringtitle;/***Thedescriptionofthecomponent技术资料专业分享 WORD文档可编辑*/Stringdescription;/***theclassofthecomponent*/ClasscomponentClass;}ComponentInfo的实例包含了关于组件的元信息,如标题和描述等等,还有实现该组件的类。每个ComponentInfo的子类表示了一个特定的扩展点。例如,org.geoserver.web.MenuPageInfo类就表示”main”页面的扩展点,如从应用程序主菜单链接过去的页面。实现一个WicketUI扩展本节描述如何实现一个GeoServerWicket用户接口的扩展。该扩展非常简单,就是一个由主菜单链接过去的很基础的页面,显示一下“HelloWorld”。预置条件在开始之前,GeoServer必须在本地系统上构建成功。具体细节见源代码和快速入门两章。创建新模块1.     在本地系统上创建一个名为hello_web的模块。2.     添加如下的pom.xml文件到新模块根部:xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">4.0.0 org.geoserverweb22.0-SNAPSHOT org.geoserverhello_webjar1.0-SNAPSHOThello_web org.geoserver.webweb-core2.0-SNAPSHOT maven-compiler-plugin1.5技术资料专业分享 WORD文档可编辑1.5 3.     在新模块根目录下创建src/main/java目录。[hello_web]%mkdir-psrc/main/java创建页面类 1.     org.geoserver.web.GeoServerBasePage类是GeoServer中所有页面的基类。在org.geoserver.helloweb包中创建一个新类HelloPage,它由GeoServerBasePage页面扩展而来。packageorg.geoserver.helloweb; importorg.geoserver.web.GeoServerBasePage; publicclassHelloPageextendsGeoServerBasePage{ }2.     首先,我们需要实现它的构造函数。在Wicket里面,一个页面或组件都是在它的构造函数里面构建。我们的页面很简单,将会创建一个值为“HelloWorld!”的标签。importorg.apache.wicket.markup.html.basic.Label;...publicHelloPage(){add(newLabel("hellolabel","HelloWorld!"));}在上面代码中,创建了一个Label的实例。构造函数的第一个参数是组件id。在Wicket框架中每个组件都必须有一个自己的id。下一节中该id还会用于绑定这些组件到它的HTML表达上。Label构造函数的第二个参数是值,这里我们写的是“HelloWorld!”创建页面表达效果1.     页面完成后,接下来一步就是为页面创建HTML表达效果。创建一个名为HelloPage.html的页面,放在与HelloPagejava类同一目录下wicket:id="hellolabel">有几件事需要注意下。第一件是元素的使用,它会告诉wicket说HelloPage是另一个页面的扩展,本示例中是GeoServerBasePage,并且它会继承来自于这个页面的表达效果。元素的使用,它会告诉wicket说HelloPage是另一个页面的扩展,本示例中是GeoServerBasePage,并且它会继承来自于这个页面的表达效果。第二件事需要注意的是块元素的wicket:id属性,这是用来绑定标签与前一节中创建的Label组件。Wicket:id的值必须与组件中所给的id匹配,这里是“hellolabel”。标签与前一节中创建的Label组件。技术资料专业分享 WORD文档可编辑Wicket:id的值必须与组件中所给的id匹配,这里是“hellolabel”。块元素的wicket:id属性,这是用来绑定标签与前一节中创建的Label组件。Wicket:id的值必须与组件中所给的id匹配,这里是“hellolabel”。标签与前一节中创建的Label组件。Wicket:id的值必须与组件中所给的id匹配,这里是“hellolabel”。创建i18n文件在Wicket(或者任意一个网络应用程序框架),在该网络应用里面出现的任意字符串都应该国际化。在GeoServer里面,国际化是通过创建一个名为GeoServerApplication.properties的国际化(i18n)文件来实现。1.在src/main/java目录中创建i18n文件GeoServerApplication.properties:HelloPage.page.title=HelloHelloPage.page.description=Apagetosayhello上面的i18n文件申明了两个key,一个用于页面的标题,一个用于页面的说明。创建应用程序环境1.     最后一步是创建应用程序环境以告知GeoServer上一节中创建的页面。在hello_web模块根部src/main/resources目录。[hello_web]%mkdirsrc/main/resources2.在hello_rest模块根部,src/main/resources目录中添加如下applicationContext.xml文件: id="helloPage"class="org.geoserver.web.MenuPageInfo">name="id"value="helloPage"/>name="titleKey"value="HelloPage.page.title"/>name="descriptionKey"value="HelloPage.page.description"/>name="componentClass"value="org.geoserver.helloweb.HelloPage"/>上面的bean申明中申明了MenuPageInfo的一个实例,由GeoServer网络应用的主要页面链接的页面的描述器。titleKey的属性是页面的标题,它会接受上一节中创建的标题的i18n文件的值,descriptionKey也是对应如此。测试扩展到这,hello_web模块应该看上去如下所示:技术资料专业分享 WORD文档可编辑hello_web/pom.xmlsrc/main/javaapplicationContext.xmlGeoServerApplication.propertiesorg/geoserver/helloweb/HelloPage.javaHelloPage.html1.     构建hello_web模块[hello_web]%mvninstall2.     从hello_web/target目录拷贝hello_web-1.0-SNAPSHOT.jar文件到GeoServer安装的WEB-inf/lib目录中:[hello_web]%cptarget/hello-1.0-SNAPSHOT.jar/home/bob/geoserver-2.0/webapps/geoserver/WEB-INF/lib3.     启动GeoServer4.     浏览http://localhost:8080/geoserver/web如果成功了的话,在GeoServer主页的左侧就会出现一个标题为Hello的链接。单击该链接就会出现HelloPage页面。 技术资料专业分享 WORD文档可编辑技术资料专业分享

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭