3.2 Struts2的运行流程
3.2.1 运行流程
先回忆一下在HelloWorld中,我们做了什么:
- 在web.xml中配置了Struts2的过滤器
- 写了一个Action类,名称为HelloWorldAction
- 在struts.xml中配置了这个Action类
- 写了两个页面,一个是登录页面,一个是欢迎页面
只做了这么点事情,就可以在Struts2的帮助下顺利完成功能调用,那么Struts2内部是怎么运行的呢?逐步来根据架构图进行分析。
1:首先是在登录页面,用户填入帐号和密码,然后点击提交按钮,好了,就从这里开始分析背后的处理流程,这是我们进行分析的起点。
2:当用户提交登录请求后,请求的URL为:“/helloworld/helloworldAction.action”,请求会被Tomcat服务器接收到,Tomcat服务器会根据请求URL中的web上下文,也就是“/helloworld”,来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求。
3:Web容器会去读取helloworld这个工程的web.xml,在web.xml中进行匹配,发现后缀为“.action”的请求,由struts2这个过滤器来进行处理,根据Filter的配置,找到实际的类为FilterDispatcher。
4:Web容器会获取FilterDispatcher这个类的实例,然后回调doFilter方法,进行真正的处理。FilterDispatcher作为前端控制器,是整个Struts2的调度中心。
注意:在架构图上,可以看到有三个过滤器层次,分别是ActionContextCleanUp、SiteMesh等其他过滤器和FilterDispatcher。这三个层次中,ActionContextCleanUp和FilterDispatcher是Struts2的过滤器,而SiteMeshSiteMesh等其他过滤器不是。
FilterDispatcher是任何一个Struts2应用都需要配置的,一般出现在过滤器链的最后;如果在FilterDispatcher前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器。
在前面的helloworld中,并没有出现SiteMesh这种特殊的过滤器,所以只需要引用FilterDispatcher就可以了。
这就相当于前进到Struts2架构图上的第一步,如下所示:
图3.2 Struts2流程第一步
5:FilterDispatcher将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理。
这就相当于前进到Struts2架构图上的第二步,如下所示:
图3.3 Struts2流程第二步
6:ActionMapper告诉FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,所以通常情况下:FilterDispatcher应该出现在过滤器链的最后。然后建立一个ActionProxy对象,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。
这就相当于前进到Struts2架构图上的第三步,如下所示:
图3.4 Struts2流程第三步
7:ActionProxy对象刚被创建出来的时候,并不知道要运行哪个Action,它手里只有从FilterDispatcher中拿到的请求的URL。这时候,它去向ConfigurationManager询问到底要运行哪个Action。
回忆一下,某个特定的URL由哪个Action响应由谁负责,定义在什么地方呢?没错,在struts.xml里面。而ConfigurationManager就是负责读取并管理struts.xml的,可以简单的理解为ConfigurationManager是struts.xml在内存中的映像。
在服务器启动的时候,ConfigurationManager会一次性的把struts.xml中的所有信息读到内存里,并缓存起来,以保证ActionProxy拿着来访的URL向他询问要运行哪个Action的时候,就可以直接匹配、查找并回答了。
这就相当于前进到Struts2架构图上的第四步和第五步了,如下所示:
图3.5 Struts2流程第四步和第五步
8:ActionProxy拿到了运行哪个Action、相关的拦截器以及所有可能使用的result信息,就可以着手建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。
注意:Action运行绝不仅仅只是运行Action的execute方法这么简单,还包括其他部分,完整的调用过程由ActionInvocation对象负责。
这就相当于前进到Struts2架构图上的第六步,如下所示:
图3.6 Struts2流程第六步
9:回忆一下,HelloWorld中Action的execute方法运行的时候,是不是它的属性就已经有了请求中的参数呢?这说明,在execute方法之前,有人偷偷的帮我们做了这件事,把请求中的参数赋值到了Action的属性上,这个“有人”就是刚刚说的拦截器。
拦截器的运行被分成两部分,一部分在Action之前运行,一部分在Result之后运行,而且顺序是刚好反过来的。也就是在Action执行前的顺序,比如是拦截器1、拦截器2、拦截器3,那么运行Result之后,再次运行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1了。
总之ActionInvocation对象执行的时候比较复杂,会做很多事:
- 首先按照拦截器的引用顺序依次执行各个拦截器的前置部分。
这就相当于前进到Struts2架构图上的第七步,如下所示:
图3.7 Struts2流程第七步
这就相当于前进到Struts2架构图上的第八步,如下所示:
图3.8 Struts2流程第八步
- 然后根据execute方法返回的结果,也就是Result,在struts.xml中匹配选择下一个页面
这就相当于前进到Struts2架构图上的第九步,如下所示:
图3.9 Struts2流程第九步
- 找到页面后,由于现在的页面一般都是模板页面,在页面上,可以通过Struts2自带的标签库来访问需要的数据,并生成最终页面
这就相当于前进到Struts2架构图上的第十步,如下所示:
图3.10 Struts2流程第十步
- 最后,ActionInvocation对象再按照拦截器的引用顺序的倒序依次执行各个拦截器的后置部分。
这就相当于前进到Struts2架构图上的第十一步,如下所示:
图3.11 Struts2流程第十一步
10:ActionInvocation对象执行完毕后,实际上就已经得到响应对象了,也就是HttpServletResponse对象,最后按与过滤器器配置定义相反的顺序依次经过过滤器,向用户展示出响应的结果。
这就相当于前进到Struts2架构图上的第十二步,得到最终完整的系统架构图了,这里就不再去赘述了。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4154.html】
欢迎访问http://sishuok.com获取更多内容
分享到:
相关推荐
这个压缩包中的“研磨Struts2配书视频对应的演示源代码”是《研磨Struts2》一书作者为了帮助读者更好地理解和实践书中理论知识而提供的实际示例代码。 首先,让我们深入理解Struts2的核心概念和技术特性: 1. **...
### 知识点一:Struts2入门(MVC HelloWorld) #### 1.1 Struts2简介 ...以上就是关于“研磨Struts2”的主要知识点梳理,通过深入学习这些内容,开发者可以更好地掌握Struts2框架的核心技术和实践技巧。
由于文件较大,我把这个文档切割为2部分,这是第一部分,请下载完第一部分后一定要下载第二部分,否则不能阅读。
《研磨Struts2》这本书是专门针对Struts2框架的学习指南,通过深入浅出的方式讲解了Struts2的核心概念和技术。其配套的PPT和视频旨在帮助读者更直观地理解书中的理论知识,并将其付诸实践。 在研读《研磨Struts2》...
为了更好地理解和概括这份资料所涉及的知识点,我们先来了解一下Struts 2框架及其重要性,然后深入探讨《研磨Struts 2》这本书的主要内容。 ### Struts 2框架简介 Struts 2是Apache Struts的一个版本,它是用于...
6. **运行流程**:理解Struts2的运行流程至关重要。当一个请求到达时,Struts2会解析请求参数,调用相应的Action,执行完Action后,通过Result将结果转发到指定的视图。 7. **Action**:Action是Struts2的核心,它...
研磨Struts2 高清完整版,请和第一部分一起下载啊
研磨Struts2_12859679_高清完整版
研磨Struts2-高清-完整目录-2011年10月,分享给所有需要的人
Java工程师三大框架面试题.pdf
陈臣:十年Java/JavaEE开发经验,高级系统架构师,功力深厚,技术精湛,精通Java/JavaEE相关技术和多种开源框架,尤其擅长系统分析和架构设计。从事过专业的中间件研发,包括基于组件的Web页面框架、基于WFMC的工作...
陈臣:十年Java/JavaEE开发经验,高级系统架构师,功力深厚,技术精湛,精通Java/JavaEE相关技术和多种开源框架,尤其擅长系统分析和架构设计。从事过专业的中间件研发,包括基于组件的Web页面框架、基于WFMC的工作...
陈臣:十年Java/JavaEE开发经验,高级系统架构师,功力深厚,技术精湛,精通Java/JavaEE相关技术和多种开源框架,尤其擅长系统分析和架构设计。从事过专业的中间件研发,包括基于组件的Web页面框架、基于WFMC的工作...
3. **《程序员编程艺术第一~二十七章集锦与总结(教你如何编程)%28by_July%29定稿版》**:这本书可能是作者July的编程经验总结,包含了编程艺术的多个方面,从基础到进阶,可能涵盖良好的编程习惯、设计模式、算法...