上图提供了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是单实例多线程,所以一般情况下不会定义成员变量,因为共用同一个成员变量可能出现线程安全的问题。

Servlet的单例不由class来决定,而是由您在web.xml里配置的servlet-name来决定。也就是说每一个servlet-name只有1个单例

一定要注意servlet的线程安全问题,因为servlet是单例的,如果你在servlet里面定义成员变量,就会被多个请求的线程锁访问,导致线程安全问题,所以一定要注意servlet的线程安全问题,action是每一次请求都会产生一个action,所以是不会存在线程安全问题的

所以在清单文件里面配置的时候action 的scope配置为prototype表示每次请求都产生一个action

Struts2 执行流程 以及 Action与Servlet比较 (个人理解)的更多相关文章

  1. struts2执行流程和架构图

    一.struts2执行流程 二.架构图 只需要编写黄色部分的代码:

  2. struts2 之 【struts2简介,struts2开发步骤,struts2详细配置,struts2执行流程】

    入门框架学习避免不了的问题: 1. 什么是框架? 简单的说,框架就是模板,模子,模型.就是一个可重用的半成品. 2. 如何学习框架? 学习框架其实就是学习规则,使用框架就是遵循框架的规则,框架是可变的 ...

  3. springmvc与struts2执行流程比较

    之前写过一篇struts2的执行流程的文章了,这里对struts2的流程就不做过多的分析,这篇文章主要分析spring-mvc的执行流程以 及struts2与spring-mvc的差别. 1.stru ...

  4. Struts2 执行流程

    struts2执行原理(执行流程) 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1 客户端发送请求:(HttpServletRequest)2 这个请求经过一系列的过滤器(Filter ...

  5. struts2执行流程

    当Web容器收到 请求(HttpServletRequest) 1.它将请求传递给一个标准的的过滤链包括 (ActionContextCleanUp)过滤器 2.然后经过Other filters(S ...

  6. struts2 执行流程及工作原理

    在Struts2框架中的处理大概分为以下的步骤  1 用户发送请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过 ...

  7. Struts2学习笔记(五)——Action访问Servlet API

    在Strut2中访问Servlet API有三种方式: 1.通过ActionContext访问Servlet API,推荐使用这种,但是这种方案它获取的不是真正的事Servlet API. 步骤: 1 ...

  8. 两张图概括struts2执行流程核心(经典)

  9. Struts2第二篇【开发步骤、执行流程、struts.xml讲解、defalut-struts讲解】

    前言 我们现在学习的是Struts2,其实Struts1和Struts2在技术上是没有很大的关联的.Struts2其实基于Web Work框架的,只不过它的推广没有Struts1好,因此就拿着Stru ...

随机推荐

  1. Cypress系列(5)- 自定义 Cypress

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前言 Cypress 不仅支持用户自定义 ...

  2. 记录B端和C端产品的理解

    C 为:Consumer.Client,我们每天都在接触C端产品,为消费者.个人用户或终端用户,比如:微信.头条.抖音.美团等等. B 为:Business,作为职场人士也会经常接触B端产品,通常为企 ...

  3. Rocket - debug - Example: Triggers

    https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw 介绍riscv-debug的使用实例:配置Triggers功能. 1. Trigger Trigge ...

  4. [leetcode] 动态规划(Ⅰ)

    这次按通过率从高到低刷题. 本文完成的题目:{338, 1025, 303, 121, 53, 392, 70, 746, 198} ,带有「面试」Tag 的题目:Interview - {1617, ...

  5. MySQL国内镜像下载地址

    最近重新下载MySQL发现官网下载速度不是一般的慢,官网下载要几个钟而且一不注意就被取消下载了,实在受不了 可以使用sohu的镜像:http://mirrors.sohu.com/mysql/MySQ ...

  6. JAVASE(九)面向对象特性之 : 继承性、方法重写、关键字super、

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.继承性 1.1 为什么要类的继承性?(继承性的好处) ①减少了代码的冗余,提高了代码的复用性:②更好 ...

  7. JavaScript (六) js的基本语法 - - - Math 及 Date对象、String对象、Array对象

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Math 1.Math对象的案例 var result= Math.max(10,20,30,40) ...

  8. 数组API汇总

    数组API汇总   Javascript数组API: 1.将数组转化为字符串:2种: 1.var str=String(str); 将数组转化为字符串并分隔每个元素; var arr=[1,2,3]; ...

  9. (Java实现) 洛谷 P1091合唱队形

    题目描述 NN位同学站成一排,音乐老师要请其中的(N−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,-,K1,2,-,K,他们的身 ...

  10. Java实现 LeetCode 594 最长和谐子序列(滑动窗口)

    594. 最长和谐子序列 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3, ...