• 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类都已出现,下一章看看还会出现哪些

  • 相关阅读:
    分段控制器UISegmentedControl的使用、同一个控制器中实现多个View的切换、addChildViewController等方法的使用
    警示框UIAlertController的使用(看完马上会用!!)
    断言NSAssert的使用
    概念篇(一)
    《iOS开发进阶》书籍目录
    《编写高质量iOS与OS X代码的52个有效方法》书籍目录
    《精通Objective-C》书籍目录
    《iOS设计模式解析》书籍目录
    《精通iOS开发》书籍目录
    常用的代码块
  • 原文地址:https://www.cnblogs.com/haon/p/10842157.html
Copyright © 2020-2023  润新知