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

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

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

用JadClipse反编译debug源码

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

先看init方法初始化了什么

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

先按名字记住几个关键类,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。

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

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

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

 

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

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

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

 

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

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

 

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

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

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

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

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

 

上一篇:首个单元测试


下一篇:三个数由小到大排序