Struts 框架
Apache Struts 是一个开源的 Web 应用框架,主要用于创建基于 Java 的 Web 应用程序。Struts 基于 MVC(Model-View-Controller)设计模式,旨在帮助开发者更容易地创建和管理大型的 Web 应用程序。以下是对 Struts 框架的详细介绍:
历史定位:Struts 2 已停止新功能开发(Apache 2024 年宣布 S2-066 等系列漏洞后基本退役),新项目一律使用 Spring MVC / Spring Boot。本文仅作技术演进的历史参考。
1. 历史背景
- 最初版本:Struts 1.x 由 Craig McClanahan 创建,并于 2000 年首次发布。最初它是一个 Jakarta 项目,后来成为 Apache 软件基金会的顶级项目。
- Struts 2:Struts 2.x 是 Struts 的下一代版本,结合了 OpenSymphony WebWork 框架的功能。Struts 2 提供了更简洁的代码和更强大的功能。
2. 核心概念和组件
Model-View-Controller (MVC)
- Model(模型):负责应用程序的数据和业务逻辑。
- View(视图):负责展示数据和用户界面。
- Controller(控制器):处理用户请求并协调模型和视图之间的交互。
Struts 2 的主要组件
- Actions:动作类,是 Struts 2 的核心部分,负责处理用户请求。每个动作类对应一个特定的用户操作。
- Interceptors(拦截器):用于在处理请求的不同阶段执行逻辑,如验证、文件上传、数据处理等。拦截器是可插拔的,允许开发者添加、删除或修改拦截逻辑。
- Results(结果):定义了动作执行后的输出视图,可以是 JSP、FreeMarker 模板、Velocity 模板等。
- ValueStack(值栈)和 OGNL(Object-Graph Navigation Language):值栈是 Struts 2 的核心数据结构,OGNL 是用于访问和操作值栈中数据的表达式语言。
- Configuration Files(配置文件):通常为
struts.xml,用于定义动作、结果、拦截器等配置。
3. Struts 2 的工作流程
- 用户请求:用户在浏览器中发出一个 HTTP 请求。
- 过滤器调度:请求首先通过一系列的过滤器(如
FilterDispatcher)。 - Action 查找:根据请求的 URL 查找相应的 Action 映射。
- 拦截器处理:拦截器链按顺序处理请求,可以进行验证、文件上传等操作。
- 执行 Action:执行相应的 Action 类的逻辑。
- 结果处理:根据 Action 的返回值,确定并展示相应的视图(JSP、模板等)。
4. 主要特性
- 基于 POJO:Action 类是简单的 POJO(Plain Old Java Objects),无需继承框架特定的类。
- 拦截器机制:允许开发者在请求处理的不同阶段插入逻辑,提供了极大的灵活性和可扩展性。
- 支持多种视图技术:可以使用 JSP、FreeMarker、Velocity 等多种视图技术。
- 国际化和本地化:提供了对国际化和本地化的良好支持。
- 强大的表单处理和验证:提供了一整套机制来处理表单输入和数据验证。
5. 优势和劣势
优势
- 清晰的架构:基于 MVC 模式,代码结构清晰,易于维护。
- 高度可扩展:通过拦截器和插件机制,可以方便地扩展框架功能。
- 社区支持:作为一个老牌框架,拥有广泛的社区支持和丰富的文档资源。
劣势
- 学习曲线:对于初学者来说,学习曲线较陡。
- 配置复杂:需要编写大量的 XML 配置文件(虽然 Struts 2 提供了注解配置,但 XML 依然广泛使用)。
- 性能问题:在处理大量并发请求时,性能可能不如一些现代的轻量级框架。
6. 总结
Struts 框架在 Java Web 开发中有着重要的地位,尤其是在企业级应用开发中。虽然随着技术的发展,出现了许多新的框架(如 Spring MVC),但 Struts 仍然被广泛使用。了解和掌握 Struts 的使用,对于 Java Web 开发者来说,是非常有价值的技能。
版本差异(Struts 2 → 当前技术栈)
| 特性 | Struts 2(2.5.x 末版) | 当前主流(Spring Boot 3.5.x) |
|---|---|---|
| 维护状态 | 停止新功能开发,仅安全修复 | Spring 6.2.x 活跃维护 |
| 控制器 | Action + struts.xml | @RestController / @Controller |
| 视图 | JSP/FreeMarker/Velocity | 前后端分离 + Thymeleaf(可选) |
| 安全漏洞 | S2 系列 RCE 漏洞频发 | Spring Security 内置防护 |
| 依赖注入 | 弱(需插件) | Spring IOC 原生支持 |
Struts 的拦截器思想被 Spring MVC 的 HandlerInterceptor/AOP 继承,理解其 MVC 流程对学习现代框架仍有帮助,但生产项目不应再选型 Struts。