GeoServer源码解析和扩展

GeoServer源码解析和扩展
GeoServer源码解析和扩展
⼀ 缘起
⼀直在使⽤GeoServer,从来没关⼼它的实现。也是GeoServer设计的实在太好,下载,安装,启动页⾯,根本不费⼒。这是其⼀,其⼆,GeoServer遵循OpenGIS的开放标准WMS,WFS,WCS,这3个标准涵盖了⼤部分WebGIS基础应⽤,⼀般情况下不太需要在服务端做什么开发了。
那么会不会有不⼀般的情况呢?如果直接⽤GeoServer实现业务级别的REST服务是不是会更⾼效呢?如果搞清楚它的结构遇到奇怪问题时是不是就不必到处求⼈了呢?如果,也许只是如果,有⼀天你⾃⼰不得不实现⼀个服务器,今天的学习是不是会有所帮助呢?除去以上原因,难道你就不想知道它是怎么⼯作的吗?好了,不再废话了,让我们赶快开始吧。
⼆ 预备
1)下载源码,我使⽤的是最新稳定版;
2)下载⼯具,JDK,Eclipse,Maven,SVN,这些东东可以去官⽹下载;
数控回转工作台设计3)跟着,产⽣Eclipse项⽬(这个过程⽐较耗时);
4)打开项⽬,会看见下⾯这些包(其实还有很多插件之类的包,我都删除了)
5)可以从Eclipse启动GeoServer了。
风切变如果你已经安装了GeoServer,现在也可以打开它的登陆页⾯进⾏操作。
三 结构
在深⼊代码之前,先来熟悉⼀下代码的结构。所有“web”打头的包暂时可以不关⼼,注意⼒集中
在“platform”,“main”,“ows”,“wfs”,“wcs”,“wms”这6个包上。我简单介绍下它们的关系,下图
展现了包之间的依赖关系,下⾯的包依赖上⾯的包,最顶端是“platform”。
“platform”,“ows”和“main”(这3个完全可以合在⼀起嘛)包含了GeoServer最基础最核⼼的类和接⼝,下⾯介绍⼀些重要的类和接⼝,“wfs”,“wcs”,“wms”将利⽤这些类来完成具体的功能:
1)platform包的server.platform.Service类代表⼀个具体的服务,例如WMS,它⽤ID和VERSION来唯⼀标定,每⼀个服务都会提供若⼲操作(Operation);
2)platform包的server.platform.Operation类代表某个服务下可以被请求的操作,例如GetCapabilities,这个类利⽤Java的反射机制;
3)ows包的server.ows.Dispatcher类处理所有OWS的请求,这个类将是我们调试的重点,我们会在后⾯的章节详细描述它;
4)main包的server.catalog.Catalog接⼝包含资源访问的⽅法,这些资源有“Layer”,“Layer
Group”,“Map”,“Namesapce”,“Resource”,“Store”,“Style”和“Workspace”,我们会在后⾯对这些资源做详细的讲解,了解了它们就知道GeoServer是如何组织和使⽤数据的了;
5)main包的fig.GeoServer接⼝包含访问服务器公共配置信息的⽅法,我们将会在很多场合看到它;天津铁通
6)main包⾥⾯还有⼀些描述资源的接⼝,例如server.catalog.LayerInfo代表“Layer”资源,这些接⼝我们也会在后⾯的章节逐⼀介绍。
四 第三⽅库
童年的发现教学设计GeoServer使⽤了近百个第三⽅软件包(丰富第三⽅软件包也许是Java最迷⼈也最迷惑⼈的地⽅)。下⾯我会介绍⼀些我认为⽐较重要或者⽐较有趣的:
1)GeoTools可以说是Java语⾔的GIS标准包,它继承了GeoAPI,⼀个符合OGC简单要素访问协议()的Java包,提供了⼤量GIS操作,包括多种格式的空间数据源访问,地图渲染,空间⼏何操作,GeoServer的GIS部分完全使⽤它来实现;
2)SpringFramework是⼀个程序框架(wiki的解释),GeoServer⽤它来构建运⾏时环境,我们会
在“main”,“wcs”,“wfs”和“wms”下⾯看到这样⼀个⽂件“l”,这个⽂件告诉spring框架需要创建哪些类实例,以及如何创建。下⾯来看个典型配置:
这是“main”的配置⽂件的⼀部分,它构建⼀个基本的运⾏环境;
3)FreeMarker是⼀个模板引擎(官⽹的定义),⽤它提供的模板语⾔,我们可以很容易实现对象模型与输出格式的分离,GeoServer⽤它来实现某些HTML⽂本的输出(我觉得GeoServer对FreeMarker的使⽤还不够充分,我会把所有的⽂本输出全部交给它来完成)。
五 预演
本⽂的最后让我们来看看我们将如何深⼊GeoServer的代码。⽅法很简单,就是下断点然后跟踪调试。我们知道WMS⾥⾯最基本的⽅法是GetCapabilities,因此我们在wms包⾥寻与“GetCapabilities”相关的内容,很快就发现了类
数理化解题研究
sponses.WMSCapabilitiesResponse,姑且先不管它是什么反正和GetCapabilities有关,在继续查看了它的代码后,确认“execute”函数是关键。我们启动程序,然后在execute⾥⾯下断点,如下图:
我们发现,原来调⽤是Dispatcher的response⽅法传递来的。打开Dsipatcher类的代码仔细查看,很快(其实花了我半天的时间)理清了它处理请求的过程,⽤伪代码描述如下:
//解析HTTP请求,创建请求参数
var request = parseRequestParams(requestURL);
//通过SERVICE和VERSION来寻合适的服务对象
首都休闲大学var service = findService(request.SERVICE,request.VERSION);
//创建执⾏对象
var operation = buildOperation(service,request.REQUEST,request.PARAMS);
//执⾏操作,返回结果
var result = execute(operation);
//将结果写⼊返回流
response(result,request,operation);
到此我们可以确定Dispatcher类是处理请求的核⼼,⼀切就从这⾥开始。下⼀章我们将⽤同样的流程来分析GeoServer,最终我们会完全弄清楚它的⼯作原理,并且学会如何对它进⾏扩展。

本文发布于:2024-09-25 16:32:05,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/172334.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   访问   介绍
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议