zoukankan      html  css  js  c++  java
  • Struts2 执行流程 以及 Action与Servlet比较 (个人理解)

      

        上图提供了struts2的执行流程。如下:

        1:从客户端发出请求(HTTPServletRequest)。

        2:请求经过各种过滤器(filter),注:一般情况下,如SiteMesh等其他过滤器要放在核心控制器FilterDispatcher之前,也就是web.xml中配置的filter-mapping在

     StrutsPrepareAndExecuteFilter之前.  在执行完了所有的过滤器的doFilter方法之后,核心控制器FilterDispatcher会清空ActionContext。所以, 其中ActionContextCleanUp作用是在doFilter里设置了一个计数器,使后续的filter不会清空ActionContext,最后执行完流程后由ActionContextCleanUp清空。如果没有ActionContextCleanUp,如果涉及到struts2中的如valuestack中的数据时会有可能得不到想要的数据。

        3:经过各种过滤器后,到达核心控制器FilterDispatcher,被调用后,通过struts.xml配置文件中Action标签中的映射来确定调用的Action方法,

        4:当确定了调用的Action之后会找到反射生成的指定Action的代理对象(ActionProxy),

        5:ActionProxy会通过配置文件信息找到指定的Action,

        6:然后会经过系统和自定义拦截器栈,拦截器中都有重写一个public String doIntercept(ActionInvocation invocation) throws Exception{}的方法,

    拦截器中会通过判断有执行invocation.invoke()返回一个字符串,来连接到下一个拦截器或者到达执行Action。

        7:action执行完毕后,会返回一个字符串,该字符串与配置文件Action中result的name属性相对应,将处理得到的数据封装到此视图来,

        8:在依次出了拦截器栈之后,将数据响应(HttpServletResponse)到客户端。其中在经过ActionContextCleanUp时候会清空ActionContext。

        由上面执行流程可以看出Action与servlet不同:

        Servlet是单实例多线程的,而Action是多实例多线程的。因为多实例,所有每个请求会产生不同的Action和ActionContext对象,因此线程是安全的。同时因为Action是多实例的,所以Action中可以有成员变量,因为多实例不会公用。而Servlet是单实例多线程,所以一般情况下不会定义成员变量,因为共用同一个成员变量可能出现线程安全的问题。

  • 相关阅读:
    工程的创建
    scrapy框架简介和基础应用
    移动端数据爬取
    Python网络爬虫之图片懒加载技术、selenium和PhantomJS
    验证码处理
    Python网络爬虫之requests模块
    Python网络爬虫之三种数据解析方式
    Python网络爬虫之requests模块
    scrapy
    基于XML的AOP配置
  • 原文地址:https://www.cnblogs.com/bingzhikun/p/4833514.html
Copyright © 2011-2022 走看看