GeoServer源码解析和扩展
GeoServer源码解析和扩展
一 缘起
一直在使用GeoServer,从来没关心它的实现。也是GeoServer设计的实在太好,下载,安装,启动页面,根本不费力。这是其一,其二,GeoServer遵循OpenGIS的开放标准WMS,WFS,WCS,这3个标准涵盖了大部分WebGIS基础应用,一般情况下不太需要在服务端做什么开发了。
那么会不会有不一般的情况呢?如果直接用GeoServer实现业务级别的REST服务是不是会更高效呢?如果搞清楚它的结构遇到奇怪问题时是不是就不必到处求人了呢?如果,也许只是如果,有一天你自己不得不实现一个服务器,今天的学习是不是会有所帮助呢?除去以上原因,难道你就不想知道它是怎么工作的吗?好了,不再废话了,让我们赶快开始吧。
二 预备
1)下载源码,我使用的是最新稳定版2.0.2;
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包的org.geoserver.platform.Service类代表一个具体的服务,例如WMS,它用ID和VERSION来唯一标定,每一个服务都会提供若干操作(Operation);
2)platform包的org.geoserver.platform.Operation类代表某个服务下可以被请求的操作,例如GetCapabilities,这个类利用Java的反射机制;
3)ows包的org.geoserver.ows.Dispatcher类处理所有OWS的请求,这个类将是我们调试的重点,我们会在后面的章节详细描述它;
4)main包的org.geoserver.catalog.Catalog接口包含资源访问的方法,这些资源有“Layer”,“Layer Group”,“Map”,“Namesapce”,“Resource”,“Store”,“Style”和“Workspace”,我们会在后面对这些资源做详细的讲解,了解了它们就知道GeoServer是如何组织和使用数据的了;
5)main包的org.geoserver.config.GeoServer接口包含访问服务器公共配置信息的方法,我们将会在很多场合看到它;
6)main包里面还有一些描述资源的接口,例如org.geoserver.catalog.LayerInfo代表“Layer”资源,这些接口我们也会在后面的章节逐一介绍。
四 第三方库
GeoServer使用了近百个第三方软件包(丰富第三方软件包也许是Java最迷人也最迷惑人的地方)。下面我会介绍一些我认为比较重要或者比较有趣的:
1)GeoTools可以说是Java语言的GIS标准包,它继承了GeoAPI,一个符合OGC简单要素访问协议(Simple Feature Access)的Java包,提供了大量GIS操作,包括多种格式的空间数据源访问,地图渲染,空间几何操作,GeoServer的GIS部分完全使用它来实现;
2)SpringFramework是一个程序框架(wiki的解释),GeoServer用它来构建运行时环境,我们会在“main”,“wcs”,“wfs”和“wms”下面看到这样一个文件“applicationContext.xml”,这个文件告诉spring框架需要创建哪些类实例,以及如何创建。下面来看个典型配置:
这是“main”的配置文件的一部分,它构建一个基本的运行环境;
3)FreeMarker是一个模板引擎(官网的定义),用它提供的模板语言,我们可以很容易实现对象模型与输出格式的分离,GeoServer用它来实现某些HTML文本的输出(我觉得GeoServer对FreeMarker的使用还不够充分,我会把所有的文本输出全部交给它来完成)。
五 预演
本文的最后让我们来看看我们将如何深入GeoServer的代码。方法很简单,就是下断点然后跟踪调试。我们知道WMS里面最基本的方法是GetCapabilities,因此我们在wms包里寻找与“GetCapabilities”相关的内容,很快就发现了类org.vfny.geoserver.wms.responses.WMSCapabilitiesResponse,姑且先不管它是什么反正和GetCapabilities有关,在继续查看了它的代码后,确认“execute”函数是关键。我们启动程序,然后在execute里面下断点,如下图:
现在我们在浏览器里敲入这个地址“http://localhost:8080/geoserver/wms?request=getCapabilities”,回车。程序停留在断点处,这时我们重点来看调用栈,如下图:
我们发现,原来调用是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,最终我们会完全弄清楚它的工作原理,并且学会如何对它进行扩展。
GeoServer源码解析和扩展相关推荐
- GeoServer源码解析和扩展 (三)结构篇
转自:http://www.cnblogs.com/sillyemperor/archive/2011/01/26/1933248.html 上一章我们通过实现一个服务对如何扩展GeoServer有了 ...
- GeoServer源码解析栅格数据Image Mosaic JDBC插件原理(一)GDAL生产影像切片
1. 作者声明 GeoServer源码解析栅格数据Image Mosaic JDBC插件原理共分三篇幅 (一)GDAL生产影像切片 (二)GeoTools Image Mosaic JDBC插件源码解 ...
- 4.MyBatis源码解析-MyBatis扩展点--阿呆中二
MyBatis扩展点 MyBatis MyBatis扩展点 与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程.SqlSession构建流 ...
- Dubbo的可扩展机制SPI源码解析
内容概要: Dubbo SPI案例演示 Dubbo SPI主流程源码解析 Dubbo中的依赖注入源码解析 Dubbo中的AOP实现源码解析 Dubbo中的Adaptive机制源码解析 文章目录 一.D ...
- Dubbo第三讲:Dubbo的可扩展机制SPI源码解析
本文是Dubbo第三讲:Dubbo的可扩展机制SPI源码解析 文章目录 1.Dubbo SPI机制 1.1.Dubbo具有良好拓展性的原因 1.2.Dubbo SPI和Java SPI的区别? 1.3 ...
- libev源码解析——监视器(watcher)结构和组织形式
在<libev源码解析--总览>中,我们介绍了libev的一些重要变量在不同编译参数下的定义位置.由于这些变量在多线程下没有同步问题,所以我们将问题简化,所提到的变量都是线程内部独有的,不 ...
- Simple Dynamic Strings(SDS)源码解析和使用说明二
在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...
- Java集合---LinkedList源码解析
一.源码解析 1. LinkedList类定义 2.LinkedList数据结构原理 3.私有属性 4.构造方法 5.元素添加add()及原理 6.删除数据remove() 7.数据获取get() 8 ...
- 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现
写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...
- kube-proxy源码解析
kube-proxy源码解析 ipvs相对于iptables模式具备较高的性能与稳定性, 本文讲以此模式的源 码解析为主,如果想去了解iptables模式的原理,可以去参考其实现,架构上无差别. ku ...
最新文章
- 简述平均池化和最大池化
- MAC能登录微信,浏览器连不上网
- Docker Machine-Windows
- angular4 学习日志(一 依赖注入)
- php中的rtrim_php中ltrim()、rtrim()与trim()删除字符空格实例
- 《SAS编程与数据挖掘商业案例》学习笔记之十三
- com.sun.jersey.api.client.UniformInterfaceException:returned a response status of 403
- 红橙Darren视频笔记 AOP简介
- sem_wait sem_post信号量操作进本函数
- win10推荐的锁屏壁纸该怎么保存 win10休眠锁屏壁纸保存
- C++ STL priority_queue的正确使用方法
- vc对图像进行平移,转置等几何变换
- 【数字全排列】LeetCode 47. Permutations II
- 睡眠时间 数据_我测试了Apple Watch睡眠追踪以节省您的时间和电池寿命
- 常用4种基础统计图表——饼图、条形图、直方图、折线图
- “消费盲返”为什么可以在短短几天迅速爆火?
- iMindMap12免费下载安装激活教程及如何免费用思维导图学习
- JVM之枚举GC Roots 根节点,安全点,安全区域。
- CDNow网站用户消费行为分析
- php建站: 2019年最好用的6个php环境搭建工具推荐
热门文章
- python语言电脑安装_教你如何安装Python环境
- 【校内测 11.1】 【数学题】 [LnOI2019SP]快速多项式变换(FPT)
- 潍坊青州AAA企业信用评级申请条件和流程
- [Ubuntu] 14.04 关闭桌面
- 2个红外传感器循迹原理_PM2.5传感器中,激光、红外原理之间的区别
- 选对墨镜,让你的脸型更完美
- 2021江苏高考历年成绩查询入口,2021江苏省公务员考试成绩公布时间_江苏省考成绩查询入口...
- 阿里云服务器 phpstudy 搭建多个网站并配置多域名
- 【青梅快讯】Greenplum关键组件版本更新:GPSS 1.6.0和GPCC 6.5已发布
- “九韶杯”[友谊纽带] 喊山 (30 分) 小字辈 bfs,dfs求距离