没有合适的资源?快使用搜索试试~ 我知道了~
首页struts2源码解析,个人感觉很不错
本文主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问http://www.opensymphony.com/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到struts-2.1.0-src"struts-2.0.10"src"core"src"main"java目录下查看Struts2的源文件
资源详情
资源评论
资源推荐

本章讲述 的工作原理。
读者如果曾经学习过 或者有过 的开发经验,那么千万不要想当然地以为这一章可
以跳过。实际上 与 并无我们想象的血缘关系。虽然 的开发小组极力保留
的习惯,但因为 的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。
是 社区和 社区的共同成果,我们甚至可以说, 是 的升级
版,他采用的正是 的核心,所以, 并不是一个不成熟的产品,相反,构建在
基础之上的 是一个运行稳定、性能优异、设计成熟的 框架。
本章主要对 的源代码进行分析,因为 与 的关系如此密不可分,因此,读者
需要下载 的源代码,访问 即可自
行下载。
下载的 源代码文件是一个名叫 ! 的压缩包,里面的目录和文件非常多,读
者可以定位到 " """""#$ 目录下查看 的源文件,
如图 % 所示。
(图 %)
主要的包和类
框架的正常运行,除了占核心地位的 的支持以外, 本身也提供了许多类,这些
类被分门别类组织到不同的包中。从源代码中发现,基本上每一个 类都访问了 提供
的功能,从而也可以看出 与 千丝万缕的联系。但无论如何, 的核心功能比如
将请求委托给哪个 & 处理都是由 完成的, 只是在 的基础上做了适当的简
化、加强和封装,并少量保留 中的习惯。
以下是对各包的简要说明:
包名 说明
'
该包封装视图组件, 在视图组件上有了很大加强,不仅增加
了组件的属性个数,更新增了几个非常有用的组件,如

、、、、
等。
(
另外, 可视化视图组件开始支持主题)*,缺省情况
下,使用自带的缺省主题,如果要自定义页面效果,需要将组件的
属性设置为 。
'+'
该包定义与配置相关的接口和类。实际上,工程中的 和
文件的读取和解析都是由 完成的, 只
做了少量的工作。
'
的核心包,最重要的类都放在该包中。
'
该包只定义了 , 个类,他们是
&-、&-.、/#
.,这三个类都是对 的扩展。
'
定义内置的截拦器。
'
实用包。
'$
只定义了一个类:012。
'$
提供 3、#、$ 等不同类型的页面呈现。
下表是对一些重要类的说明:
类名 说明
'0
该类有两个作用:
(
、初始化
、调用指定的 & 的 )*方
法。
'.0
这是一个过滤器。文档中已明确说明,如
果没有经验,配置时请将 的
值设成4。
(
该类有四个作用:
、执行 &
、清理 &5,避免内存泄漏
,、处理静态内容($'
)
%、为请求启动 6 的截拦器链。
&-
& 的代理接口。
-.
生产 &- 的工厂。
&7$
负责调用 & 和截拦器。
+'$
85+'-$
负责 的配置文件的解析。

的工作机制 , 体系结构图
的体系结构如图 9 所示:
(图 9)
, 的工作机制
从图 9 可以看出,一个请求在 框架中的处理大概分为以下几个步骤:
、客户端初始化一个指向 $ 容器(例如 :)的请求;
、这个请求经过一系列的过滤器(.)(这些过滤器中有一个叫做 &55; 的可
选过滤器,这个过滤器对于 和其他框架的集成很有帮助,例如:<-');
,、接着 .0 被调用,.0 询问 &< 来决定这个请求是否需要调
用某个 &;
%、如果 &< 决定需要调用某个 &,.0 把请求的处理交给
&-;
9、&- 通过 5+'<' 询问框架的配置文件,找到需要调用的 & 类;

=、&- 创建一个 &7$ 的实例。
>、&7$ 实例使用命名模式来调用,在调用 & 的过程前后,涉及到相关拦截器
(7)的调用。
?、一旦 & 执行完毕,&7$ 负责根据 中的配置找到对应的返回结果。返
回结果通常是(但不总是,也可能是另外的一个 & 链)一个需要被表示的 @- 或者 .< 的
模版。在表示的过程中可以使用 框架中继承的标签。在这个过程中需要涉及到
&<。
注:以上步骤参考至网上,具体网址已忘记。在此表示感谢!
,, 源代码分析
和 不同, 的启动是通过 .0 过滤器实现的。下面是该过滤器在
文件中的配置:
代码清单 =:(截取)
A+B
A+BA+B
A+B
'.0
A+B
A+B
A+'B
A+BA+B
AB4AB
A+'B
建议,在对 的配置尚不熟悉的情况下,将 配置为4,这样该过滤器将截拦
所有请求。
实际上,.0 除了实现 . 接口以外,还实现了 接口,继承代码如下:
代码清单 >:.0 结构
.0C.D
E
并没有定义业务方法,只定义了若干个常量。 对常用的接口进行了重新封装,比
如 F$1G、F$1、F$5 等。 以下是
的定义:
代码清单 ?:#$
3D
44
453F::-G#
4
+'F::-H1I;:J
"F$1G"K
44
453F::-#
4

+'F::-H1-/LJ
"F$1"K
44
453F::-GE
4
+'12M:H07-&:5F1J
"$0"K
44
453$E#
4
+'12M:H5/L:8:J
"$5"K
44
453@-'E
4
+'-&NH5/L:8:J
"-'5"K
4453-5#4
+':1;:H-/1:M:H5/L:8:J
""K
E
容器启动后,.0 被实例化,调用 ).5+'+5+'*方法。该方法创建
0 类的对象,并且将 .0 配置的初始化参数传到对象中(详情请参考代码清单
),并负责 & 的执行。然后得到参数 ',值得注意的是,还有另外三个固定的包和该参
数进行拼接,分别是 '、、和
'''',中间用空格隔开,经过解析将包名变成路径后存储到一
个名叫 -+ 的数组中,这些目录中的文件会被自动搜寻。
代码清单 O:.0)*方法
$).5+'+5+'*$D
+5+'J+5+'K
J0)+5+'*K
)*K
'J+5+''7-)"'"*K
''J"'
''''"K
3)PJ*D
'JQ""Q'K
E
-+J)'*K
E
代码清单 :.00)*方法
剩余20页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论2