說說ROLLER的PageServlet類

發現網上roller可參考的東西很少,都是些如何安裝部署的文章,無疑對我們這些有點小小水平的幫助不大。決定邊學邊寫,權當筆記吧,不對的地方各位大俠指正,謝謝。爲什麼要學習roller,其實我是想在上面做二次開發。roller已經集成權限管理、菜單管理等模塊,如果在其上做二次開發,完完全全是實現自己的業務功能模塊即可,另外一個重要的原因是可以通過優秀的開源軟件學習別人優秀的設計理念和經驗。

 

roller是一個多用戶博客管理系統,分前臺博客頁面展現和後臺博客管理頁面。前者主要是通過velocity來展現,後臺通過jsp+tiles。

 

今天要說的是前臺博客頁面相關的內容。在這裏這個類PageServlet是不得不說的,通過名字我們大概可以瞭解此類是處理頁面的,具體做些什麼工作,下面再說。

 

先來說說此servlet是如何被觸發的,在web.xml中它的url映射是如下配置的:

    <servlet>
        <servlet-name>PageServlet</servlet-name>
        <servlet-class>org.apache.roller.weblogger.ui.rendering.servlets.PageServlet</servlet-class>
        <load-on-startup>5</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>PageServlet</servlet-name>
        <url-pattern>/roller-ui/rendering/page/*</url-pattern>
    </servlet-mapping>

 當url符合/roller-ui/rendering/page/*時,此servlet的doGet方法就被執行。什麼時候、哪些連接纔會符合此url呢。後臺管理頁面相關的連接是有的,但這裏說點曲折一點的東西!

 

經過閱讀源代碼和觀察,當直接進入某個博客時此servlet也比執行。但是博客的url一般都不包含/roller-ui/rendering/page/*這樣的字符,即使是這樣,這博客地址也太長了點吧。roller是怎麼樣做的呢?當我們輸入一個博客地址,比如:

http://localhost:8080/roller/abc

 我們想直接進入abc這個博客頁面。當用戶在瀏覽器地址欄裏輸入這個博客地址時,roller有一個filter優先被觸發,見如下web.xml配置:

    <filter>
        <filter-name>RequestMappingFilter</filter-name>
        <filter-class>org.apache.roller.weblogger.ui.rendering.filters.RequestMappingFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>RequestMappingFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

這個 RequestMappingFilter主要的工作是把請求映射到真正能處理它的地方,比如前面說的進入abc這個博客頁面。頁面在哪裏?對不起,這裏沒有一個jsp或一個controller對應一個url的說法。所有的都到PageServlet去啦。爲什麼呢?

 

原來在RequestMappingFilter中,會遍歷所有的映射處理器,具體來說就是交給類WeblogRequestMapper判斷,如果恰好被命中,請求的uri就被修改並forward。否則請求就交個下一個filter處理了。

 

WeblogRequestMapper修改uri,使之符合PageServlet的映射要求,請求就交給PageServlet處理了。這時,請求才真正被傳給PageServlet處理。

 

前面我們瞭解的PageServlet被觸發的過程,現在來了解它做寫什麼工作。這個類的doGet方法實在是長,而且很多if-else判斷(我最怕這樣的代碼),看得人有點暈暈的,至今我也不是完全明白這個方法的所有處理流程。先挑些能看懂的講吧,權當筆記。

 

這個類大概的流程是將用戶要打開的博客頁面從緩存中取出來展現,如果緩存中沒有就去讀取博客內容相關的信息,通過velocity渲染成頁面並把頁面整個緩存起來備用。

 

 

當然很多細節就不說了,比如判斷是否是站點首頁,是否緩存過期等等,還有很多,大家自己去看吧。我說的也不一定對。

 

 

roller是如何展現一個博客頁面的呢?又如何緩存的呢?菜單又是如何管理?

 

有空的時候再拿出來給大家交流。

 

 

 

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