
3.1 Struts 2简介
Struts 2是基于MVC模式的Web框架,主要包括控制器组件(包括核心控制器StrutsPrepareAndExecuteFilter、业务控制器Action)、模型组件(包括业务逻辑组件和数据库访问组件)和视图组件。它们之间的关系如图3-1所示。

图3-1 Struts 2框架的组成结构图
● 模型组件:是实现业务逻辑的模块,由JavaBean或EJB构成。
● 视图组件:主要有HTML、JSP和Struts 2标签等视图技术。
● 控制器组件:控制器组件主要由核心控制器和业务控制器Action组成。
核心控制器:过滤器类StrutsPrepareAndExecuteFilter称为Struts 2的核心控制器。
业务控制器:业务控制器称为Action,负责处理业务特定请求的类。
1.Struts 2架构的结构
Struts 2框架是由多个不同功能的组件构成的,其架构结构及内部各模块功能、它们之间的关系,以及它们的运行流程如图3-2所示。

图3-2 Struts 2框架结构与工作流程图
1)StrutsPrepareAndExecuteFilter是整个Struts 2的核心控制器,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts 2处理,就执行Action处理,并停止过滤器链上还没有执行的过滤器。
2)ActionMapper提供了HTTP请求与Action执行之间的映射,即ActionMapper判断请求是否应该被Struts 2处理。若需要Struts 2处理,ActionMapper返回一个对象来描述请求对应的ActionInvocation的信息。
3)ActionProxy是一个特别的中间层,位于Action和xwork之间,可以根据需求引入更多的实现方式,比如通过WebService来实现等。
4)ConfigurationManager是xwork配置的管理中心,可以理解为struts.xml配置文件在内存中的对应。
5)struts.xml是Stuts 2的应用配置文件,负责URL与Action之间映射的配置,以及执行后页面跳转的Result配置等。
6)ActionInvocation:调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation执行拦截器链、Action及相应的Result。
7)Interceptor(拦截器):自动拦截Action,提供了在Action运行之前或Result运行之后可能需要执行的某些功能代码。类似于javax.servlet.Filter(过滤器)。
8)Action:是Struts 2中的动作执行单元(执行类),用来处理用户请求,并封装业务所需要的数据。
9)Result:是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts 2中支持多种视图类型,比如JSP、FreeMarker等。
10)Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
11)TagSubsystem:Struts 2的标签库,它抽象了3种不同的视图技术:JSP、velocity和freemarker,可以在不同的视图技术中直接使用这些标签。
2.Struts 2的工作流程
Struts 2框架的核心控制器负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。当请求转入Struts 2框架处理时会先经过一系列的拦截器,然后再到Action。Struts 2对用户的每一次请求都会创建一个Action并运行,根据其运行返回的值,按Result配置信息,跳转到新的服务(进入视图或Action)。根据图3-2所给出的各组件之间的关系,其工作流程如下。
1)客户发送请求给StrutsPrepareAndExecuteFilter。
2)StrutsPrepareAndExecuteFilter询问ActionMapper,该请求是否是一个Struts 2请求(即是否返回一个非空的ActionMapping对象)。
3)若ActionMapper认为该请求是一个Struts 2请求,则StrutsPrepareAndExecuteFilter把请求交给ActionProxy处理。
4)ActionProxy通过Configuration Manager询问框架的配置文件,确定需要调用的Action类及Action方法。
5)ActionProxy创建一个ActionInvocation的实例,并进行初始化。
6)ActionInvocation实例在调用Action的过程前后,涉及相关拦截器(Interceptor)的调用。
7)Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。调用结果的execute方法(或配置指定的方法),渲染结果。
8)执行各个拦截器invocation.invoke()之后的代码。
9)把结果发送到客户端。
通过对Struts 2框架及其工作流程的分析,基于Struts 2框架开发Web应用程序,开发者主要的任务就是设计Action、在配置文件内配置Action信息,以及编写视图等工作。