轉自:http://blog.csdn.net/suen/article/details/4808860
開始正式的分析了,先分析WMS工程。
GeoServer的WMS工程的包如下所示:
| org.geoserver.wms |
包含對wms請求進行響應的WebMapService接口、缺省實現DefaultWebMapService、服務配置信息WMSInfo、 WMS加載類以及水印等相關類。DefaultWebMapService類將GetMap等操作轉發給具體Bean組件去操作,如wmsGetMap。 |
| org.geoserver.wms.kvp |
名稱-值對(kvp)相關解析類 |
| org.geoserver.wms.responses |
對WMS的輸出進行加強,如metatile式輸出。 |
| org.geoserver.wms.responses.decoration |
在WMS輸出上添加裝飾,如圖例、比例尺、水印等。 |
| org.geoserver.wms.util |
包含WMS輔助類,現只包含輔助構造WMS請求的WMSRequests類 |
| org.geoserver.wms.xml |
現只包含對SLD請求XML進行讀取的類SLDXmlRequestReader。 |
| org.vfny.geoserver.config |
配置模型,主要的類為WMSConfig。 |
| org.vfny.geoserver.global |
保存應用程序信息,里面只有一個類WMS,已被org.geoserver.wms的WMSInfo接口取代。 |
| org.vfny.geoserver.sld |
現只包含對SLD異常進行處理的類SldException |
| org.vfny.geoserver.sld.requests |
對WMS中SLD請求進行讀取的類 |
| org.vfny.geoserver.sld.responses |
對WMS中SLD進行響應的類 |
| org.vfny.geoserver.wms |
包含WMS一些操作的響應接口,其中最重要的是GetMapProducer接口,各種格式Map的生成都實現這個接口,包括 AbstractGetMapProducer, AbstractRasterMapProducer, AtomGeoRSSMapProducer, DefaultRasterMapProducer, GeoTiffMapProducer, GIFMapProducer, JPEGMapProducer, KMLMapProducer, KMZMapProducer, MetatileMapProducer, OpenLayersMapProducer, PNGMapProducer, RSSGeoRSSMapProducer, SvgMapProducerProxy, TiffMapProducer等 |
| org.vfny.geoserver.wms.requests |
包含對WMS請求進行讀取的類。 |
| org.vfny.geoserver.wms.requests.readers |
包含WmsXmlRequestReader類。 |
| org.vfny.geoserver.wms.responses |
對WMS進行響應的包,包含各種格式Map的生成類。 |
| org.vfny.geoserver.wms.responses.featureInfo |
|
| org.vfny.geoserver.wms.responses.helpers |
包含對WMS進行響應的一些工具類,如DescribeLayerTransformer、JAISupport、WMSCapsTransformer。 |
| org.vfny.geoserver.wms.responses.legend.gif |
包含GIF格式的圖例的生成和轉換類 |
| org.vfny.geoserver.wms.responses.legend.jai |
包含JAI庫支持的格式的圖例的生成和轉換類 |
| org.vfny.geoserver.wms.responses.legend.png |
包含PNG格式的圖例的生成和轉換類 |
| org.vfny.geoserver.wms.responses.legend.raster |
|
| org.vfny.geoserver.wms.responses.map.georss |
包含GeoRSS格式的Map的生成和轉換類,如AtomGeoRSSMapProducer、RSSGeoRSSMapProducer等 |
| org.vfny.geoserver.wms.responses.map.geotiff |
包含GeoTiff格式的Map的生成和轉換類GeoTiffMapProducer |
| org.vfny.geoserver.wms.responses.map.gif |
包含GIF格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.jpeg |
包含JPEG格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.kml |
包含KML格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.metatile |
包含瓦片形式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.openlayers |
包含Openlayers形式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.pdf |
包含PDF格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.png |
包含PNG格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.svg |
包含SVG格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.tiff |
包含TIFF格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.palette |
包含與顏色盤相關的類 |
| org.vfny.geoserver.wms.servlets |
對wms操作進行響應的實際servlet類,包括GetMap、Capabilities、DescribeLayer、GetFeatureInfo、GetLegendGraphic、GetMapLegacy、KMLReflector、WMService等 |
GeoServer的WMS工程的包如下所示:
| org.geoserver.wms |
包含對wms請求進行響應的WebMapService接口、缺省實現DefaultWebMapService、服務配置信息WMSInfo、 WMS加載類以及水印等相關類。DefaultWebMapService類將GetMap等操作轉發給具體Bean組件去操作,如wmsGetMap。 |
| org.geoserver.wms.kvp |
名稱-值對(kvp)相關解析類 |
| org.geoserver.wms.responses |
對WMS的輸出進行加強,如metatile式輸出。 |
| org.geoserver.wms.responses.decoration |
在WMS輸出上添加裝飾,如圖例、比例尺、水印等。 |
| org.geoserver.wms.util |
包含WMS輔助類,現只包含輔助構造WMS請求的WMSRequests類 |
| org.geoserver.wms.xml |
現只包含對SLD請求XML進行讀取的類SLDXmlRequestReader。 |
| org.vfny.geoserver.config |
配置模型,主要的類為WMSConfig。 |
| org.vfny.geoserver.global |
保存應用程序信息,里面只有一個類WMS,已被org.geoserver.wms的WMSInfo接口取代。 |
| org.vfny.geoserver.sld |
現只包含對SLD異常進行處理的類SldException |
| org.vfny.geoserver.sld.requests |
對WMS中SLD請求進行讀取的類 |
| org.vfny.geoserver.sld.responses |
對WMS中SLD進行響應的類 |
| org.vfny.geoserver.wms |
包含WMS一些操作的響應接口,其中最重要的是GetMapProducer接口,各種格式Map的生成都實現這個接口,包括 AbstractGetMapProducer, AbstractRasterMapProducer, AtomGeoRSSMapProducer, DefaultRasterMapProducer, GeoTiffMapProducer, GIFMapProducer, JPEGMapProducer, KMLMapProducer, KMZMapProducer, MetatileMapProducer, OpenLayersMapProducer, PNGMapProducer, RSSGeoRSSMapProducer, SvgMapProducerProxy, TiffMapProducer等 |
| org.vfny.geoserver.wms.requests |
包含對WMS請求進行讀取的類。 |
| org.vfny.geoserver.wms.requests.readers |
包含WmsXmlRequestReader類。 |
| org.vfny.geoserver.wms.responses |
對WMS進行響應的包,包含各種格式Map的生成類。 |
| org.vfny.geoserver.wms.responses.featureInfo |
|
| org.vfny.geoserver.wms.responses.helpers |
包含對WMS進行響應的一些工具類,如DescribeLayerTransformer、JAISupport、WMSCapsTransformer。 |
| org.vfny.geoserver.wms.responses.legend.gif |
包含GIF格式的圖例的生成和轉換類 |
| org.vfny.geoserver.wms.responses.legend.jai |
包含JAI庫支持的格式的圖例的生成和轉換類 |
| org.vfny.geoserver.wms.responses.legend.png |
包含PNG格式的圖例的生成和轉換類 |
| org.vfny.geoserver.wms.responses.legend.raster |
|
| org.vfny.geoserver.wms.responses.map.georss |
包含GeoRSS格式的Map的生成和轉換類,如AtomGeoRSSMapProducer、RSSGeoRSSMapProducer等 |
| org.vfny.geoserver.wms.responses.map.geotiff |
包含GeoTiff格式的Map的生成和轉換類GeoTiffMapProducer |
| org.vfny.geoserver.wms.responses.map.gif |
包含GIF格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.jpeg |
包含JPEG格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.kml |
包含KML格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.metatile |
包含瓦片形式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.openlayers |
包含Openlayers形式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.pdf |
包含PDF格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.png |
包含PNG格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.svg |
包含SVG格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.map.tiff |
包含TIFF格式的Map的生成和轉換類 |
| org.vfny.geoserver.wms.responses.palette |
包含與顏色盤相關的類 |
| org.vfny.geoserver.wms.servlets |
對wms操作進行響應的實際servlet類,包括GetMap、Capabilities、DescribeLayer、GetFeatureInfo、GetLegendGraphic、GetMapLegacy、KMLReflector、WMService等 |
以一個完整的WMS訪問過程來分析WMS工程中代碼執行的過程。
一、HTTP GET請求
WMS的請求一般使用HTTP Get的形式直接從地址欄輸入或者通過JS代碼發送到服務器端。請求的格式如下所示:
http://localhost:8080/geoserver /wms?bbox=-74.01199448397661,40.70732689845813,-74.00841053684495,40.71216558957052&styles=&Format=application/openlayers&request=GetMap&version=1.1.1&layers=tiger:poi&width=457&height=550&srs=EPSG:4326,該請求中wms是要請求的服務,version=1.1.1是請求的wms版本,GetMap是請求的服務方法,tiger:poi是要訪問的地理數據。
二、HTTP 派發
GeoServer的MVC架構是建立在Spring的Web MVC的基礎之上的。Spring Web MVC的核心控制類是org.springframework.web.servlet.DispatcherServlet。HTTP請求一般都先發送給這個Servlet,做一些HTTP請求的通用處理(比如文件上載)后,通過合適的派發機制轉發給不同的Spring容器中的Bean,也就是不同業務邏輯、服務處理的控制器(Logic Control),由這些控制器結合不同模型(Model),如空間數據模型、屬性數據模型、地圖樣式模型等,進行處理,形成結果模型,並經 DispatcherServlet返回客戶端。
org.springframework.web.servlet.DispatcherServlet相關配置位於GeoServer的Web工程的配置文件web.xml中。
1、Servlet聲明
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
2、URL Mapping
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/wms/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/wcs/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/wfs/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/ows/*</url-pattern>
</servlet-mapping>
這說明,對於/wms/*、/wcs/*、/wfs/*、/ows/*等地址的請求,都會調用org.springframework.web.servlet.DispatcherServlet對象來響應。
三、org.springframework.web.servlet.DispatcherServlet派發流程
在Spring框架下,org.springframework.web.servlet.DispatcherServlet基於每個工程的applicationContext.xml的配置,將請求轉發給專門的對象處理。其中,根據wms工程的配置,wms除putstyles路徑下的請求,都由dispatcher處理。
<!-- http url mapping -->
<bean id="wmsURLMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="alwaysUseFullPath" value="true"/>
<property name="mappings">
<props>
<prop key="/wms">dispatcher</prop>
<prop key="/wms/putstyles">putStylesWrapper</prop>
<prop key="/wms/*">dispatcher</prop>
</props>
</property>
</bean>
關於dispatcher對象的配置在main工程的applicationContext.xml,處理對象的類是org.geoserver.ows.Dispatcher。
<!-- dispatcher -->
<bean id="dispatcher" class="org.geoserver.ows.Dispatcher">
<!--
See the applicationSecurityContext document. You can safely remove this
if in need for playing with a non secure version of Geoserver
-->
<property name="securityInterceptor">
<ref bean="operationSecurityInterceptor"/>
</property>
</bean>
org.geoserver.ows.Dispatcher繼承自spring框架的AbstractController類。它對於HTTP請求的處理是在handleRequestInternal(HttpServletRequest httpRequest, HttpServletResponse httpResponse)中處理。此函數再調用本身的execute(Request req, Operation opDescriptor),先分析出請求的服務(Service)、版本(Version)、操作(Operation),然后根據配置信息與GeoServerExtensions匹配找到服務處理的Bean,wms的配置信息如下所示。
<!-- wms service + descriptor -->
<bean id="wmsService2" class="org.geoserver.wms.DefaultWebMapService">
<constructor-arg ref="wms"/>
</bean>
<alias name="wmsService2" alias="webMapService"/>
<bean id="wmsServiceDescriptor" class="org.geoserver.platform.Service">
<constructor-arg index="0" value="wms"/>
<constructor-arg index="1" ref="wmsService2"/>
<constructor-arg index="2" value="1.1.1"/>
</bean>
此配置信息說明對於服務ID為wms的操作,由org.geoserver.wms.DefaultWebMapService來使用與操作同名的函數來處理。
這樣,對於下面的請求:
http://localhost:8080/geoserver /wms?bbox=-74.01199448397661,40.70732689845813,-74.00841053684495,40.71216558957052&styles=&Format=application/openlayers&request=GetMap&version=1.1.1&layers=tiger:poi&width=457&height=550&srs=EPSG:4326
將由org.geoserver.wms.DefaultWebMapService的getMap函數來處理。
四、org.geoserver.wms.DefaultWebMapService的getMap函數處理過程
此函數先根據配置信息得到wmsGetMap對象,所屬類是org.vfny.geoserver.wms.servlets.GetMap。
<bean id="wmsGetMap"
class="org.vfny.geoserver.wms.servlets.GetMap"
parent="wmsService">
</bean>
然后執行此對象的getResponse()方法。然后創建一個GetMapResponse對象。
五、寫輸出
寫輸出是通過執行org.geoserver.ows.Dispatcher的void response(Object result, Request req, Operation opDescriptor)函數。此函數先循環搜索和排序響應類集合responses(List responses = GeoServerExtensions.extensions(Response.class);),確定響應類response (Response response = (Response) responses.get(0);),再根據輸出策略outputStrategy(ServiceStrategy outputStrategy = findOutputStrategy(req.httpResponse);)進行輸出。
具體執行在set the mime type時(req.httpResponse.setContentType(response.getMimeType(result, opDescriptor));)調用ResponseAdapter的getMimeType(Object value, Operation operation)函數,此函數再調用delegate.execute(request)來執行(delegate即第四步創建的GetMapResponse對象)。最終的執行在GetMapResponse對象的execute(Request req)函數。
