代码改变世界

Struts2源码分析 初步1 --如何入手以及做了哪些初始化

2011-11-29 00:26  chen.simon  阅读(851)  评论(0编辑  收藏  举报

 前一阵写了个struts 源码阅读环境的搭建(struts2 src study 准备工作) 但是一直没有写阅读心得  最近将之逐渐完成

那个阅读源码环境搭建的文章 也适合其他框架的源码阅读

  1. struts2基本流程

    The Struts 2 Request Flow

     


    http://struts.apache.org/2.0.8/docs/the-struts-2-request-flow.html

其实这就是struts2的架构

  1. 对于一次请求 更详细的流程 ,暂时看不懂的可以先跳过

     

    来自http://www.xuecs.com/blog/?p=98

  2. web.xml说起

    http://struts.apache.org/2.2.3.1/docs/create-struts-2-web-application-with-artifacts-in-web-inf-lib-and-use-ant-to-build-the-application.html介绍了如何创建一个struts应用

    步骤5 便是 Step 5 - Add Struts 2 Servlet Filter


1

2

3

4

5

6

7

8

9

<filter>

  <filter-name>struts2</filter-name>

  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

 

<filter-mapping>

  <filter-name>struts2</filter-name>

   <url-pattern>/*</url-pattern>

</filter-mapping>

很明显是一个filter  StrutsPrepareAndExecuteFilter,可以说是struts2切入你工程的初始点
不难发现还有
StrutsExecuteFilter
StrutsPrepareFilter
FilterDispatcher
关于这几个类的关系
*
FilterDispatcher
这个类自从struts2.1.3 开始被遗弃不用

* StrutsPrepareAndExecuteFilter取代了

*

* "FilterDispatcherstruts2.0.x2.1.2版本的核心过滤器.!

* StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher.!

* http://blog.csdn.net/s_ongfei/article/details/5811070

* "

*

* 其实可以从这个取代过程看到一个重构的过程

* 本来这些 初始化 准备等工作 是很凌乱的散在 这个类中

* 但是在StrutsPrepareAndExecuteFilter中会发现 被一些封装了的操作类 (PrepareOperations,ExecuteOperations,InitOperations)所取代

 

  1. 按照顺藤摸瓜的思路,现在该分析StrutsPrepareAndExecuteFilter

    其实上面已经提到了三个operation,这个filter主要是的操作都被这三个operation封装了。要分析StrutsPrepareAndExecuteFilter,本质上就是分析这三个operation做了什么。

    当然StrutsPrepareAndExecuteFilter是实现Filter接口,那么就要实现init doFilter destory方法

    详细请参见 http://blog.csdn.net/tavor/archive/2007/11/09/1876151.aspx

    InitOperations的操作就是在实现init方法中完成的

    1. InitOperations的操作分析,含有三点:日志配置的初始化;调度器(Dispatcher)的初始化;根据配置初始化content加载器。

      表面上看起来就三个初始化,但是还是做了很多事情,尤其是调度器(Dispatcher)初始化,下面逐一分析。

      a. 日志初始化:

      * Initializes the internal Struts logging

      * 去初始参数中寻找是否配置loggerFactory配置

      * 若有 则加载 若没有 则略过

      * 但是 注意看下LoggerFactorygetLoggerFactory方法

      * 他实际上在默认情况下(即取不到logggerFactory)common loggerfactory加载上来

      * 要是再找不到 就用jdkloggerFactory报错

      * 并注意这个日志工厂类用到 读写锁 详细介绍看jdk的文档就可以了

      b. 调度器(Dispatcher)初始化

       

      本质上是调用了Dispatcherinit方法,顺便说下,这个 Dispatcher是个核心类。PrepareOperations,ExecuteOperations这两个类的背后还是调用了 Dispatcher的方法去完成。在调用Dispatcherinit方法之前还做了一些事(createDispatcher)1是初始化调度器中的initparams 2是初始化调度器中的servletcontext

      具体的init方法 直接看代码

       

      init_DefaultProperties(); // [1]

      init_TraditionalXmlConfigurations(); // [2]

      init_LegacyStrutsProperties(); // [3]

      init_CustomConfigurationProviders(); // [5]

      init_FilterInitParameters() ; // [6]

      init_AliasStandardObjects() ; // [7]



      Container container = init_PreloadConfiguration();

      container.inject(this);

      init_CheckConfigurationReloading(container);

      init_CheckWebLogicWorkaround(container);

      if(!dispatcherListeners.isEmpty()) {

      for(DispatcherListener l : dispatcherListeners) {

      l.dispatcherInitialized(this);

      }

      }