Struts2请求处理的内部流程图/结构图/原理图(版本二)

文章目录

  • 请求处理流程图
  • 流程说明

请求处理流程图

在这里插入图片描述

流程说明

第 1 步:

客户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求,例如:在浏览器中输入 http:localhost:8080/Struts2/helloworld/helloworldAction.action 就是提交一个HttpServletRequest 请求。

请求会被 Tomcat 接收到,Tomcat 服务器来选择处理这个请求的 Web 应用,那就是由 helloworld 这个 web 工程来处理这个请求。

第 2 步:

Web 容器会去读取 helloworld 这个工程的 web.xml,在 web.xml 中进行匹配,最后发现需要经过一堆的过滤器。

这个请求经过一系列的过滤器(Filter),例如:ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher

注意:

这里是有顺序的,先 ActionContextCleanUp,再其它过滤器,最后FilterDispatcherFilterDispatcher 是Struts 2 的调度中心,是 Struts 2 的控制器的核心,也就是 Struts 2 框架中的控制层(Controller)的核心

FilterDispatcher 必须放在滤器链的最后,如果在 FilterDispatcher 前出现了如SiteMesh 这种特殊的过滤器,还必须在 SiteMesh 前引用 Struts 2 的ActionContextCleanUp 过滤器。

Struts 2.1.3 版本后核心控制器 FilterDispatcher 被弃用了,替换成 StrutsPrepareAndExecuteFilter,因为 FilterDispatch 在执行 Action 之前不能插入自定义的过滤器, 而 StrutsPrepareAndExecuteFilter 可以在执行 Action 之前添加自己的过滤器。如果要使用 ActionContextCleanUp,则可以通过StrutsPrepareFilterStrutsExecuteFilter 进行替换。

扩展:

Struts 2 的核心控制器 FilterDispatcher,有 3 个重要的方法:destroy()doFilter()init(),执行顺序是:init()doFilter()destroy()

第 3 步:

接着 FilterDispatcher 被调用,即容器会创建 FilterDispatcher 实例,然后调 doFilter() 方法,在这个方法中,FilterDispatcher 询问 ActionMapper 是否需要调用某个 Action 来处理这个(HttpServletRequest)请求,如果 ActionMapper 决定需要调用某个 ActionActionMapper 会通知 FilterDispatcher 需要处理这个请求,FilterDispatcher 会停止过滤器链以后的部分,(这也就是为什么 FilterDispatcher 应该出现在过滤器链的最后的原因)。FilterDispatcher 则把请求的处理交给 ActionProxy,即建立一个 ActionProxy 实例,这个对象作为Actionxwork 之间的中间层,会代理 Action 的运行过程。

第 4 步:

ActionProxy 通过 ConfigurationManager 询问框架的配置文件(struts.xml),找到需要调用的 Action

注意:

在服务器启动的时候,ConfigurationManager 就会把 struts.xml 中的所有信息读到内存里,并缓存,当 ActionProxy 带着 URL 向他询问要运行哪个 Action 的时候,就可以直接查找并返回

第 5 步:

ActionProxy 创建一个 ActionInvocation 实例,同时 ActionInvocation 通过代理模式调用 Action。但在调用之前,ActionInvocation 会根据配置加载 Action 相关的所有 Interceptor(拦截器),即调用 Action 的过程前后,涉及到相关拦截器的调用

第 6 步:

一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果 result。返回结果通常是一个需要被表示的 JSP 或者 FreeMarker 的模版(不一定是页面,也可能是另外的一个 Action 链)。在表示的过程中可以使用 Struts 2 框架中继承的标签。在这个过程中需要涉及到 ActionMapper

第 7 步:

最后,ActionInvocation 对象倒序执行拦截器。ActionInvocation 对象执行完毕后,已经得到响应对象(HttpServletResponse)了,最后按与过滤器配置定义相反的顺序依次经过过滤器,向客户端展示出响应的结果,即通过 HTTPServletResponse 返回客户端一个响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xampp mysql 查询很慢_如何开启mysql的慢查询机制

1 在mysql中默认是不会开启慢查询日志功能的,我们可以使用show variables like ‘%slow%‘来查看一下。结果如下:参数说明:log_slow_queries表示服务器端是否开启慢查询日志记录功能,slow_query_log表示mysql监测满查询的功能是否…

uaa 授权_使用UAA OAuth2授权服务器–客户端和资源

uaa 授权在上一篇文章中,我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器,以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它。 我在Digital Ocean网站上发现这篇文章在描述OAuth2授权代码流方面做得很好,因此&#xf…

ps背景不变换字_PS教程:复杂背景中,如何利用通道轻松抠出发丝?

点击图片 1元抢购 PS、PR、AE等课程活动无缝抠图复杂背景当我们常用的钢笔抠图解决不了细碎的头发丝时我们可以用通道进行抠图,换背景在复杂的背景中把头发丝抠出来配套PS素材请到QQ群:565256668下载首先打开素材,我们发现背景比较复杂&…

