论坛首页 Java企业应用论坛

笔记 《研磨Struts 2》 Struts 2的架构和运行流程

浏览 4576 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-05-19   最后修改:2014-05-19
    最近在看《研磨Struts 2》,做了些笔记,写在了blog上:http://www.cnblogs.com/simon-chan/p/3735993.html
    也搬运到这边,虽然有点水,也希望能帮到人,自己有些不懂的,希望大家看了也能帮忙解释一下。
    文章里面没办法贴图,所以把图放在附件了

之前看书,笔记都是记录在云笔记上(因为实在太水,不好意思写blog)。现在感觉还是应该写在blog上,写得比较水,而且有一些不懂的地方也希望大家可以帮忙看看。之后再慢慢把以前的笔记整理上来。里面有什么不对的,希望大家可以帮忙指正。

  最近在看《研磨Struts 2》,看完了架构和运行流程,下面写一写自己的理解。

Struts 2的架构

  Struts 2的架构如下图(图从官网找的):(见附件)



1. 橙色是Servlet Filters,过滤链,所有的请求都要经过Filter链的处理。
2. 浅蓝色是Struts Core,Struts 2的核心部分,Struts 2中已经做好的功能,在实际开发中不需要动它们。
3. 浅绿色是Interceptors,Struts 2的拦截器。Struts 2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;也可以自定义拦截器用来满足具体业务的需求。
4. 浅黄色是User Created,由开发人员创建的,包括struts.xml、Action、Template。


Struts 2的运行流程
以在Tomcat下一个简单例子为例:
1. 用户在页面上填写所要求的参数数据后,触发请求事件提交请求。Tomcat服务器会接收到这个请求,并通过URL的web上下文来选择处理这个请求Web应用。(这一块的内部流程是怎样的还不清楚,等以后有接触到再补充,如果各位有了解的麻烦解释一下,先谢谢了)

2. Web容器读取对应web工程的web.xml,在这个文件中会配置哪些格式的url(如*.action等)是由Struts 2处理的。Struts 2是使用一个过滤器作为控制器的,在web.xml中会配置好对应的Filter信息,根据这个信息就可以找到实际的类FilterDispatcher。

3. Web容器会获取FilterDispatcher这个类的实例,然后回调doFilter方法,进行真正的处理。这相当于前进到Struts 2架构图(即上文的彩图)上的第一步。 (注:FilterDispatcher作为前端控制器,是整个Struts 2的调度中心)

4. FilterDispatcher将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts 2做出处理。这相当于前进到Struts 2架构图上的第二步。

5. ActionMapper告诉FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤链以后的部分,所以通常情况下:FilterDispatcher应该出现在过滤链的最后。然后建立一个ActionProxy对象,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。这相当于前进到Struts 2架构图的第三步。

6. ActionProxy对象刚被创建时,并不知道要运行哪个Action,它只有FilterDispatcher传过来的请求的URL,它将向ConfigurationManager询问要运行哪个Action。而ConfigurationManager是负责读取并管理struts.xml的,可以简单地理解为ConfigurationManager是struts.xml在内存中的映像。在服务器启动时,ConfigurationManager会一次性把struts.xml中所有信息读到内存,并缓存起来,以保证ActionProxy拿着URL来询问时可以直接匹配、查找并回答要运行哪个Action了。这就相当于前进到Struts 2架构图的第四步和第五步了。

7. ActionProxy知道要运行哪个Action、相关的拦截器以及所有可能使用到的result信息后,就建立ActionInvocation对象,用来描述Action运行的整个过程。这相当于前进到Struts 2架构图的第六步了。(注意:Action运行绝不仅仅只是运行Action的execute方法这么简单,还包括其他部分,完整的调用过程由ActionInvocation对象负责)

