GeoServer学习手记(七):Servlet及HTTP派发过程之四

GeoServer学习手记(七):Servlet及HTTP派发过程之四

粟卫民http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2009-11-11

保留所有版权。如需转载,请联系作者,并在醒目位置注明出处

前面介绍了GeoServer的1.6版本之前的HTTP派发过程(http://blog.csdn.net/suen/archive/2009/11/02/4759332.aspx),现在来介绍1.6版之后的派发过程。

1.6版之后的HTTP派发过程

在1.6版之后,GeoServer使用了OWS Dispatching System。它基于Spring Web MVC框架,先把HTTP请求都可以发送到核心控制类org.springframework.web.servlet.DispatcherServlet(前置控制器(Pre Control)),做一些HTTP请求的通用处理(比如文件上载)后,通过合适的派发机制转发给不同的Spring容器中的Bean,也就是不同业务逻辑、服务处理的控制器 (Logic Control),由这些控制器结合不同模型(Model),如空间数据模型、属性数据模型、地图样式模型等,进行处理,形成结果模型,并经 DispatcherServlet返回客户端。从而在Spring的Web MVC的基础上形成GeoServer的MVC架构实作。

具体可参考:GeoServer的Http请求派发过程,(http://blog.csdn.net/mingo99/archive/2009/06/19/4282792.aspx,为了方便起见,转载到下面,如原作者不同意,请联系我删除。)

GeoServer是著名的、遵循OGC规范的、开源的WebGIS实现之一,其应用Spring的Web MVC作为OGC服务外部HTTP请求处理框架,把HTTP请求分派给WMS、WFS、WCS等服务实现,这些服务实现则基于Geotools库提供的功能来完成。以下以GetMap HTTP请求总结说明派发过程。(OGC服务之外,GeoServer的管理及其他一些功能实现则基于Struts架构)。

Spring Web MVC的核心控制类org.springframework.web.servlet.DispatcherServlet,也就是前置控制器(Pre Control),任何HTTP请求都可以发送给这个Servlet,做一些HTTP请求的通用处理(比如文件上载)后,通过合适的派发机制转发给不同的 Spring容器中的Bean,也就是不同业务逻辑、服务处理的控制器(Logic Control),由这些控制器结合不同模型(Model),如空间数据模型、属性数据模型、地图样式模型等,进行处理,形成结果模型,并经 DispatcherServlet返回客户端。从而在Spring的Web MVC的基础上形成GeoServer的MVC架构实作。

一、GeoServer的Web工程的配置文件web.xml中说明了那些URL要传递到DispatcherServlet:

1、Servlet声明

 

dispatcher

org.springframework.web.servlet.DispatcherServlet

 

2、URL Mapping

 

dispatcher

/wms/*

 

 

dispatcher

/wcs/*

 

 

dispatcher

/wfs/*

 

 

dispatcher

/ows/*

 

类似的还有一些,请参阅web.xml。

二、不同GeoServer的工程Spring配置文件applicationContext.xml中通过 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping说明不同的URL路径需要不同的业务逻辑控制器做进一步处理。

工程wms、wfs、web、wcs、wcs1_1、rest、gwc等,都有类似的说明,并说明了GeoServer的控制器dispatcher、 putStylesWrapper、filePublisher、restWrapper、gwcRestDispatcher、 geowebcacheDispatcher、geowebcacheDispatcher等做进一步处理。

其中OGC的GetMap请求是由dispatcher做处理的,其在main工程的配置文件applicationContext.xml中声明如下:

 

GeoServer的Dispatcher类扩展 org.springframework.web.servlet.mvc.AbstractController,并通过 AbstractController实现Spring DispatcherServlet要求的接口org.springframework.web.servlet.mvc.Controller。

三、GeoServer Dispatcher从HTTP请求中取得要访问的服务和要执行的操作以及操作参数,并调用对应的Bean服务方法。 http://localhost:8080/geoserver /wms?bbox=-74.01199448397661,40.70732689845813,-74.00841053684495,40.71216558957052& amp;styles=&Format=application/openlayers&request=GetMap& version=1.1.1&layers=tiger:poi&width=457&height=550& srs=EPSG:4326,该请求中wms是要请求的服务,GetMap是请求的服务方法,tiger:poi是要访问的地理数据。 Dispatcher找到到服务实现封装类DefaultWebMapService,调用其getMap方法,getMap方法进一步找到服务方法的实现类GetMap,由GetMap找到合适的GetMapProducer实现,并调用该Producer类的相关方法,形成最终要返回到客户端的结果。 GetMapProducer的子类有很多,如PNGMapProducer、PDFMapProducer等,根据请求的不同获得不同的 Producer并生成不同的结果。相关Producer一般以GeoTools类库为基础实现。

转载自:https://blog.csdn.net/suen/article/details/4799572

You may also like...