Struts2是一套非常优秀的Web应用框架,实现优雅、功能强大、使用简洁。可以说是Struts2是一款非常成熟的MVC架构。

在我们学习Struts2时,最好是先学习它的运行流程、核心概念,从中得到启发,提升自己,而不仅仅是学习怎么怎么使用它。

在网上看到这样一句话:

你千万不要成为一个只会熟练使用框架的程序员,那样,你会疲于奔命,你也许永远只会使用 Hadoop ,而写不出一个 Hadoop ,你只是一个 Hadoop程序员,而不是一个分布式工程师。
你也许永远只会使用 Struts,而忘记了自己写 filter,你只是一个 SSH 程序员,而不是一个 Web 工程师。

话不多说,一起走进Struts2

一、系统架构

Struts2的官方文档附带了Struts2的架构图。从这张图可以很好的去理解Struts2


关于图中的Key:

  • Servlet Filters:过滤器链,客户端的所有请求都要经过Filter链的处理。
  • Struts Core:Struts2的核心部分,但是Struts2已经帮我们做好了,我们不需要去做这个
  • Interceptors,Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;而我们自定义的拦截器,用来实现实际的客户业务需要的功能。
  • User Created,由开发人员创建的,包括struts.xml、Action、Template,这些是每个使用Struts2来进行开发的人员都必须会的。


  • 1.FilterDispatcher是整个Struts2的调度中心,也就是MVC中的C(控制中心),根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
  • 2.ActionMapper 会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
  • 3.ActionProxy,它会创建一个ActionInvocation实例,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
  • 4.ConfigurationManager是xwork配置的管理中心,可以把它看做struts.xml这个配置文件在内存中的对应。
  • 5.struts.xml,是开发人员必须光顾的地方。是Stuts2的应用配置文件,负责诸如URL与Action之间映射关系的配置、以及执行后页面跳转的Result配置等。
  • 6.ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会按照指定的顺序去执行这些拦截器、Action以及相应的Result。
  • Interceptor(拦截器):是Struts2的基石,类似于JavaWeb的Filter,拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。
  • 7.Action:用来处理请求,封装数据。

  • 二、运行流程

1.当用户的发出请求,比如http:localhost:8080/Struts2/helloworld/helloworldAction.action,请求会被Tomcat接收到,Tomcat服务器来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求。
2.Web容器会去读取helloworld这个工程的web.xml,在web.xml中进行匹配,但发现,由struts2这个过滤器来进行处理(也就是
StrutsPrepareAndExecuteFilter),根据Filter的配置,找到FilterDispatcher(Struts2的调度中心)
3.然后会获取FilterDispatcher实例,然后回调doFilter方法,进行真正的处理
PS:FilterDispatcher是任何一个Struts2应用都需要配置的,通常情况下,web.xml文件中还有其他过滤器时,FilterDispatcher是放在滤器链的最后;如果在FilterDispatcher前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器

对应Struts2的架构图如下



4.这时FilterDispatcher会将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理。ActionMapper就类似于公司的保安,来识别是不是当前客户是不是我公司的人

对应Struts2的架构图如下



5.如果需要Struts2处理,ActionMapper会通知FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,(这也就是为什么,FilterDispatcher应该出现在过滤器链的最后的原因)。然后建立一个ActionProxy实例,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。

对应Struts2的架构图如下



6.ActionProxy对象在被创建出来的时候,并不知道要运行哪个Action,它手里只有从FilterDispatcher中拿到的请求的URL。
而真正知道要运行哪个Action的是ConfigurationManager。因为只有它才能读取我们的strtus.xml

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

对应Struts2的架构图如下

->

7.ActionProxy知道自己该干什么事之后(运行哪个Action、相关的拦截器以及所有可能使用的result信息),然后马上建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。

注意:Action完整的调用过程都是由ActionInvocation对象负责


对应Struts2的架构图如下




8.在execute方法之前,好像URL请求中的参数已经赋值到了Action的属性上,这就是我们的"雷锋"—拦截器。

拦截器的运行被分成两部分,一部分在Action之前运行,一部分在Result之后运行,而且顺序是刚好反过来的。也就是在Action执行前的顺序,比如是拦截器1、拦截器2、拦截器3,那么运行Result之后,再次运行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1了。

这就好比,你要去奶奶家,需要通过 水泊梁山->盘丝洞 -> 索马里,到了奶奶家,看奶奶回来的时候,就必须要通过 索马里 -> 盘丝洞 -> 水泊梁山。

所以ActionInvocation对象执行的时候需要通过很多复杂的过程,按照指定拦截器的顺序依次执行。


对应Struts2的架构图如下





9.到了奶奶家,然后执行Action的execute方法





10.然后根据execute方法返回的结果(Result),去struts.xml中匹配选择下一个页面




11.根据结果(Result)找到页面后,在页面上(有很多Struts2提供的模板),可以通过Struts2自带的标签库来访问需要的数据,并生成最终页面

