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

本文是自己学习,复习时写下的,不适合其他人学习阅读。

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

用JadClipse反编译debug源码

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

先看init方法初始化了什么

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

55、FilterHostConfig包装了FilterConfig

56、init.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,作用自己百度,可以无视。 

64、留给子类重写的空方法                                              

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、没仔细看,猜是url的参数处理?

总结

init方法

用初始化处理器进行操作,最关键的:dispatcher = init.initDispatcher(config),用dispatcher.init()生成了IOC容器,加载了一系列的配置(总览图中的ConfigurationManager管理配置)

生成了其他操作类和相关的类

doFilter方法

用预处理器生成做一些准备工作,执行处理器处理请求

最关键的:

prepare.createActionContext(request, response);//创建ActionContext(ThreadLocal)
prepare.assignDispatcherToThread();//给线程Dispatcher(ThreadLocal)

ActionMapping mapping = prepare.findActionMapping(request, response, true);//根据请求生成ActionMapping对象

execute.executeAction(request, response, mapping);//真正处理匹配处理请求

总览图的ConfigurationManager和ActionMapping类都已出现,下一章看看还会出现哪些

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