struts2执行流程图

admin 4 0

### Struts2执行流程图详解

在Web开发领域,Struts2作为一款广泛使用的MVC(Model-View-Controller)框架,以其强大的功能和灵活的配置方式赢得了众多开发者的青睐,了解Struts2的执行流程对于深入理解其工作原理、优化应用性能以及解决开发过程中遇到的问题至关重要,本文将详细解析Struts2的执行流程图,并深入探讨其背后的工作原理。

#### 一、Struts2执行流程概述

Struts2的执行流程可以概括为从客户端请求到服务器响应的一系列处理过程,在这个过程中,Struts2框架通过其内置的组件和配置信息,将请求映射到相应的Action,执行Action中的业务逻辑,并根据执行结果返回相应的视图,以下是Struts2执行流程的主要步骤:

1. **客户端发起请求**:

用户通过浏览器或其他客户端工具向服务器发送一个HTTP请求,这个请求通常是一个URL,指向服务器上部署的Web应用。

2. **请求经过过滤器链**:

在Struts2中,请求首先会经过一系列配置的过滤器(Filter),这些过滤器可以对请求进行预处理,如设置请求上下文、日志记录、权限校验等,Struts2的核心过滤器是`StrutsPrepareAndExecuteFilter`(在Struts 2.1.3及以后版本中取代了早期的`FilterDispatcher`),它负责控制整个请求的处理流程。

3. **询问ActionMapper**:

`StrutsPrepareAndExecuteFilter`会询问`ActionMapper`是否需要调用某个Action来处理这个请求,`ActionMapper`根据请求的URL和配置信息来判断是否需要调用Action,以及需要调用哪个Action。

4. **创建ActionProxy**:

如果`ActionMapper`决定需要调用某个Action,`StrutsPrepareAndExecuteFilter`会创建一个`ActionProxy`实例,`ActionProxy`是Action的代理,它负责封装Action的调用过程,并提供与Action交互的接口。

5. **加载Action配置**:

`ActionProxy`通过`ConfigurationManager`(通常是通过读取`struts.xml`配置文件)来加载需要调用的Action类的配置信息,这些配置信息包括Action的类名、方法名、结果类型以及结果映射等。

6. **创建ActionInvocation**:

`ActionProxy`会创建一个`ActionInvocation`实例来执行Action,`ActionInvocation`是Struts2中用于封装Action执行过程的另一个关键组件,它负责调用Action,并在调用前后执行配置的拦截器(Interceptor)。

7. **执行拦截器链**:

在调用Action之前,`ActionInvocation`会根据配置的顺序执行所有配置的拦截器,拦截器是Struts2中非常强大的功能,它们可以在Action执行前后插入自定义的逻辑,如日志记录、权限校验、数据转换等。

8. **调用Action**:

当拦截器链执行完毕后,`ActionInvocation`会调用Action的指定方法(通常是`execute`方法)来执行业务逻辑,Action执行完毕后,会返回一个结果字符串(如"success"、"error"等),这个结果字符串用于指示后续的处理流程。

9. **查找并执行结果**:

`ActionInvocation`根据Action返回的结果字符串,在`struts.xml`配置文件中查找对应的Result配置,并执行该Result,Result通常是一个JSP页面、一个重定向URL或是一个流(如文件下载)。

10. **反向执行拦截器链**:

在Result执行完毕后,`ActionInvocation`会反向执行之前调用的拦截器链(顺序与调用前相反),这允许拦截器在Action执行完毕后执行清理工作或其他后续处理。

11. **生成响应并返回给客户端**:

Struts2框架会根据Result的执行结果生成相应的HTTP响应,并通过`StrutsPrepareAndExecuteFilter`返回给客户端。

#### 二、Struts2执行流程图的详细解析

为了更直观地理解Struts2的执行流程,我们可以将其绘制成流程图,以下是一个简化的Struts2执行流程图:

[客户端] --> [发送HTTP请求] --> [过滤器链]
[过滤器链] --> [StrutsPrepareAndExecuteFilter]
[StrutsPrepareAndExecuteFilter] --> [询问ActionMapper]
[询问ActionMapper] -->|是| [创建ActionProxy]
[创建ActionProxy] --> [加载Action配置]
[加载Action配置] --> [创建ActionInvocation]
[创建ActionInvocation] --> [执行拦截器链]
[执行拦截器链] --> [调用Action]
[调用Action] --> [返回结果字符串]
[返回结果字符串] --> [查找并执行结果]
[查找并执行结果] --> [反向执行拦截器链]
[反向执行拦截器链] --> [生成响应]
[生成响应] --> [返回给客户端]

在这个流程图中,