Struts2学习笔记——Struts2概览
1. Struts2 和Struts1.X有什么区别?它们各自的发展轨迹又如何?
(1)Struts2来自于Webwork2,并且与Struts1.X完全不兼容。
(2)Apache的Struts1.X在设计上存在严重不足,Opensymphony的Webwork2则拥有优秀的设计思想和灵活的实现。最终两个组织合作,废弃掉了原先Struts1.X,Struts2则完全是基于原先的Webwork2。
2. Struts2依赖于哪些核心技术?
- Web容器对于Servlet标准(最低支持版本2.4)和JSP(最低支持版本2.0)标准的实现;
- 设计模式:命令模式,ThreadLocal模式,装饰模式,策略模式,构造模式,责任链模式,代理模式等;
- OGNL(Object-Graph Navigation Language):对象导航语言。一种表达式引擎,指的是通过程序建立某个实体对象与某种公式表达之间的联系。OGNL作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能;
- XWork:一种围绕解决Action接口的通用的命令模式框架。其中提供的基础构件有:IoC容器,OGNL支持,数据类型化,数据校验框架,可插拔的功能模式(插件模式)及其配置,并且在这一系列的基础构件上,实现了一套基于Command设计模式的“事件请求执行框架”。XWork不仅是Struts2的核心实现,也可以用于一切基于Command模式的Java程序。
3.Struts2可以应用在什么样的项目中?
Struts2适合于想要编写一个业务逻辑复杂的,长时间维护的,众多页面的Web项目。
4.Struts2可以分为哪两条逻辑运行主线?
Struts2的入口是StrutsPrepareAndExecuteFilter
,这个类实现了Servlet标准中Filter
接口,因此Filter的生命周期也成为了我们对整个Struts2进行运行逻辑主线划分的主要依据。
- 第一条主线——Struts2的初始化:
init
方法驱动执行 - 第二条主线——Struts2处理Http请求:
doFilter
方法驱动执行
Struts2的初始化主线的特点:
- 仅在Web应用启动时执行一次
- init方法的执行失败将导致整个Web应用启动失败。
这两个特点来源于Filter这个Servlet规范的基本运行特性。
Struts2初始化主线主要完成2个内容:
- 框架元素的初始化工作。这一初始化工作包含了对框架内部的许多内置对象的创建和缓存。
- 控制框架运行的必要条件。框架的可拓展性保证了我们可以在应用层面对框架的运行参数和执行模式进行定制化,而框架则有必要对这种定制化进行正确性校验。
初始化主线贯穿了Struts2对其内置对象的创建和缓存的过程,这一过程相当于把整个Struts2作为一个框架的运行环境完整地创建出来。这条主线的创建,为之后的Http请求处理主线提供了必要的运行环境。
5.Struts2在处理http请求时,可以分成哪两个主要阶段?
Struts2的Http请求处理主线是Struts2的核心主线,包含了Struts2处理Http请求、进行必要的数据处理和处理数据返回的全部过程。这条主线将在任何满足web.xml
中所指定的URI Pattern的Http请求发生时进行响应,由doFilter
方法负责驱动。
- 第一阶段——Http请求预处理
在这个阶段中,程序执行的控制权在Struts2手中。这个阶段的主要工作是针对每个Http请求进行预处理,为真正的业务逻辑执行做必要的数据环境和运行环境的准备。
程序代码在这个阶段有一个非常显著的特点:依赖于Web容器,并时时刻刻将与Web容器打交道作为主要工作。 - 第二阶段——XWork执行业务逻辑
在这个阶段,程序执行的控制权移交给了XWork。Struts2在完成Http请求的预处理之后,将Http请求中的数据封装成普通的Java对象,并由XWork负责执行具体的业务逻辑。
程序代码在这个阶段的特点和第一阶段完全相反:不依赖于Web容器,完全由XWork框架驱动整个执行的过程。
6. Struts2通过哪些元素的相互配合来完成初始化运行主线?
元素名称 | Java Package | 描述 |
---|---|---|
Container |
com.opensymphony.xwork2.inject |
容器定义接口,是Struts2内部进行对象管理的基础构建 |
ContainerImpl |
com.opensymphony.xwork2.inject |
容器的实现类,内部实现了Struts2进行对象生命周期管理和依赖注入的基本功能 |
PacakgeConfig |
com.opensymphony.xwork2.config.entities |
PackageConfig实体类,其中定义了事件响应模型的完整数据结构 |
Provider
)和容器的构造器(Builder
)元素名称 | Java Package | 描述 |
---|---|---|
ConfigurationProvider |
com.opensymphony.xwork2.config |
配置加载接口的统一接口。Struts2将初始化元素分为Container和PackageConfig两大类,这里使用了多重继承将两类配置加载接口进行统一 |
ContainerProvider |
com.opensymphony.xwork2.config |
Container的配置加载接口,其实现需要负责初始化容器中的所有对象 |
PackageProvide |
com.opensymphony.xwork2.config |
PackageConfig的配置加载接口,其实现类需要负责初始化用于处理事件请求的配置对象。 |
ContainerBuilder |
com.opensymphony.xwork2.inject |
Container的构造器,用于在初始化时构造容器 |
PackageConfigBuilder |
PackageConfig的内部类 |
PackageConfig 的构造器,用于在初始化时构造PackageConfig
|
元素名称 | Java Package | 描述 |
---|---|---|
ConfigurationManager |
com.opensymphony.xwork2.config |
配置行为操作代理类,包含了所有ContainerProvider 和PackageProviderder 实现以及所有配置的结构化数据(Configuration ) |
Configuration |
com.opensymphony.xwork2.conifg |
Struts2配置数据的管理类,作为运行时获取配置的基本接口。承载所有的结构化数据和操作方法 |
7. XWork框架主要由哪些元素构成?它们之间有什么关系?
元素名称 | Java Package | 描述 |
---|---|---|
ActionProxy |
com.opensymphony.xwork2 |
XWork生产线中的执行环境,整个生产线的入口,如一个口袋一样封装了所有执行细节 |
ActionInvocation |
com.opensymphony.xwork2 |
XWork生产线中的调度者,负责调度整个生产线中元素的执行次序 |
Interceptor |
com.opensymphony.xwork2.interceptor |
XWork生产线中的工作序列,可以丰富整个生产线的功能 |
Action |
com.opensymphony.xwork2 |
XWork生产线中的核心序列,负责核心业务逻辑调用和实现 |
ActionContext |
com.opensymphony.xwork2 |
XWork生产线的辅助设备,提供生产线工作运行所必需的数据环境 |
ValueStack |
com.opensymphony.xwork2.util |
XWork数据环境中提供表达式运算的工具类,也是XWork中继续数据访问的基础 |
Result |
com.opensymphony.xwork2 |
XWork生产线中的末端设备,负责输出生产线的生产结果 |