• Struts2源码分析 初步1 如何入手以及做了哪些初始化


     前一阵写了个struts 源码阅读环境的搭建(struts2 src study 准备工作) 但是一直没有写阅读心得  最近将之逐渐完成

    那个阅读源码环境搭建的文章 也适合其他框架的源码阅读

    1. struts2基本流程

      The Struts 2 Request Flow


      http://struts.apache.org/2.0.8/docs/the-struts-2-request-flow.html

    其实这就是struts2的架构

    1. 对于一次请求 更详细的流程 ,暂时看不懂的可以先跳过

      来自http://www.xuecs.com/blog/?p=98

    2. 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

    <filter>

      <filter-name>struts2</filter-name>

      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

    </filter>

     

    <filter-mapping>

      <filter-name>struts2</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    很明显是一个filter  StrutsPrepareAndExecuteFilter,可以说是struts2切入你工程的初始点
    不难发现还有
    StrutsExecuteFilter
    StrutsPrepareFilter
    FilterDispatcher
    关于这几个类的关系
    *
    FilterDispatcher
    这个类自从struts2.1.3 开始被遗弃不用

    * StrutsPrepareAndExecuteFilter取代了

    *

    * "FilterDispatcherstruts2.0.x2.1.2版本的核心过滤器.!

    * StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher.!

    * http://blog.csdn.net/s_ongfei/article/details/5811070

    * "

    *

    * 其实可以从这个取代过程看到一个重构的过程

    * 本来这些 初始化 准备等工作 是很凌乱的散在 这个类中

    * 但是在StrutsPrepareAndExecuteFilter中会发现 被一些封装了的操作类 (PrepareOperations,ExecuteOperations,InitOperations)所取代

     

    1. 按照顺藤摸瓜的思路,现在该分析StrutsPrepareAndExecuteFilter

      其实上面已经提到了三个operation,这个filter主要是的操作都被这三个operation封装了。要分析StrutsPrepareAndExecuteFilter,本质上就是分析这三个operation做了什么。

      当然StrutsPrepareAndExecuteFilter是实现Filter接口,那么就要实现init doFilter destory方法

      详细请参见 http://blog.csdn.net/tavor/archive/2007/11/09/1876151.aspx

      InitOperations的操作就是在实现init方法中完成的

      1. InitOperations的操作分析,含有三点:日志配置的初始化;调度器(Dispatcher)的初始化;根据配置初始化content加载器。

        表面上看起来就三个初始化,但是还是做了很多事情,尤其是调度器(Dispatcher)初始化,下面逐一分析。

        a. 日志初始化:

        * Initializes the internal Struts logging

        * 去初始参数中寻找是否配置loggerFactory配置

        * 若有 则加载 若没有 则略过

        * 但是 注意看下LoggerFactorygetLoggerFactory方法

        * 他实际上在默认情况下(即取不到logggerFactory)common loggerfactory加载上来

        * 要是再找不到 就用jdkloggerFactory报错

        * 并注意这个日志工厂类用到 读写锁 详细介绍看jdk的文档就可以了

        b. 调度器(Dispatcher)初始化

        本质上是调用了Dispatcherinit方法,顺便说下,这个 Dispatcher是个核心类。PrepareOperations,ExecuteOperations这两个类的背后还是调用了 Dispatcher的方法去完成。在调用Dispatcherinit方法之前还做了一些事(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);

        }

        }


  • 相关阅读:
    python测试开发django-rest-framework-92.反序列化(ModelSerializer)之DecimalField保留2位小数
    python测试开发django-rest-framework-91.反序列化(ModelSerializer)之ChoiceField选项字段校验
    python测试开发django-rest-framework-90.反序列化(ModelSerializer)之唯一字段校验UniqueValidator
    python测试开发django-rest-framework-89.反序列化(ModelSerializer)之read_only和write_only
    python测试开发django-rest-framework-88.反序列化(ModelSerializer)之校验传入参数
    python接口自动化39-JMESPath解析json数据
    sql server全文搜索和filestream
    sql server 2008 filestream
    sql server存储和搜索非结构化数据
    cross server怎么取出自定义头部的Token
  • 原文地址:https://www.cnblogs.com/simoncook/p/2266930.html
Copyright © 2020-2023  润新知