本文是自己学习,复习时写下的,不适合其他人学习阅读。
先把关键的类总体一览一下
用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类都已出现,下一章看看还会出现哪些