说说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是如何展现一个博客页面的呢?又如何缓存的呢?菜单又是如何管理?

 

有空的时候再拿出来给大家交流。

 

 

 

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