`
zybing
  • 浏览: 457053 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Roller4.0.1使用的监听器

阅读更多

Roller4.0.1中,使用了2个监听器:

 

    <!-- Context Listeners --> 
    <!-- 控制session的启动和关闭 --> 

    <listener>
        <listener-class>org.apache.roller.weblogger.ui.core.RollerSession</listener-class>
    </listener>

    <!--  初始化Roller web application/context -->
    <listener>
        <listener-class>org.apache.roller.weblogger.ui.core.RollerContext</listener-class>
    </listener>

    <!-- Tile的一个监听器 -->
    <listener>
       <listener-class>org.apache.tiles.web.startup.TilesListener</listener-class>
    </listener> 

先说明一下RollerContext:

RollerContext 继承了 org.springframework.web.context.ContextLoaderListener

                    实现了 javax.servlet.ServletContextListerner

 

javax.servlet.ServletContextListerner是Listener接口之一,在container启动和关闭的时候,会调用ServletContextListerner,

Roller就是在ServletContextListerner中完成初始化的。

 

先把最后的总结提前,在RollerContext中的contextInitialized中完成

总结一下:

1. 首先设置一些最基本的参数,

2. 做启动的一些准备工作 : WebloggerStartup.prepare():完成对数据库和mail provider的确认

3. 随后进行最主要的工作:

     WebloggerFactory.bootstrap() : 将处理流程串联起来(trigger bootstrapping process):通过WebloggerFactory,得到WebloggerProvider,再通过WebloggerProvider,得到 Weblogger

     WebloggerFactory.getWeblogger().initialize():进行一系列的初始化(trigger initialization process),这个初始化也就是Weblogger在初始化

4. 如果有必要,初始化planet(参数 planet.aggregator.enable)

5. 初始化Acegi权限

6. 设置velocity模板引擎

 

 

 

 

首先完成spring的初始化过程,

然后设定资源上传的目录,保存在WebloggerConfig中(基本上所有的配置都从这个文件中获取)

 

开始最核心的操作了:

WebloggerStartup.prepare

  在prepare中, 首先对DB和Mail Provider进行准备

   DatabaseProvider、MailProvider

1. 对配置中的信息进行读取,进行测试

2. 随后对数据库的表进行校验,必须要有的表是否存在

  isCreationRequired:对表rolleruser、userrole进行检查,只要表存在就可以了。

                                通过com.getMetaData().getTables进行

  isUpgradeRequired:检测是否需要升级

                              这个是读取数据库中表roller_properties的名为roller.database.version的行

                              以及通过配置文件roller-version.properties中的ro.version

                              进行比较

 

 

在DB和邮件 Provider检查好以后,进行:

  WebloggerFactory.bootstrap()

  WebloggerFactory.getWeblogger().initialize()

 

   WebloggerFactory.bootstrap()的过程,bootstrap(引导) Weblogger business tier

      通过配置文件(类WebloggerConfig获取weblogger.provider.class配置 )获取WebloggerProvider实例

      再调用WebloggerFactory中bootstrap(webloggerProvider)

           bootstrap(webloggerProvider)其实就是把WebloggerProvider保存下来,同时调用WeblogProvider的bootstrap(),

 

WebloggerConfig同时读取3个配置文件:

 缺省的配置文件:org.apache.roller.weblogger.config.roller.properties

 客户化的配置: roller-customer.properties

 JVM参数: roller.customer.config---程序中的注释是: external config file

 

前2个用getResourceAsStream方式进行加载

最后一个用:System.getProperty方式加载

 

然后对配置进行处理:读取config.expandedProperties的话,对这些属性进行expand,在重新设置回去,如果这些属性进行了配置的话 (用其他值进行替换,程序中用System.getProperties中的值进行替换)

 

同时也对log系统的配置进行初始化,读取以"log4j."开头的属性

 

在源码中,static {} 中有这么一段:

     // we'll need this to get at our properties files in the classpath :是需要先加载到这个包吗?

     Class config_class = Class.forName("org.apache.roller.weblogger.config.WebloggerConfig");
     // first, lets load our default properties
     InputStream is = config_class.getResourceAsStream(default_config);
     config.load(is);
........

 

在配置文件中,

weblogger.provider.class配置成:org.apache.roller.weblogger.business.GuiceWebloggerProvider

 

GuiceWebloggerProvider构造函数也从配置文件中读取:guice.backend.module ,用于生成Weblogger

缺省配置是:org.apache.roller.weblogger.business.jpa.JPAWebloggerModule ,这是guice中的一个Module

下面的做法应该是guice中的要求了(不熟悉,看了以后再说)

 

在Provider.bootstrap获的Weblogger以后,Provider的初始化过程结束。

然后进入到weblogger的initialize过程中。

 

要弄清楚Weblogger的initialize,要了解WebloggerProvider获取到的Weblogger是怎么来的,这个要看一下guice了。

简单了解了一下guice,还是比较好了解的,-----先能看懂再说,使用guice开发以后再说,等要修改功能的时候必定要学会的。

 

看了一下,其实还是很简单的。通过@Inject来标记(看http://tech.it168.com/zt/guice/index.html有说明)

 

guice.backend.module中的代码如下:

public class JPAWebloggerModule implements Module {

    public void configure(Binder binder) {

        binder.bind(Weblogger.class).to(JPAWebloggerImpl.class);
        
        binder.bind(JPAPersistenceStrategy.class);       
        binder.bind(org.apache.roller.weblogger.planet.business.jpa.JPARollerPlanetPersistenceStrategy.class);
        
        binder.bind(AutoPingManager.class).to(     JPAAutoPingManagerImpl.class);   
        binder.bind(BookmarkManager.class).to(     JPABookmarkManagerImpl.class);  
        binder.bind(PingQueueManager.class).to(    JPAPingQueueManagerImpl.class);   
        binder.bind(PingTargetManager.class).to(   JPAPingTargetManagerImpl.class); 
        binder.bind(PropertiesManager.class).to(   JPAPropertiesManagerImpl.class);   
        binder.bind(RefererManager.class).to(      JPARefererManagerImpl.class);
        binder.bind(ThreadManager.class).to(       JPAThreadManagerImpl.class);  
        binder.bind(UserManager.class).to(         JPAUserManagerImpl.class);   
        binder.bind(WeblogManager.class).to(       JPAWeblogManagerImpl.class);   
                
        binder.bind(ReferrerQueueManager.class).to(ReferrerQueueManagerImpl.class); 
        binder.bind(FileManager.class).to(         FileManagerImpl.class);   
        binder.bind(IndexManager.class).to(        IndexManagerImpl.class);
        binder.bind(PluginManager.class).to(       PluginManagerImpl.class);    
        binder.bind(ThemeManager.class).to(        ThemeManagerImpl.class);
        
        binder.bind(URLStrategy.class).to(         MultiWeblogURLStrategy.class);
    }
}
 

实现Weblogger接口的是: JPAWebloggerImpl.class ---- 完整的路径是: org.apache.roller.weblogger.business.jpa.JPAWebloggerImpl.class--这个是主要的实现者

 

JPAWebloggerImpl 继承: org.apache.roller.weblogger.business.WebloggerImpl,

 

WebloggerImpl 实现接口: org.apache.roller.weblogger.business.Weblogger

 

 

下面主要对initialize所作的工作进行分析:

首先是4个Manager的初始化:

 

        getPropertiesManager().initialize();  // Manages global properties for Roller.
        getThemeManager().initialize();       // Manager interface for accessing Theme related objects.
        getThreadManager().initialize();      //  Thread management for executing scheduled and asynchronous tasks.
        getIndexManager().initialize();        //  Interface to Roller's Lucene-based search facility. 

 实现都在: org.apache.roller.weblogger.business.jpa中。

 

中间有一步是ping服务器,没有仔细看。

 

最后是进行一次db的flush。采用的就是JPA中最基本的方式:

 

在JPAWebloggerImpl中,使用的是:

    public void flush() throws WebloggerException {
        this.strategy.flush();
    }
 

strategy是:JPAPersistenceStrategy类型,它的flush为:

    /**
     * Flush changes to the datastore, commit transaction, release em.
     * @throws org.apache.roller.weblogger.WebloggerException on any error
     */
    public void flush() throws WebloggerException {
        try {
            EntityManager em = getEntityManager(true);
            em.getTransaction().commit();

        } catch (PersistenceException pe) {
            throw new WebloggerException(pe);
        }
    }

 

就只有一个获取EntityManager,进行一次commit;

幸好前2天周末,才看了JPA的一些技术(非常可惜的是雨果丢了: http://www.360doc.com/content/091130/09/41237_10047630.html )

JPA获取到EntityManager,就会对数据库进行一次检查,如果没有表,会往数据库中建表。

 

注意到: 注释中写的“release em”,但是实际上没有释放em,这是怎么回事?(虽然有一个释放em的filter,但是这里所有的过程是在listener中进行的)

 

自此,Weblogger的所有动作完成了。

 

总结一下:

1. 首先设置一些最基本的参数,

2. 做启动的一些准备工作 : WebloggerStartup.prepare():完成对数据库和mail provider的确认

3. 随后进行最主要的工作:

     WebloggerFactory.bootstrap() : 将处理流程串联起来(trigger bootstrapping process):通过WebloggerFactory,得到WebloggerProvider,再通过WebloggerProvider,得到Weblogger

     WebloggerFactory.getWeblogger().initialize():进行一系列的初始化(trigger initialization process),这个初始化也就是Weblogger在初始化

4. 如果有必要,初始化planet(参数 planet.aggregator.enable)

5. 初始化Acegi权限

6. 设置velocity模板引擎

 

 

 

 

分享到:
评论

相关推荐

    apache-roller-4.0.1

    这个压缩包"apache-roller-4.0.1"包含了Apache Roller的第4.0.1版本,这是一个基于Java技术构建的Web应用程序。接下来,我们将深入探讨Apache Roller的核心功能、特性以及与Java相关的技术细节。 1. **Apache ...

    apache-roller-src-4.0.1 源代码

    源代码包"apache-roller-src-4.0.1"是Roller项目的4.0.1版本的源码,对开发者来说,这是一个深入了解Roller工作原理和学习Java Web开发的宝贵资源。 1. **Java技术栈**: Apache Roller的源代码基于Java语言编写,...

    apache-roller-src-4.0.1.part2.rar

    apache-roller-src-4.0.1.part2.rar

    roller

    首先,从描述中给出的博文链接(尽管实际链接不可访问),我们可以推断这篇博文可能涉及对Roller的使用、配置或源码分析。在实际的IT实践中,阅读和理解开源项目的源码是提升技术能力的重要途径,特别是对于工具类...

    3DMAX卷曲修改器Roller下载

    同时,Roller-0.1.0.jpg可能是插件的截图或者使用教程,用户可以通过查看该图片了解插件的界面和功能。 总的来说,3DMAX卷曲修改器Roller是提高3DMAX用户工作效率和创造力的重要工具,尤其对于那些需要频繁制作卷曲...

    博客(Blog)-Roller Weblogger ,MeEclipse下搭建

    - Roller4.0.1: Roller博客系统的版本号,也是搭建的目标版本。 - Apache Roller: 为Apache软件基金会下的一个开源项目,通过上述提供的下载链接可以获取Roller的源码和压缩文件。 3. **配置步骤**: - 数据库...

    roller安装

    roller是一款基于Java的Web应用程序,它使用Maven进行构建,并依赖于Servlet容器如Tomcat来运行。其核心特性包括多用户支持、RSS/Atom聚合、自定义模板以及插件机制,这使得它在功能上具有相当的灵活性和可扩展性。 ...

    Roller初体验

    5. **使用体验**:博主可能分享了使用Roller创建博客、发布文章、管理用户和评论的实际操作体验,这有助于读者了解Roller的用户体验和功能实用性。 6. **源码调试与开发**:对于开发者而言,可能会对博主如何使用...

    roller5 for tomcat

    《Roller 5 for Tomcat:一款便捷的博客平台整合指南》 在互联网技术日新月异的今天...通过深入学习和掌握Roller 5的使用,你将能够构建出一个功能完善、自定义程度高的在线社区,让思想和信息的交流更加自由和便捷。

    Apacheroller

    #### 开始使用 Roller 1. **导航至 Roller 并完成安装**: - 在浏览器中访问 Roller 的地址,按照提示完成剩余的安装步骤。 2. **注册用户并创建博客**: - 注册一个新用户账号。 - 创建个人的第一个博客。 #### ...

    Apache Roller

    Apache Roller是一个全功能,多用户和组博客服务器,适合大型和小型博客网站。它运行一个Java Web应用程序应该能够运行在任何Java EE服务器和关系数据库。目前,Apache Roller能很好的支持Tomcat和MySQL。 本人用...

    roller install、user、template guide

    4. 模板语言:解释roller使用的模板引擎,可能是FreeMarker或其他类似技术,以及它的语法。 5. 变量和标签:列出可用的模板变量和标签,它们用于动态显示内容,如文章标题、作者信息等。 6. 测试和调试:如何在本地...

    开源Java博客Roller v5.0 for tomcat.zip

    Roller 是一个全功能的多用户博客平台,于2002年首发,采用Java语言开发,设计精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS ...

    Roller4.0的另外一套cas简单解决方案

    最近在使用roller4.0和cas的单点登录集成.中间碰到了很多很多的问题.也许我碰到的问题都是属于自己的技术不成熟,能力不够引起的.但是我想应该还是有很多人和我是差不多的吧.我把自己碰到的问题和解决方案写出来和...

    roller-part01

    apache-roller-srapaapache-roller-srcche-roller-srccapache-rolaapache-roller-srcpache-roller-srcler-srcapapache-roller-srcache-roller-srcapache-roller-src

Global site tag (gtag.js) - Google Analytics