阿里云 ram 容器镜像_容器中Java RAM的使用:不会丢失内存的5大技巧

阿里云 ram 容器镜像在本文中,我们希望分享Java内存管理的细节以及容器内部的弹性,这些细节乍一看并不明显。 在下面,您将找到要注意的问题列表以及即将发布的JDK版本中的重要更新,以及针对核心痛点的现有解决方法。 我们收集了5…

java堆内存剩余多少合理_Java堆内存的10个要点

我刚开始学习Java编程时,可不知道什么是堆内存或堆空间(heap space),甚至根本不管对象创建时都放在哪里去了。正式了写一些程序后,经常会遇到java.lang.outOfMemoryError等错误,我才开始关注堆内存。对大多数程序员都经历过这样的…

Struts2请求处理的内部流程图/结构图/原理图(版本一)

流程说明: 1.客户端浏览器(Client)向服务器发送一个 http 请求(HttpServletRequest) 2.Container(容器) 通过 web.xml 映射请求,并获得控制器(Controller)的…

java中springdi_java中spring入门

1、spring的概念apache推出的java企业框架,提供了基于ioc的对象工厂、aop面向切面编程等功能及其他增强功能。当前版本4.xxx,支持注解的配置。 springmvc。2、控制反转(ioc):inversion of control。用来描述框架的重要特征spring针对ioc的具体实现&#…

tableau选择计算_干货 | 年薪40W, 掌握Tableau的留学生真的赚翻了

文章来源:UniCareer Tableau作为一款数据分析工具向来被视为文科转行Data必学因为它不需要你有Coding经验而且极易上手那么,Tableau究竟该怎么学?学会Tableau可以胜任哪些岗位?1Tableau: 学到就是赚到Tableau作为一款数据可视化工…

Java Servlet 编程,重定向介绍

文章目录什么是重定向重定向流程演示图如何重定向注意的问题重定向的特点重定向演示什么是重定向 服务器向浏览器发送一个状态码 302 及一个消息头 location,浏览器收到后,会立即向 location 所指向的地址发送请求。 重定向流程演示图 (1&a…

java platform_Java Platform Module系统中的可选依赖项

java platformJava平台模块系统(JPMS)对依赖项有很强的见解:默认情况下,需要它们(可以访问),然后在编译时和运行时都将它们存在。 但是,这不适用于可选的依赖项,因为代码…

hibernate删除记录_Hibernate记录:常见问题的提示和解决方案

hibernate删除记录如何通过适当的日志记录解决一些最常见的Hibernate问题? Hibernate的日志记录配置是一个重要但很少讨论的主题。 正确的配置可以帮助您在开发过程中发现潜在的问题,而错误的配置则可以在生产中导致严重的性能问题。 这就是我在新书《 …

java velocity详解_[velocity] velocity详解

(1)为什么要使用模版语言?在服务器端可以使用 Velocity处理模板和生成的动态内容(HTML、XML等)。这和JSP技术的目标非常接近。但是,JSP模型可以毫无阻碍地访问底层的Servlet API和Java编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完…

pc端游戏修改器_原神:不要吐槽手机内存了,想要获得最佳游戏体验,PC端最合适...

想必大家这段时间都被一个米哈游公司的游戏给刷屏了吧,它就是号称用时三年,斥资一亿美元打造的《原神》,正是这种情况下,原神的关注远远要高于其他游戏,并且玩家的期望值也是和关注度成正比。但是,一经发布…

java调用命令行命令_Java命令行界面(第4部分):命令行

java调用命令行命令我的Java命令行解析系列的第四部分介绍了Commandline ,它被描述为 “用于解析命令行参数的Java库”,它“基于使用注释从命令行参数到对象的映射”。 像以前介绍的args4j和jbock一样, Commandline使用注释来提供潜在命令行…

JVM 内存示意图(内存结构图/内存解析图)

图 1: 图 2: 图 3: 图 4:

java登录界面命令_Java命令行界面(第8部分):Argparse4j

java登录界面命令Argparse4j是“ Java命令行参数解析器库”,其主页将其描述为“基于Python的argparse模块的Java命令行参数解析器库”。 在本文中,我将简要介绍如何使用Argparse4j 0.7.0处理命令行参数,该参数类似于本系列中的前七篇文章中有…

协议管理模块设计

文章目录协议和合同的区别协议表说明协议签署日志协议和合同的区别 如果协议的内容写得比较明确、具体、详细、齐全,并涉及到违约责任,即使其名称写的是协议,也是合同;如果协议的内容写得比较概括、原则、很不具体,也…

java登录界面命令_Java命令行界面(第7部分):JCommander

java登录界面命令这是我系列的第七篇文章,简要介绍了用于处理Java命令行参数的各种库。 这篇文章回到了基于注释的库的覆盖范围,该库似乎是在Java中可用于处理命令行参数的众多可用库中知名度最高,最受欢迎的库之一: JCommander 。…

java体系技术框架_java框架之Spring 核心框架体系结构

很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spring依赖混乱,甚至下一次创建相同类型的工程时也不知道要配置哪…