zoukankan      html  css  js  c++  java
  • (转)Struts2的工作原理

    上图来源于Struts2官方站点,是Struts 2 的整体结构。 
    一个请求在Struts2框架中的处理大概分为以下几个步骤 
    1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 
    2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 
    3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 
    4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
    5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
    6 ActionProxy创建一个ActionInvocation的实例。 
    7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
    8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 。

    在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

    一个请求在Struts2框架中的处理分为以下几个步骤:

    1.客户端发出一个指向servlet容器的请求(tomcat);

    2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。

    3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2

      的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。

      如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一

      些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,

      Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中

      需要用到的Action。

    4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象

      。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。

    5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了

      Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。 

    6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相

      关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在

      调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。

    7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果

      通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表

      示的过程中可以使用Struts2 框架中继承的标签。

    请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。 
            ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里创建ActionProxy,ActionProxy创建ActionInvocation,然后ActionInvocation调用Interceptors,执行Action本身,创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。 

    2. Struts2部分类介绍 
    这部分从Struts2参考文档中翻译就可以了。 
    ActionMapper 
            ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等java Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs/actionmapper.html。 
    ActionProxy&ActionInvocation 
            Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。 
    ConfigurationProvider&Configuration 
            ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。 

    3. Struts2请求流程 
    1、客户端提起一个(HttpServletRequest)请求,如在浏览器中输入”http://localhost:8080/Struts2/add.action”就是提起一个(HttpServletRequest)请求
    2、请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到FilterDispatcher。
    3、FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求
    4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
    5、ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类.,如上文的“add.action”
    6、ActionProxy创建一个ActionInvocation的实例
    7、ActionInvocation通过代理模式调用Action,但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor
    8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版

  • 相关阅读:
    【leetcode】1215.Stepping Numbers
    【leetcode】1214.Two Sum BSTs
    【leetcode】1213.Intersection of Three Sorted Arrays
    【leetcode】1210. Minimum Moves to Reach Target with Rotations
    【leetcode】1209. Remove All Adjacent Duplicates in String II
    【leetcode】1208. Get Equal Substrings Within Budget
    【leetcode】1207. Unique Number of Occurrences
    【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
    【leetcode】LCP 3. Programmable Robot
    【leetcode】LCP 1. Guess Numbers
  • 原文地址:https://www.cnblogs.com/tianzibobo/p/3424292.html
Copyright © 2011-2022 走看看