注意:这时还没有给客户端应答,只是生成了页面




12.最后,ActionInvocation对象倒序执行拦截器,从奶奶家回来




13.ActionInvocation对象执行完毕后,已经得到响应对象(HttpServletResponse)了,最后按与过滤器(Filter)配置定义相反的顺序依次经过过滤器,向客户端展示出响应的结果


得到完整Struts2架构图






Struts2的运行流程及其工作原理相关推荐

  1. php的工作原理,PHP的运行机制和工作原理的内容

    这篇文章给大家介绍的内容是关于PHP的运行机制和工作原理的内容,有着一定的参考价值,有需要的朋友可以参考一下. 一.PHP设计理念及特点 多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保 ...

  2. MyBatis核心流程以及工作原理

    MyBatis核心对象 根据以下这四大核心对象,我们就能理清MyBatis的工作原理. SqlSession对象,该对象中包含了执行SQL语句的所有方法.类似于JDBC里面的Connection. E ...

  3. zookeeper集群部署监控与选举同步流程等工作原理

    部署一个zookeeper集群,要多简单就能有多简单(下载压缩包,解压,修改配置文件zoo.cfg,执行启动脚本),但是想要真的把这套东西玩好了,还是需要费些功夫研究一番的.就跟自己搭建一个lnmp的 ...

  4. 【struts2】Struts2的运行流程

    1)前提条件 在讲解流程之前,假设我们已经建立了的一个名为strutsDeepen的web工程,该工程仅仅实现了简单的用户登陆与欢迎界面.具体的实现为: 在web.xml中配置了Struts2的过滤器 ...

  5. springmvc工作流程_SpringMVC工作原理

    买了好多书,但是没有一本是看完的,这是看完的第一本书,虽然页数不多.技术早就用了老多遍了,还是总结一下吧! 一.MVC模式 MVC是 model.view.和controller的缩写,分别代表web ...

  6. springmvc工作流程_springMVC工作原理及流程详细讲解

    简述 本文主要介绍springMVC工作原理. 工作原理 客户端发送HTTP请求,DispatcherServlet控制器拦截到请求,调用HandlerMapping 解析请求对应的Handler,H ...

  7. Hadoop学习笔记 --- YARN执行流程与工作原理

    一.YARN简述 首先介绍一下YARN 在Hadoop2.0版本引进的资源管理系统,直接从MapReduce V1演化而来(由于引擎的功能缺陷): 原因是将MapReduce1中的Job Tracke ...

  8. ssh工作流程(工作原理)

    目录 ssh简介 加密的方式 ssh工作流程 1.版本号协商 2.密钥和算法协商 产生会话密钥的流程: 认证阶段 基于口令的认证: 基于公钥的认证:免密登录 ssh简介 ssh: secure she ...

  9. SpringMVC执行流程及工作原理

    1.SpringMVC的原理和组成 从上图中可以看出:SpringMVC是属于SpringWeb里面的一个功能模块(SpringWebMVC).专门用来开发SpringWeb项目的一种MVC模式的技术 ...

最新文章

  1. linux 网络编程之信号机制
  2. 电容触摸按键IC AT42QT1070
  3. 第一章 为什么使用单元测试
  4. F5 配置手册 -F5 BIG-IP 10.1-2-配置-基本参数
  5. jsp里面声明了utf-8格式,也写了字符编码过滤器,数据库编码也是utf-8,就连java.......
  6. MMJ-Spring Boot(Java)获取小程序Openid
  7. 前端学习(2848):鼠标点击事件
  8. linux 下的sar工具命令小结
  9. Spark之性能优化(重点:并行流数据接收)
  10. matlab的小波分析,Matlab下小波分析wavelet常用命令
  11. 图书馆管理系统(连接数据库)
  12. 硬笔书法三要素:笔法、结构和章法
  13. [转]决定人生的三种成本:机会成本,沉没成本,边际成本
  14. 团组情景意识概念模型
  15. 旅游业休克:“云旅游+直播买货”急救
  16. 游承超:钢化玻璃膜既保护屏幕又不影响触感(4P)
  17. 家用小型中央空调发展的现状与趋势
  18. 【Java】银行账户管理系统
  19. 计算机考研分数403,总分403分过来人分享成功考研经验_跨考网
  20. assert()使用

热门文章

  1. 阔别枭雄张近东,苏宁开启新新零售
  2. 发展TD-SCDMA业务以需求为重
  3. [信息论与编码]知识点总结
  4. SECS/GEM300半导体标准,12寸晶圆半导体标准
  5. 视频监控p2p android,网络视频监控P2P解决方案:NAT穿越
  6. HTML期末大作业 : 一个简单的音乐网站设计与实现(HTML+CSS)
  7. java word,excel,ppt转pdf
  8. 复旦投毒案宣判:嫌犯表情漠然 对死刑反应淡定
  9. Golang使用go mod 导入本地库
  10. phpexcel锁定需要密码才能修改