Java EE框架开发技术与案例教程
上QQ阅读APP看书,第一时间看更新

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信息,以及编写视图等工作。