Struts2运行机制

一、概述

     Struts2的核心是一个Filter,Action可以脱离web容器,那么是什么让http请求和action关联在一起的,下面我们深入源码来分析下Struts2是如何工作的。

FilterDispatcher API 写道
Deprecated. Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using the ActionContextCleanUp filter in addition to this one

    

     鉴于常规情况官方推荐使用StrutsPrepareAndExecuteFilter替代FilterDispatcher,我们此文将剖析StrutsPrepareAndExecuteFilter,其在工程中作为一个Filter配置在web.xml中,配置如下:

Xml代码  收藏代码
  1. <filter>  
  2.     <filter-name>struts2</filter-name>  
  3.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>struts2</filter-name>  
  7.     <url-pattern>/*</url-pattern>  
  8. </filter-mapping>  

    

二、源码属性方法简介

    下面我们研究下StrutsPrepareAndExecuteFilter源码,类的主要信息如下:

 

属性摘要
protected  List<Pattern> excludedPatterns
           
protected  ExecuteOperations execute
           
protected  PrepareOperations prepare
           

 

    StrutsPrepareAndExecuteFilter与普通的Filter并无区别,方法除继承自Filter外,仅有一个回调方法,第三部分我们将按照Filter方法调用顺序,由init—>doFilter—>destroy顺序地分析源码。

方法摘要
 void destroy()
           继承自Filter,用于资源释放
 void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
           继承自Filter,执行方法
 void init(FilterConfig filterConfig) 
           继承自Filter,初始化参数
protected  void postInit(Dispatcher dispatcher, FilterConfig filterConfig)
          Callback for post initialization(一个空的方法,用于方法回调初始化)

 

三、源码剖析    

  

    1、init方法

         init是Filter第一个运行的方法,我们看下struts2的核心Filter在调用init方法初始化时做哪些工作:

Java代码  收藏代码
  1.  public void init(FilterConfig filterConfig) throws ServletException {  
  2.         InitOperations init = new InitOperations();  
  3.         try {  
  4. //封装filterConfig,其中有个主要方法getInitParameterNames将参数名字以String格式存储在List中  
  5.             FilterHostConfig config = new FilterHostConfig(filterConfig);  
  6. // 初始化struts内部日志  
  7.            init.initLogging(config);  
  8. //<strong>创建dispatcher ,并初始化,这部分下面我们重点分析,初始化时加载那些资源</strong>  
  9.             Dispatcher dispatcher = init.initDispatcher(config);  
  10.             init.initStaticContentLoader(config, dispatcher);  
  11. //初始化类属性:prepare 、execute   
  12.             prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);  
  13.             execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);  
  14.             this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);  
  15. //回调空的postInit方法  
  16.             postInit(dispatcher, filterConfig);  
  17.         } finally {  
  18.             init.cleanup();  
  19.         }  
  20.  }  

 

   首先看下FilterHostConfig ,源码如下:

  

Java代码  收藏代码
  1. public class FilterHostConfig implements HostConfig {  
  2.   
  3.     private FilterConfig config;  
  4.     /** 
  5.      *构造函数   
  6.      */      
  7.     public FilterHostConfig(FilterConfig config) {  
  8.         this.config = config;  
  9.     }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构随笔录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值