Struts2 是 Struts 社区和 WebWork 社区的共同成果,可以视为 WebWork 的升级版。它采用 WebWork 的核心机制,运行稳定、性能优异且设计成熟。
我们以 Struts 2.3.15.1 版本为例进行源码分析。解压源码后,核心逻辑主要集中在 struts-2.3.15.1\src\core\src\main\java\org\apache\struts2 目录下。虽然目录繁多,但理解其包结构有助于快速定位功能。
核心包说明
| 包名 | 说明 |
|---|---|
| org.apache.struts2.components | 封装视图组件,支持主题(theme)自定义,如 updownselect、datetimepicker 等 |
| org.apache.struts2.config | 定义配置相关的接口和类,XML/Properties 解析主要由 WebWork 完成 |
| org.apache.struts2.dispatcher | 核心包,包含最重要的类,负责请求分发 |
| org.apache.struts2.impl | 定义了 StrutsActionProxy 等对 xwork 扩展的类 |
| org.apache.struts2.interceptor | 定义内置拦截器 |
| org.apache.struts2.servlet | 实现 principalproxy 接口 |
| org.apache.struts2.util | 实用工具包 |
| org.apache.struts2.views | 提供 Freemarker、JSP、Velocity 等页面呈现支持 |
根目录下还有几个关键类:
- StrutsStatics:存放框架常数。
- RequestUtils:请求处理程序,用于检索 Servlet 路径。
- ServletActionContext:获取网站特定的上下文信息。
- StrutsConstants:存储和检索配置设置的中心位置。
- StrutsException:通用运行时异常类。
请求处理架构
一个典型的 Struts2 请求处理流程大致如下:
- 客户端向 Servlet 容器(如 Tomcat)发起请求。
- 请求经过一系列过滤器(Filter),其中
ActionContextCleanUp是可选的,有助于与其他框架集成。 StrutsPrepareAndExecuteFilter被调用,询问ActionMapper判断是否需要调用 Action。- 若需要,请求交由
ActionProxy处理。 ActionProxy通过Configuration Manager查找配置文件中的 Action 类。- 创建
ActionInvocation实例。 - 在调用 Action 前后,执行相关拦截器链。
- Action 执行完毕后,根据
struts.xml配置找到返回结果(如 JSP 或 FreeMarker 模板)并渲染。


