上图提供了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. ATT&CK如何落地到安全产品

    科普:ATT&CK是什么 ATT&CK的提出是为了解决业界对黑客行为.事件的描述不一致.不直观的问题,换句话说它解决了描述黑客行为 (TTP) 的语言和词库,将描述黑客攻击的语言统一化 ...

  2. 解决pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.问题

    国内的其他镜像源清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技 ...

  3. 08 . Python3高阶函数之迭代器、装饰器

    Python3高阶函数之迭代器.装饰器 列表生成式 推导式就是构建比较有规律的列表,生成器. 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里 ...

  4. Redis 入门到分布式 (五) Redis持久化的取舍和选择

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) Redis持久化的取舍和选择 持久化的作用 RDB AOF RDB和AOF的选择 一.持久化的作用   ...

  5. 数据库之 MySQL --- 下载、安装 及 概述(一)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一 . MySql数据库的安装 1.图解MySQL程序结构 ​ 2.双击运行安装程序:以Win32位为例 ...

  6. Java实现 LeetCode 725 分隔链表(暴力)

    725. 分隔链表 给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分. 每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 nu ...

  7. Java GUI 窗体事件

    import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; publi ...

  8. java实现第九届蓝桥杯全排列

    全排列 对于某个串,比如:"1234",求它的所有全排列. 并且要求这些全排列一定要按照字母的升序排列. 对于"1234",应该输出(一共4!=24行): 12 ...

  9. Linux权限管理命令chown、chgrp、umask详解

    命令chown详解 命令chown,所在路径为: 可以看到,这个命令的路径为:/usr/bin/chown ,所以它的执行权限是所有用户 命令的基本功能是改变文件或目录的所有者(只有root可以进行, ...

  10. 在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.

    网上很多写使用WindowsMediaPlayer WMP控件的文章. 大多数都是从工具栏或COM导入. 最近正在做的CEF整合Asp.Net Core Blazor server side的过程中, ...