Struts2【三】 StrutsPrepareAndExecuteFilter 源码分析<一>

先把关键的类总体一览一下

用JadClipse反编译debug源码

都知道Filter三个方法,init,doFilter,destory

先看init方法初始化了什么

先按名字记住几个关键类,initOperation初始化处理器,Dispatcher派发器,PrepareOperations预处理器,ExecuteOperations执行处理器

55、FilterHostConfig包装了FilterConfig

56、nit.initLogging不用管,这个貌似是过滤器初始化参数指定的日志工具,指定了才会生成

57、init.dispatcher这一步很关键,也很复杂,一定要先看完大手子的文章再继续看下文(https://www.cnblogs.com/hayasi/p/5822169.html),大手子说这是个strtuts的IOC部分(难怪struts-default.xml里有一些bean的标签)

58、生成了一个静态内容加载器,进去看这个类,应该功能和名字一样,findStaticResource应该就是访问静态资源的。

跳过PrepareOperations、ExecuteOperations初始化,没做其他操作。

62、用IOC容器container获取一个配置常量,struts.action.excludePattern,作用自己百度,可以无视

67-69、接下来做初始化操作清理看了下源码,清理的对象好像是ThreadLocal<Container>和ActionContext,都是和线程有关的量,把初始化处理器里的线程信息都清理了

再看doFilter方法

直接读英文都能看各大概

85-86、接上文struts.action.excludePattern配置如果存在,且该请求包括在内就不处理

88、设置了encoding 编码、locale,不知道有啥用

89、在下面

90、给线程分配一个调度器,原来调度器也是个线程量

91、包装HttpServletRequest为StrutsRequestWrapper类,目的暂时不明,包装成自己的类放一些信息比较方便吧。

92、生成ActionMapping,我以为这里会去匹配mapper其实并没有,只是按照你给的request请求行生成一个符合规则的Mapping类,下面细说。

93-97、如果生成为空(不以.action后缀或没有后缀名),则当做静态资源处理,如果连静态资源都不是,扔给过滤器链

99、最关键的执行处理器处理请求了,这里面将会生成ActionProxy(如上总览图所示),下一篇文章会细说里面发生了什么,而ActionMapping如果是不存在,生成ActionProxy会抛出异常,真正去匹配Action的就是ActionProxy。

103、清理预处理器里的request、dispatcher、actionContext线程有关的变量

89、预处理器创建ActionContext,生成一个ActionContext如果存在老的,contextmap值不变。不存在就用req、res新建一个contextmap,contextmap是什么如下图所示,应该就是我们用ActionContext内的对象在这一步生成了

findActionMapping方法,关键在164行,用IOC容器生成了一个ActionMapper类,调用了getMapping方法

getMapping方法就是做一个解析request请求的作用

259、去除后缀名,如果后缀不以.action或空,则返回null

264、填充ActionMapping的名字和命名空间

265、没仔细看,猜是参数处理?

原文地址:https://www.cnblogs.com/haon/p/10842157.html

时间: 2024-08-29 17:19:17

Struts2【三】 StrutsPrepareAndExecuteFilter 源码分析<一>的相关文章

EasyUI学习总结(三)——easyloader源码分析

EasyUI学习总结(三)--easyloader源码分析 easyloader模块是用来加载jquery easyui的js和css文件的,而且它可以分析模块的依赖关系,先加载依赖项.模块加载好了会调用parse模块来解析页面.把class是easyui开头的标签都转化成easyui的控件. 先看Demo1例子,再分析源代码. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>easyloader范例</tit

EasyUI学习总结(三)——easyloader源码分析(转载)

声明:这一篇文章是转载过来的,转载地址忘记了,原作者如果看到了,希望能够告知一声,我好加上去! easyloader模块是用来加载jquery easyui的js和css文件的,而且它可以分析模块的依赖关系,先加载依赖项.模块加载好了会调用parse模块来解析页面.把class是easyui开头的标签都转化成easyui的控件. 先看Demo1例子,再分析源代码. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>ea

tcp的半连接与完全连接队列(三)源码分析

TCP 协议中的 SYN queue 和 accept queue 处理 若要理解本文意图说明的问题,可能需要以下知识背景: listen 系统调用的 backlog 参数含义,以及与 net.core.somaxconn 参数的关系: SYN flood 攻击与防护: SYN queue 和 accept queue 的用途,以及在不同 linux 版本中的实现差异: ---- 在 SYN queue 未满的情况下,在收到 SYN 包后,TCP 协议栈自动回复 SYN,ACK 包,之后在收到

[原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Sturts2【四】 StrutsPrepareAndExecuteFilter源码分析&lt;二&gt;

本文供个人学习,复习使用,不适合他人阅读 接上文讲到ActionProxy了,还不知道这个类的作用,名字是action的代理类,实际上作用还得看看. ExecuteOperations类 execute.executeAction调用了调度器处理action请求,看下文具体讲serviceAciton方法 Dispatcher类 532-546.都在做一件事,创建出了一个contextmap副本,也就是前文说过的ActionContext中里的数据Map,然后获取/创建ValueStack(老熟

struts2请求过程源码分析

Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定.性能优异.设计成熟的WEB框架. 我这里的struts2源码是从官网下载的一个最新的struts-2.3.15.1-src.zip,将其解压即可.里面的目录页文件非常的多,我们只需要定位到struts-2.3.15.1\src\core

【Spring】Spring&amp;WEB整合原理及源码分析

表现层和业务层整合: 1. Jsp/Servlet整合Spring: 2. Spring MVC整合SPring: 3. Struts2整合Spring: 本文主要介绍Jsp/Servlet整合Spring原理及源码分析. 一.整合过程 Spring&WEB整合,主要介绍的是Jsp/Servlet容器和Spring整合的过程,当然,这个过程是Spring MVC或Strugs2整合Spring的基础. Spring和Jsp/Servlet整合操作很简单,使用也很简单,按部就班花不到2分钟就搞定了

cstore_fdw的安装使用以及源码分析

一.cstore_fdw的简介 https://github.com/citusdata/cstore_fdw,此外部表扩展是由citusdata公司开发,使用orc_file格式对数据进行列式存储. 优点1:因为有压缩,所以在disk上的存储大大减少,压缩比能达到2-4倍 优点2:数据内部分块存储,对于块数据进行了max以及min值的记录,在查询时能够进行跳块查询 优点3:在进行查询时,并不是将所有的磁盘数据都load到内存,而是选择列根据记录的skiplist中的offset来load所需要

There is no getter for property named &#39;*&#39; in &#39;class java.lang.String&#39;之源码分析

There is no getter for property named '*' in 'class java.lang.String',此错误之所以出现,是因为mybatis在对parameterType="String"的sql语句做了限制,假如你使用<when test="username != null">这样的条件判断时,就会出现该错误,不过今天我们来刨根问底一下. 一.错误再现 想要追本溯源,就需要错误再现,那么假设我们有这样一个sql查询