之前看书,笔记都是记录在云笔记上(因为实在太水,不好意思写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,这里书上没有说具体做了什么,希望大家能帮忙解释一下,谢谢了!