Apache Struts 如何帮助维护 Java 应用程序的结构,以及为什么现在写它还为时过早
许多 Java 开发者一听到 Struts 这个词,就会不由自主地联想到老旧的遗留项目,或者是多年前那些关于安全漏洞的耸人听闻的标题。但如果你抛开偏见,看看这个代码仓库,你会发现一个依然充满活力的框架,它至今仍支撑着企业领域的很大一部分应用。在微服务和响应式编程的时代,Struts 看起来像是来自过去的访客,但它仍然提供了一种清晰且可预测的方式来构建 Web 应用程序。
谁需要它,以及为什么是现在
Struts 是一个经典的 MVC 框架。它的主要目标是将业务逻辑、展示层和导航控制分离。在 2000 年代初,这是一项革命性的理念:在那之前,开发者经常将 SQL 查询、Java 代码和 HTML 标签直接混合在 JSP 页面中。结果就是一团无法维护的混乱代码。
如今,该项目隶属于 Apache 软件基金会的旗下。如果你从事企业级领域的工作,很可能会不得不与它打交道。而且这不仅仅是维护旧代码的问题。Struts 2(由 WebWork 2 发展而来)对于那些偏好 Request/Response 模型、不想把 Web 协议细节隐藏在 JSF 或 Tapestry 等组件框架的复杂抽象层后面的人来说,是一个完全现代化的工具。
盒子里有什么
Struts 架构建立在三大支柱之上。首先是请求处理器(Actions)。你编写一个执行有用工作的类,然后将它映射到一个特定的 URL。其次是控制流机制。逻辑执行后,框架决定向用户返回哪个资源(例如,一个页面或 JSON)。第三是标签库,用于简化交互式表单的创建。
有趣的是,Struts 并不试图强制你使用特定的前端技术栈或数据访问层。它同样可以很好地与 Hibernate、JDBC 或 Apache Cayenne 配合使用。在客户端方面,你可以使用传统的 JSP,也可以将一切交给 Angular 或 React,把 Struts 变成 REST 服务的后端。
以下是 Struts 2 中一个简单 action 的样子:
public class HelloAction extends ActionSupport {
private String message;
public String execute() {
message = "Привет из Struts!";
return SUCCESS;
}
public String getMessage() {
return message;
}
}
配置(传统上使用 XML,但也可以使用注解)将这段代码与浏览器路径绑定。它透明且易于调试。
坦诚的自由与安全
Apache Struts 开发者强调许可证的"清洁"和独立性。该项目完全由志愿者驱动。这意味着明天不会有任何公司改变使用条款或关闭对源代码的访问。
至于安全性:在几次备受关注的安全事件之后,社区变得对检查非常敏感。该项目目前在 OpenSSF Scorecard 上获得了高评分。代码仓库中有一份详细的安全指南,当前 Struts 2 分支的关键补丁也会及时发布。
顺便说一下版本的问题。一个重要的提醒:Struts 1 正式终止了生命周期。开发者强烈建议不要在新项目中使用它,并尽可能推荐迁移到 Struts 2。第一个分支不再接收安全更新,因此在生产环境中使用它是一种有意识的风险。
没有魔法的灵活性
与许多现代的"魔法"框架不同,Struts 并不隐瞒 Web 本质上是无状态的事实。你可以清楚地看到请求-响应周期。
如果你需要集成特定的技术,Struts 提供了扩展机制。想使用 SOAP?没问题。需要 AJAX?有现成的解决方案。想用 Freemarker 或 Velocity 模板引擎代替 JSP?那用标准工具就可以实现。
同时,开发者坦诚地说:如果你的目标是使用现成的服务器组件构建 UI,Struts 不适合你。对于这类任务,最好看看 Wicket。选择 Struts 的人是那些想要在底层控制 HTML 和 JavaScript 的人。
值得一试吗,谁适合用它
Struts 是保守主义者的最佳选择。它适合那些重视经过时间验证的架构模式和 Apache 稳定性的团队。
谁应该关注这个代码仓库:
- 维护大型企业系统的 Java 开发者。
- 寻找可预测的 MVC 框架、不需要不必要的复杂性和隐藏魔法的人。
- 对许可证清洁度和无供应商锁定的开源软件很重要的架构师。
最好从官方文档和项目网站上的 Struts 2 教程开始入门。GitHub 仓库是了解 Java 开发历史上最著名的框架之一内部结构的好地方。有时候,了解行业的"隐形支撑"(struts)是由什么构成的是有益的。
相关项目