Struts2源码分析 初步1 --如何入手以及做了哪些初始化
2011-11-29 00:26 chen.simon 阅读(859) 评论(0) 收藏 举报前一阵写了个struts 源码阅读环境的搭建(struts2 src study 准备工作) 但是一直没有写阅读心得 最近将之逐渐完成
那个阅读源码环境搭建的文章 也适合其他框架的源码阅读
-
struts2基本流程
The Struts 2 Request Flow

http://struts.apache.org/2.0.8/docs/the-struts-2-request-flow.html
其实这就是struts2的架构
-
对于一次请求 更详细的流程 ,暂时看不懂的可以先跳过

-
从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 |
|
很明显是一个filterStrutsPrepareAndExecuteFilter,可以说是struts2切入你工程的初始点不难发现还有StrutsExecuteFilterStrutsPrepareFilterFilterDispatcher 关于这几个类的关系 *
FilterDispatcher
这个类自从struts2.1.3 开始被遗弃不用
* 用StrutsPrepareAndExecuteFilter取代了
*
* "FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.!
* StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.!
* http://blog.csdn.net/s_ongfei/article/details/5811070
* "
*
* 其实可以从这个取代过程看到一个重构的过程
* 本来这些 初始化 准备等工作 是很凌乱的散在 这个类中
* 但是在StrutsPrepareAndExecuteFilter中会发现 被一些封装了的操作类 (PrepareOperations,ExecuteOperations,InitOperations)所取代
-
按照顺藤摸瓜的思路,现在该分析
StrutsPrepareAndExecuteFilter其实上面已经提到了三个operation,这个filter主要是的操作都被这三个operation封装了。要分析StrutsPrepareAndExecuteFilter,本质上就是分析这三个operation做了什么。当然StrutsPrepareAndExecuteFilter是实现Filter接口,那么就要实现init doFilter destory方法详细请参见http://blog.csdn.net/tavor/archive/2007/11/09/1876151.aspxInitOperations的操作就是在实现init方法中完成的-
InitOperations的操作分析,含有三点:日志配置的初始化;调度器(Dispatcher)的初始化;根据配置初始化content加载器。表面上看起来就三个初始化,但是还是做了很多事情,尤其是调度器(Dispatcher)初始化,下面逐一分析。a.日志初始化:* Initializes the internal Struts logging*去初始参数中寻找是否配置loggerFactory配置*若有 则加载 若没有 则略过*但是 注意看下LoggerFactory的getLoggerFactory方法*他实际上在默认情况下(即取不到logggerFactory时)将common logger的factory加载上来*要是再找不到 就用jdk的loggerFactory报错*并注意这个日志工厂类用到 读写锁 详细介绍看jdk的文档就可以了b.调度器(Dispatcher)初始化本质上是调用了Dispatcher的init方法,顺便说下,这个Dispatcher是个核心类。PrepareOperations,ExecuteOperations这两个类的背后还是调用了Dispatcher的方法去完成。在调用Dispatcher的init方法之前还做了一些事(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);
}
}
-
浙公网安备 33010602011771号