Struts2框架源码分析:概况


Struts2和Struts1.x有什么区别? 他们各自发展轨迹又如何?

  1. Struts1是Apache社区在2000年3月31号发布的一款javaweb框架.
  2. 随着时代进步,Struts1的不足显而易见,此时Opensymphony开源了一款优秀的web框架,名为Webwork2.
  3. Apache社区在2005年12月14日宣布Struts项目和Webwork2项目合并,推出名为Struts2的Web框架.
  4. Strus2框架开始进入辉煌时代.

Struts2依赖于那些核心技术?

  1. 表示层技术, Struts2表示层主要是整合, 如整合Freemarker或Velocity为核心的模板技术、构建Flash应用的Flex技术、ajax技术等,以plugin形式进行整合.
  2. 设计模式, Struts2源码中统分使用了设计模式,如 Command、ThreadLocal、Decorator、Strategy、Builder、Chain Of Responsibility、Proxy等设计模式.
  3. OGNL表达式引擎, 表达式引擎是通过特定的语法进行操作java对象(读、写), OGNL在Struts2中主要用来解决不同形式的数据之间的转化和通信.
  4. Xwork框架, 一个基于Command设计模式的事件请求执行框架, Struts2负责与Web容器打交道部分,剩余的工作由Xwork来完成.

Struts2可以分为那两条逻辑运行主线?

Struts2严格遵守Servlet标准,通过Filter接口处理HTTP请求,通过配置web.xml引入Struts2框架:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  <filter>
         <!--过滤器名 -->
         <filter-name>struts2</filter-name>
         <!-- 配置Struts 2.3.x的核心Filter的实现类 -->
         <!--<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>-->
         <!-- 配置Struts 2.5.x的核心Filter的实现类 -->
         <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
     </filter>
     <!-- 让Struts 2的核心Filter拦截所有请求 -->
     <filter-mapping>
         <!--过滤器名 -->
         <filter-name>struts2</filter-name>
         <!-- 匹配所有请求 -->
         <url-pattern>/*</url-pattern>
     </filter-mapping>
  1. 第一条主线是Struts2初始化, 初始化通过init方法进行完成, 初始化主要包括: 框架元素的初始化, 如框架内置对象的创建和缓存, 如 容器的创建.
  2. 第二条主线是HTTP请求处理主线, 该主线是Struts2核心主线, 划分为2个阶段:
    1. 第一阶段: HTTP 请求预处理, 为业务逻辑执行做必要的数据环境和运行环境, 主要是和web容器打交道. (此阶段由Struts2完成, struts2-core.2.x.jar )
    2. 第二阶段: XWork执行业务逻辑, 该阶段不依赖web容器,主要用来处理业务逻辑,与第一阶段完全解耦. (此阶段由Xwork框架完成, xwork-core.2.x.jar)

Struts2通过哪些元素的相互配合来完成初始化运行主线?

  1. Struts2中的容器及其实现类

    1. Container, 容器定义接口,是Struts2内部进行对象管理的基础构建.
    2. ContainerImpl, 容器的实现类, 内部实现了Struts2进行对象生命周期的管理和依赖注入的基本功能.
    3. PackageConfig, 其中定义了事件响应模型的完整数据结构.
  2. Struts2中容器的加载接口(Provider)和容器的构造器(Buider)

    1. ConfigurationProvider, 配置加载结构的统一接口。 Struts2将初始化元素分为Container和PackageConfig两类, 这里使用了多重继承将两类配置加载接口进行统一.
    2. ContainerProvider, Container的配置加载接口, 其实现类需要负责初始化容器中的所有对象.
    3. PackageProvider, PackageConfig的配置加载接口, 其实现类需要负责初始化用于处理事件请求的配置对象.
    4. ContainerBuilder, Container的构造器,用于在初始化是构造容器.
    5. PackageConfigBuilder, PackageConfig的构造器,用在初始化是构造PackageConfig.
  3. Struts2初始化主线的辅助元素

    1. ConfigurationManager, 配置行为操作代理类,包含所有ContainerProvider、PackageProvider 的实现及所有配置的机构化数据.
    2. Configurationm, Struts2配置数据的管理类,作为运行时获取配置的基本接口, 承载所有配置的结构化数据和操作方法.

Struts2通过哪些元素的相互配合来完成HTTP请求处理主线?

  1. Struts2 进行HTTP请求预处理阶段的主要微观元素
    1. Dispatcher, Struts2的核心分发器,是Struts2进行HTTP请求处理的实际场所
    2. PrepareOperations, Struts2进行HTTP请求预处理操作集合
    3. ExecuteOperations, Struts2进行HTTP请求逻辑处理的操作集合.
  2. Xwork 执行业务逻辑阶段的主要微观元素 (7大元素贯穿XWork事件执行的生命周期)
    1. ActionProxy, XWork生产线中的执行环境, 整合生产线的入口, 包含所有执行的细节.
    2. ActionInvocation, 生产线中的调度者, 负责调度生产线各元素的执行顺序.
    3. Interceptor, 生产线中的工序序列, 用来丰富生产线的功能
    4. Action, 生产线中的核心工序, 负载核心逻辑调用和实现.
    5. ActionContext, 生产线的辅助设备, 提供生产线运行的必备的数据环境.
    6. ValueStack, 数据环境中提供表达式运算的工具类,也是Xwork进行数据访问的基础.
    7. Result, 生产线中的末端设备, 负责输出生产线的生产结果.

XWork中7大元素的调用关系

struts2

Struts2中有哪些配置表现形式 ?

  1. web.xml, Struts2入口程序定义、运行参数定义. (应用级)
  2. struts2-default.xml, 框架级别的定义, 包含Struts2所有的基本构成元素定义. (框架级)
  3. struts.xml, 应用级别定义, 包含应用级别覆盖框架级别的默认行为定义. (应用级)
  4. default.properties, 框架级别定义, Struts2默认的运行参数配置. (框架级)
  5. struts.proeperties, 应用级别定义, 用于覆盖框架级运行参数覆盖定义.(应用级)
  6. struts-plugin.xml, 应用级别定义, struts.xml的扩展, strtus2所支持的插件形式的配置文件. (应用级)

Struts2中的配置元素可以分为哪两个大类 ?

  1. 容器配置元素: 节点分为bean、constant
  2. 事件映射关系配置元素: 节点为 package