Struts2源码分析 初步1 --如何入手以及做了哪些初始化
2011-11-29 00:26 chen.simon 阅读(851) 评论(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
切入你工程的初始点
不难发现还有
StrutsExecuteFilter
StrutsPrepareFilter
FilterDispatcher 关于这几个类的关系 *
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.aspx
InitOperations
的操作就是在实现
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);
}
}
-