GeoServer的Http請求派發過程------GeoServer研究隨筆一

    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聲明

    <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>
    類似的還有一些,請參閱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中聲明如下:

    <bean id="dispatcher" class="org.geoserver.ows.Dispatcher">

    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&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類庫爲基礎實現。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章