struts2 处理请求流程分析(结合源码)1- 孤星随缘ツ http://t.sina.com.cn/samzhxing-iteye技术网站
2011年08月01日
  struts2 源码版本2.0.11.1
  本文是综合网上部分人的分析成果,然后再自己结合源码进行的,分析中如有错误,请指正。
  从struts2 中的web.xml的启动配置可以看出,首先分析的是FilterDispatcher 这个过滤器类。
  1、过滤器的初始化方法 void init(FilterConfig filterConfig) //初始化方法 public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; //获得默认的参数,创建dispathcher 对象 dispatcher = createDispatcher(filterConfig); dispatcher.init(); String param = filterConfig.getInitParameter("packages"); String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging"; if (param != null) { packages = param + " " + packages; } this.pathPrefixes = parse(packages); }
  1.1、createDispatcher(filterConfig);方法,该方法的目的是创建Dispathcher 对象 protected Dispatcher createDispatcher(FilterConfig filterConfig) { //读取相应过滤器的web.xml 配置 Map params = new HashMap(); for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) { String name = (String) e.nextElement(); String value = filterConfig.getInitParameter(name); params.put(name, value); } //可以看出Dispatcher 类包装了ServletContext 和过滤器的web.xml 配置 return new Dispatcher(filterConfig.getServletContext(), params); }
  1.2、dispatcher.init();方法,该方法对dispatcher进行了一系列的初始化工作,这个工作很重要也有点复杂,具体每个初始化的工作的流程怎样,待有空闲的时候再继续分析,网上也有人已经分析过了,如果有兴趣可参照:http://zddava.iteye.com/blog/211795 public void init() { if (configurationManager == null) { configurationManager = new ConfigurationManager(BeanSelectionProvider.DEFAULT _BEAN_NAME); } //读取properties信息,默认的default.properties init_DefaultProperties(); // [1] //读取xml配置文件,默认的struts-default.xml,struts-plugin.xml,struts.xml init_TraditionalXmlConfigurations(); // [2] //读取用户自定义的struts.properties init_LegacyStrutsProperties(); // [3] //读取FilterDispatcher的配置中所定义的actionPackages属性,传说中的Struts 2 零配置所谓的零配置 init_ZeroConfiguration(); // [4] //自定义的configProviders init_CustomConfigurationProviders(); // [5] //该功能全面被注释 init_MethodConfigurationProvider(); //载入FilterDispatcher传进来的initParams init_FilterInitParameters() ; // [6] //将配置文件中的bean与具体的类映射 init_AliasStandardObjects() ; // [7] //构建一个用于依赖注射的Container对象 //在这里面会循环调用上面七个ConfigurationProvider的register方法 //其中的重点就是DefaultConfiguration的#reload()方法 Container container = init_PreloadConfiguration(); init_CheckConfigurationReloading(container); init_CheckWebLogicWorkaround(container); }
  1.3、String param = filterConfig.getInitParameter("packages"); 以下的代码。这个步骤载入了packages标签下定义的静态资源。 读取web.xml中 的下面的配置路径还有org.apache.struts2.static,template,org.apache.struts2.interceptor.debugging这三个包空间下边的资源也会作为静态资源载入。 struts2 org.apache.struts2.dispatcher.FilterDispatcher packages cn.static.resource
  1.4、this.pathPrefixes = parse(packages);这个步骤是对packages 进行解析的。 protected String[] parse(String packages) { if (packages == null) { return null; } List pathPrefixes = new ArrayList(); StringTokenizer st = new StringTokenizer(packages, ", \n\t"); while (st.hasMoreTokens()) { String pathPrefix = st.nextToken().replace('.', '/'); if (!pathPrefix.endsWith("/")) { pathPrefix += "/"; } pathPrefixes.add(pathPrefix); } return pathPrefixes.toArray(new String[pathPrefixes.size()]); }
  
  

struts2 处理请求流程分析(结合源码)1- 孤星随缘ツ http://t.sina.com.cn/samzhxing-iteye技术网站...相关推荐

  1. struts2 处理请求流程分析(结合源码)

    http://zhxing.iteye.com/blog/541059 struts2 源码版本2.0.11.1 本文是综合网上部分人的分析成果,然后再自己结合源码进行的,分析中如有错误,请指正. 从 ...

  2. DRF基本使用及执行流程分析 | APIView源码分析

    DRF基本使用及执行流程分析 介绍: # 使用的都是CBV的方式 ,继承的类为drf提供的类(提供的类很多) # 这里目前继承使用APIView类 # 因为APIView是所有类的基类,其他类可能拓展 ...

  3. 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

    原文地址:http://www.cnblogs.com/dongying/p/4142476.html 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍 ...

  4. 内核启动流程分析(四)源码浅析

    目录 kernel(四)源码浅析 建立工程 启动简析 head.s 入口点 查询处理器 查询机器ID 启动MMU 其他操作 start_kernel 处理命令行 分区 kernel(四)源码浅析 建立 ...

  5. PHP-Yii执行流程分析(源码)

    转自:http://www.cnblogs.com/zhanghaoyong/articles/2659846.html 一 目录文件 |-framework     框架核心库 |--base    ...

  6. 【RuoYi-Vue-Plus】学习笔记 42 - Easy Excel(二)Excel 2007(*.xlsx)导入流程分析(源码)

    文章目录 前言 参考目录 框架集成 1.Maven 2.框架集成公共部分 2.1.Excel 操作工具类 `ExcelUtil` 2.2.导入监听接口 `ExcelListener` 2.3.默认监听 ...

  7. Spring事件监听流程分析【源码浅析】

    一.简介 Spring早期是通过实现ApplicationListener接口来定义监听事件,在spring4.2的时候开始我们可以通过@EventListener注解来定义监听事件,Applicat ...

  8. python开源聊天机器人ChatterBot——聊天机器人搭建、流程分析、源码分析

    开源聊天机器人ChatterBot 3.1  ChatterBot简介 ChatterBot是一个Python库,可以轻松生成对用户输入的自动响应.ChatterBot使用一系列机器学习算法来产生不同 ...

  9. 【RuoYi-Vue-Plus】学习笔记 41 - Easy Excel(一)Excel 2003(*.xls)导入流程分析(源码)

    文章目录 前言 参考目录 框架集成 1.Maven 2.框架集成公共部分 2.1.Excel 操作工具类 `ExcelUtil` 2.2.导入监听接口 `ExcelListener` 2.3.默认监听 ...

最新文章

  1. 如果地府需要一个后台管理系统,你会如何设计?
  2. VirtualBox下安装RHEL5.5+Oracle 11g手记
  3. Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls、07版的xlsx、升级版SXSSF)
  4. php写接口的注意事项,接口的调用注意事项
  5. 一分钟带你快速进入Nacos的世界,史上最简易教程!零基础也能看明白!谁反对?
  6. (转)Apache Ant 环境开发Android应用 二
  7. java jvm调优_(第2部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
  8. Spring的依赖注入陷阱
  9. 为什么使用1 * 1 的卷积核
  10. 基于栈的后缀表达式求值(洛谷P1449题题解,Java语言描述)
  11. 12.引入依赖项目的时候,如果找不到jar
  12. 卡巴斯基终身免费用的方法
  13. nginx中proxy_pass的作用以及注意事项(不看后悔一生)
  14. c++语言程序中,main()函数必须放在程序开始的部分,C++多选题(附答案)
  15. 《计算机达人成长之路——憧憬与迷茫篇》有钱的捧个预订场,有人的捧个评价场...
  16. centos7 开机提示:ENTERING EMERGENCY MODE. EXIT THE SHELL TO CONTINUE.
  17. CUDA学习第三天:Kernel+grid+block关系
  18. XSS是什么?(Xmind配文详解)
  19. SwiftUI - Shape(Circle, Rectangle,RoundedRectangle,Capsule,Path)
  20. 计算机页面新建,电脑PS如何新建多个画布并使其显示在一个界面

热门文章

  1. 面试!什么是数据仓库?
  2. nginx 1.14 php,安装php7.2+nginx1.14.2常见报错解决方法_2018_lcf
  3. Android开发 8.0及以上调用相机/相册,并根据Uri获取图像绝对路径,并进行文件上传
  4. IDEA 代码不报红但是编译不通过 报错:java: 程序包xxx.xxx不存在 java: 找不到符号 lombok不存在
  5. nwjs sdk linux x64,Ubuntu环境下的nwjs安装及使用教程
  6. VirtualBox虚拟机Linux从安装到快乐使用之配置设置
  7. 家里亲戚开复印店的!让我给写一个简单的打印店计费程序!实用!
  8. 罗兰经典合成器合集-Roland Cloud Bundle NO INSTALL WiN(免安装版)
  9. 我,土木人,时隔7年转行计算机,差点放弃了
  10. 防火墙单向访问控制_防火墙TCP的单向控制