geoserver 开发1
打开项目,会看见下面这些包(其实还有很多插件之类的包,我都删除了)
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,最终我们会完全弄清楚它的工作原理,并且学会如何对它进行扩展。
转自:http://www.cnblogs.com/sillyemperor/archive/2011/01/05/1926093.html
欢迎大家来我的新家看一看 3wwang个人博客-记录走过的技术之路
geoserver 开发1的更多相关文章
- Oracle spatial、openlayers、geoserver开发地理信息系统总结
感谢开源,使用OpenLayers+Geoserver的地理信息系统开发很简单,完全可以套用开发MIS系统的经验,我这里总结为三个步骤: 1.数据准备 2.数据发布 3.数据展现 我将按照这个思路来介 ...
- geoserver 开发2
先上源码下载 上一章我们介绍了GeoServer源码分析的必要性(这个就见仁见智了)以及诸项准备工作,并且在最后还给出了OWS请求处理流程的伪代码. 这一章我们来看看要注册自己的服务需要做哪些工作.假 ...
- geoserver扫盲 openlayers相关
转自:http://www.cnblogs.com/lzlynn/archive/2008/07/29/1255702.html WMS: Web Map Service(Web地图服务 ) l 利 ...
- [转]Geoserver全面了解
From:http://www.cnblogs.com/ada-zheng/archive/2013/07/16/3192921.html Geoserver是一个功能齐全,遵循OGC开放标准的开源W ...
- Geoserver
Geoserver是一个功能齐全,遵循OGC开放标准的开源WFS-T和WMS服务器.利用Geoserver可以把数据作为maps/images来发布(利用WMS来实现)也可以直接发布实际的数据(利用W ...
- 符合我公司GIS开源解决方案的探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一周,我对GIS开源解决方案中涉及到的开源软件以及相关技术 ...
- GeoPackage - 一个简便轻量的本地地理数据库
GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件.与操作系统无关的地理数据库. 当前标准是1.2.1,该版本的html版说明书:https://www.geopackag ...
- 简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 通过GeoServer发布的服务,在GeoServer内部有 ...
- GeoServer地图开发解决方案
转自:http://www.cnblogs.com/beniao/archive/2011/01/08/1930822.html GeoServer 是 OpenGIS Web 服务器规范的 J2EE ...
随机推荐
- PCIe Max_Payload_Size 和 Max_Read_Request_Size
最近PCIe在SSDFans上镜率挺高,那我们来聊两句MAX_READ_REQUEST_SIZE 和MAX_PAYLOAD_SIZE. 这两个东西都在PCIe Capability Structure ...
- Linux常用命令的命名来源
很多人在学习Linux的时候会疑惑:这么多的Linux名,他们都是怎么被定义的?林纳斯是怎么制定如此花样繁多且数量庞大的命令?今天这篇文章可能会帮你解开疑惑. ## 1. 目录缩写 缩写 | 全称 | ...
- video元素和audio元素
内容: 1.video元素 2.audio元素 注:这两个元素均是HTML5新增的元素 1.video元素 (1)用途 <video> 标签定义视频,比如电影片段或其他视频流 (2)标签属 ...
- Tensorflow图像操作
图像操作 图像基本概念 在图像数字化表示当中,分为黑白和彩色两种.在数字化表示图片的时候,有三个因素.分别是图片的长.图片的宽.图片的颜色通道数.那么黑白图片的颜色通道数为1,它只需要一个数字就可以表 ...
- 15.python操作mysql
导入包 from pymysql import* 1. 创建 Connection 连接 conn=conne(host='192.168.13.130',port=3306 ,database='' ...
- OpenACC parallel
▶ 使用 kernels 导语并行化 for 循环 ● 同一段代码,使用 kernels,parallel 和 parallel + loop 进行对比 #include <stdio.h> ...
- mysql5.7.13 使用笔记
社区版下载地址:https://dev.mysql.com/downloads/mysql/ 安装:http://www.linuxidc.com/Linux/2016-04/130414.htm ...
- HTML5 Canvas ( 扩展context('2d') ) CanvasRenderingContext2D.prototype.你的方法名
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- leetcode401
public class Solution { /// <summary> /// 将二进制字符串转为十进制数字 /// </summary> /// <param na ...
- Linux批量查询替换字符串
Linux 批量查询替换文本文件中的字符串: 1.批量查找某个目下文件的包含的内容,例如: # grep -rn "要找查找的文本" ./ 2.批量查找并替换文件内容. # ...