学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍
1、Struts2的系统架构:
2、架构中不同Key的作用介绍:
- servlet Filters:过滤器链,client的全部请求都要经过Filter链的处理。
- Struts Core:Struts2的核心部分,Struts2中已经做好的功能,在实际开发中不需要动它们
- Interceptors:Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;当然,也可以自定义拦截器,用来实现具体业务需要的功能。
- User Created:由开发人员创建的,包括struts.xml、Action、Template,是每个使用Struts2来进行开发的人员都必须会的。
3、各个模块功能的介绍:
- FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否要Struts2做出处理,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。同时还负责创建ActionProxy对象实例。(注意:如论什么Struts2应用都要有这个配置,并且要放在过滤链的最后边。)
- ActionMapper简单点说,ActionMapper负责识别当前请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会通知FilterDispatcher告诉它处理这个请求,ActionMapper还会返回一个对象来描述请求对应的ActionInvocation的信息。
- ActionProxy是一个特别的中间层,位于Action和xwork之间,便于将来有机会引入更多的实现方式,比如通过WebService来实现等。
- ConfigurationManager是xwork配置的管理中心,在server服务器启动的时候,ConfigurationManager便会把struts.xml文件中的全部信息读取到内存中,当ActionProxy带着URL向他询问要执行的是哪个Action的时候,能够直接匹配查找并做出回答。
- struts.xml是Stuts2的应用配置文件,负责诸如URL与Action之间映射的配置、以及执行后页面跳转的Result配置、自定义的拦截器设置等。
- ActionInvocation:真正负责调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result。
- Interceptor X(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。
- Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
- Result:Result就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如Jsp,FreeMarker等。
- Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
- Tag Subsystem:Struts2的标签库,它抽象了三种不同的视图技术JSP、velocity、freemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签。
4、程序运行流程:
- 用户发出一个请求。
- Tomcat接收到请求并自动选择处理这个请求的应用程序是哪一个。
- web容器读取该应用的web.xml文件,在web.xml文件中通过匹配发现要由Struts2的过滤器处理,依据struts2的过滤器的设置找到FilterDispatcher(struts2的调度中心)
- 获得FilterDispatcher实例,然后回调doFiler()方法进行真正的处理
- 这时候FilterDispatcher会将请求转发给ActionMapper(ActionMapper主要负责判断当前请求是否要Struts2做出处理)。
- 若需要Struts2作出处理,ActionMapper会通知FilterDispatcher告诉它去处理这个请求,FilterDispatcher会停止过滤器链后边的部分,并且还会建立一个ActionProxy的实例。
- ActionProxy对象被创建之初并不知道自己将要处理哪个Action,自己只有从FilterDispatcher处拿到的请求的URL,真正知道要处理那个请求的是ConfigurationManager对象,只有它读取了struts.xml文件。
- ActionProxy对象知道了自己要执行那个Action、以及哪些相关的拦截器和可能使用到的全部的result信息之后,会创建一个ActionInvocation对象,这个对象真正负责调用并执行Action。
- 在执行Action之前,拦截器会自动的拦截Action,其实拦截器的执行被分成两部分,一部分就是在Action执行之前,还有就是在result之后也会自动执行拦截器。所以ActionInvocation对象运行的时候要通过非常复杂的过程,依次执行指定的拦截器。
- 默认的情况下是执行execute()方法(也能特别指定某一个方法)。
- 依照execute()方法返回的结果(result)去struts.xml中匹配选择下一个页面。
- 依据result找到页面之后,在页面上能够通过struts2自带的标签库来访问需要的数据并生成一个页面(这里仅仅是生成一个页面,并没有返回给client)。
- ActionInvocation对象倒序执行拦截器。
- 运行完ActionInvocation对象,就会得到相应对象最后按照与过滤器配置顺序相反的顺序依次经过过滤器向client展示结果。