WebX配置文件、啓動與響應流程

**

WebX配置文件、啓動與響應流程

**
最近幾天一直在看Spring的Ioc和AOP的源碼介紹,還有Webx的使用。看Spring的源代碼讓人眼花繚亂,webx的配置文件也會讓人感覺錯綜複雜無從下手。今天把之前看到的想到的webx相關的內容記下來,也當爲自己的學習做一個小小的總結。
這裏以經典的petstore項目爲例。
首先看配置文件。當然先看web-app文件夾了。
web-app下的文件和文件夾
文件夾下有common、home、store和user四個文件夾以及web.xml等6個XML文件。它們的作用是什麼呢?當然是配置web容器了。這麼多文件又是如何相互配合的呢?其中肯定是有相互的引用的。下面就來看一下。
首先是web.xml文件。這是最重要的一個文件,web應用啓動時就要根據其中的內容來加載容器了。看一下這個文件中的內容:
首先是三個context -param,分別配置了日誌系統的根目錄、日誌級別和日誌的編碼格式。這些就不用多說了。接下來是兩個重要的配置:Listener。一個是LogConfigurationListener,是日誌相關的;一個是WebxContextLoaderListener,這個與應用的容器相關的。它們的作用和工作原理稍後再來分析。Listener之後是兩個Filter,也是分別和日誌與容器相關:SetLoggingContextFilter和WebxFrameworkFilter。然後是兩個filtermapping和兩個servletmapping。
現在來看一下WebxContextLoaderListener。顧名思義,這是一個Listener,一個監聽器。看一下源代碼。而這一個監聽器是實現了ServletContextListener接口的。其中定義了兩個方法在前者實現了,一個是public void contextInitialized(ServletContextEvent sce);一個是public void contextDestroyed(ServletContextEvent sce);顯然兩個方法的參數是事件,而函數的作用就是對參數傳進來的事件作出反應:一個是容器“initialized“,一個是“Destroyed“,也就是說,在web應用啓動和銷燬的時候作出自己的響應,也就開始了和結束了容器的生命。
然後是兩個Filter,我們來看一下WebxFrameworkFilter。配置文件裏定義了filter-name、filter-class和兩個init參數。重要的是filter-class:WebxFrameworkFilter,其作用當然是對請求作過濾了。過濾的規則則是在兩個init參數中配置的。這個類繼承了FilterBean類。當應用啓動的時候,其init()方法被調用。這個函數中有一個功能就是取得了webxRootController。根據什麼獲取呢,這裏就用到了webx.xml以及webx-*.xml了(本文的目的是爲了分析配置文件之間的關係)。
webx.xml和webx-*.xml的語法相同,作用類似,內容也非常相似。對應的是父應用和子應用。先看webx.xml的內容。首先是幾個import。把其它幾個文件引用進來了:common/webx-component-and-root.xml、common/pipeline-exception.xml、common/resources.xml、common/uris.xml、common/template-data.xml這樣就把common文件夾下7個文件中的5個引用進來了。另外通過classpath資源,把其它模塊下的三個XML文件也引用進來了。這樣在應用中就會把所有的XML文件全部利用上了。以前老沒有看到其他文件有什麼用,這次終於明白了。但是還有一個問題,common文件夾下有7個文件,這裏僅僅import進來了5個,還有兩個(pipeline.xml和component.xml)呢?它們都應用的配置文件(webx-*.xml)中引用到了。下面看一下每一個配置文件的作用:
pipeline-exception.xml定義了對異常的響應,即遇到異常時用哪個頁面響應;
resources.xml則定義了各種資源及其響應的loader;
uris.xml定義了發生內部或外部重定向時URI的構造;
webx-component-and-root則定義了頁面渲染的相關功能以及對URL後綴的映射;
webx-component則將框架提供的服務提供給了應用;
pipeline則是起到閥門作用的數據流管道了,這裏決定了請求的方向。
此外對應着home、user和store三個文件夾下都有一個form.xml。這裏的form.xml當然爲應用提供表單驗證的功能。
至此,所有的配置文件的功能以及相互之間引用的關係已經分析完了。如果想對其進行擴展的話,可以自己寫一個XML文件,再被其他XML文件所import就可以了。
對配置文件的分析就到這裏了,下面再看一下請求數據流程(這一部分很多地方可以找到介紹的):
一個請求對應的URL的地址部分可以分成三個部分:服務器地址、web項目和子應用。當然服務器的地址就決定了這個請求是否到本臺服務器;然後再分發給某一個web應用比如說petstore。最後就送到了子應用或者具體的頁面上了。
當請求到達一個web應用內部的時候,首先請求的後綴會根據webx-component-and-root.xml中的配置做一次映射。之後請求就進入管道,其具體的流向就交由pipeline.xml決定了。pipeline中定義的操作首先是初始化tuibine,然後依次爲日誌上下文、URL分析獲取target(比較抽象的一個概念)、csrfToken的檢查和權限檢查;最後就是按照target來分發流向了。以後綴爲null(target-extension-condition extension=”null”)的情況爲例:首先是perforAction處理表單數據;然後是performTemplateScreen填充頁面內容;最後是renderTemplate 渲染頁面。其中Action和Screen對應的類分別在**.module.[action、screen]中。查找的規則是由內到外,由特定到默認的類名了。其中請求的流動過程中可能會發生重定向。這個時候爲了避免硬編碼中構造URL的不便,uris.xml就派上用場了。
此外在學習的過程中還遇到了佔位符的問題,在請教師兄時候才明白。例如webx.xml中的“$1“,就是說這是一個佔位符,可以被前邊的place-holder定義的內容來替換。
今天的內容先寫這些,主要是爲自己這幾天的學習做一點知識沉澱,還有很不多不清楚或者講不清楚的地方,希望大家能一起交流。

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