8. 拦截器在execute方法运行前会把参数赋值到Action属性上。拦截器的运行被分成两部分,一部分在Action之前运行,一部分在Result之后运行,而且顺序是刚好反过来的(即Action前是A、B、C,Result后就是C、B、A)。总之,ActionInvocation对象执行的时候比较复杂,会做很多事:
  a. 按拦截器的引用顺序依次执行各个拦截器的前置部分,这相当于前进到Struts 2机构图上的第七步。
  b. 执行Action的execute方法,这相当于前进到Struts 2架构图上的第八步。
  c. 根据execute方法返回的结果,即Result,在struts.xml中匹配选择下一个页面,这相当于前进到Struts 2架构图上的第九步。
  d. 找到页面后,由于现在的页面一般都是模板页面,在页面上,可以通过Struts 2自带的标签库来访问需要的数据,并生成最终页面,这相当于前进到Struts 2架构图上的第十步。
  e. 按拦截器的引用顺序的倒序依次执行各个拦截器的后置部分,这相当于前进到Struts 2架构图上的第十一步。

9. ActionInvocation对象执行完毕后,实际上就已经得到响应对象了,也就是HttpServletResponse对象,最后按与过滤器配置定义相反的顺序依次经过过滤器,向用户展示响应的结果。这相当于前进到Struts 2架构图上的第十二步(最后一步)。得到了最终完整的系统架构图。如下图(标记了步骤的序号):(见附件)





不大明白的地方
  在上面的架构图中,在第十步到达Template后,有个箭头是到Tag Subsystem,再到ActionMapper,这里书上没有说具体做了什么,希望大家能帮忙解释一下,谢谢了!
  • 大小: 64.7 KB
  • 大小: 85.3 KB
   发表时间:2014-05-26   最后修改:2014-05-26
友情提示,复制附件图片的url,在正文中使用[ img]........[/img](故意加了个空格)包起来就能让图片显示在正文中
0 请登录后投票
   发表时间:2014-05-26  
请放弃这个千疮百孔的struts2........
我的服务器不知道被struts2的漏洞攻击了多少次......果断抛弃
0 请登录后投票
   发表时间:2014-05-26  
这个内容在strutshome网站上也可以看到的。
0 请登录后投票
   发表时间:2014-05-26  
记得《研磨Struts 2》作者在Iteye上与SpringMVC党吵了一架后,就很少露面了。。。
0 请登录后投票
   发表时间:2014-05-27  
white_crucifix 写道
友情提示,复制附件图片的url,在正文中使用[ img]........[/img](故意加了个空格)包起来就能让图片显示在正文中


好的,谢谢,长知识了~哈哈~~~~
0 请登录后投票
   发表时间:2014-05-27  
houyujiangjun 写道
请放弃这个千疮百孔的struts2........
我的服务器不知道被struts2的漏洞攻击了多少次......果断抛弃


我是最近想学习SSI,先一个一个学~~请问一般什么框架比较常用?~
0 请登录后投票
   发表时间:2014-05-27  
memoryisking 写道
这个内容在strutshome网站上也可以看到的。


哈~~我就是自己看这本书的时候做的笔记而已,应该是比较基础的东西~~
0 请登录后投票
   发表时间:2014-05-28  
V小孩子V 写道
houyujiangjun 写道
请放弃这个千疮百孔的struts2........
我的服务器不知道被struts2的漏洞攻击了多少次......果断抛弃


我是最近想学习SSI,先一个一个学~~请问一般什么框架比较常用?~

新版的servlet其实挺好的, 另外spring真的是不错,如果你非要搞点框架,建议你用springMVC.
0 请登录后投票
   发表时间:2014-05-28  
houyujiangjun 写道
V小孩子V 写道
houyujiangjun 写道
请放弃这个千疮百孔的struts2........
我的服务器不知道被struts2的漏洞攻击了多少次......果断抛弃


我是最近想学习SSI,先一个一个学~~请问一般什么框架比较常用?~

新版的servlet其实挺好的, 另外spring真的是不错,如果你非要搞点框架,建议你用springMVC.


好的,我现在也开始在学Spring了,先了解一下,谢谢了~~~以后麻烦多多指教~~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics