跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Struts 1 与 Struts 2 的核心区别对比

综述由AI生成Struts 1 与 Struts 2 在架构设计上存在显著差异。Struts 1 要求 Action 继承抽象基类且为单例模式,依赖 Servlet API,测试需借助 Mock 对象;Struts 2 Action 支持接口实现及 POJO,每请求实例化,线程安全,不强制依赖 Servlet。参数封装方面,Struts 1 使用 ActionForm,Struts 2 直接使用属性或 ModelDriven。表达式语言上,Struts 2 采用功能更强的 OGNL。拦截器机制允许 Struts 2 为不同 Action 配置独立生命周期,而 Struts 1 模块共享生命周期。整体而言,Struts 2 提供了更高的灵活性与可测性。

锁机制发布于 2012/5/24更新于 2026/6/1128 浏览
Struts 1 与 Struts 2 的核心区别对比

Struts 1 与 Struts 2 核心区别

1. Action 实现类

Struts 1 要求 Action 类继承一个抽象基类,使用抽象类编程。Struts 2 Action 类可以实现一个 Action 接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2 提供 ActionSupport 基类去实现常用的接口。即使 Action 接口不是必须实现的,只有一个包含 execute 方法的 POJO 类都可以用作 Struts 2 的 Action。

2. 线程模式

Struts 1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求。单例策略限制了 Struts 1 Action 能做的事,并且要在开发时特别小心。Action 资源必须是线程安全的或同步的。Struts 2 Action 对象为每一个请求产生一个实例,因此没有线程安全问题。

3. Servlet 依赖

Struts 1 Action 依赖于 Servlet API,因为 Struts 1 Action 的 execute 方法中有 HttpServletRequest 和 HttpServletResponse 参数。Struts 2 Action 不再依赖于 Servlet API,从而允许 Action 脱离 Web 容器运行,降低了测试 Action 的难度。当然,如果 Action 需要直接访问 HttpServletRequest 和 HttpServletResponse 参数,Struts 2 Action 仍然可以访问它们。但是,大部分时候,Action 都无需直接访问 HttpServletRequest 和 HttpServletResponse,从而给开发者更多灵活的选择。

4. 可测性

测试 Struts 1 Action 的一个主要问题是 execute 方法依赖于 Servlet API,这使得 Action 的测试要依赖于 Web 容器。为了脱离 Web 容器测试 Struts 1 的 Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的 Mock 对象(模拟了 HttpServletRequest 和 HttpServletResponse 对象),从而可以脱离 Web 容器测试 Struts 1 的 Action 类。Struts 2 Action 可以通过初始化、设置属性、调用方法来测试。

5. 封装请求参数

Struts 1 使用 ActionForm 对象封装用户的请求参数,所有的 ActionForm 必须继承一个基类:ActionForm。普通的 JavaBean 不能用作 ActionForm,因此,开发者必须创建大量的 ActionForm 类封装用户请求参数。虽然 Struts 1 提供了动态 ActionForm 来简化 ActionForm 的开发,但依然需要在配置文件中定义 ActionForm。Struts 2 直接使用 Action 属性来封装用户请求属性,避免了开发者需要大量开发 ActionForm 类的烦琐,实际上,这些属性还可以是包含子属性的 Rich 对象类型。如果开发者依然怀念 Struts 1 ActionForm 的模式,Struts 2 提供了 ModelDriven 模式,可以让开发者使用单独的 Model 对象来封装用户请求参数,但该 Model 对象无需继承任何 Struts 2 基类,是一个 POJO,从而降低了代码污染。

6. 表达式语言

Struts 1 整合了 JSTL,因此可以使用 JSTL 表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强。Struts 2 可以使用 JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2 下的表达式语言功能更加强大。

7. 绑定值到视图

Struts 1 使用标准 JSP 机制把对象绑定到视图页面。Struts 2 使用 ValueStack 技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。

8. 类型转换

Struts 1 ActionForm 属性通常都是 String 类型。Struts 1 使用 Commons-Beanutils 进行类型转换,每个类一个转换器,转换器是不可配置的。Struts 2 使用 OGNL 进行类型转换,支持基本数据类型和常用对象之间的转换。

9. 数据校验

Struts 1 支持在 ActionForm 重写 validate 方法中手动校验,或者通过整合 Commons Validator 框架来完成数据校验。Struts 2 支持通过重写 validate 方法进行校验,也支持整合 XWork 校验框架进行校验。

10. Action 执行控制

Struts 1 支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有 Action 必须共享相同的生命周期。Struts 2 支持通过拦截器堆栈(Interceptor Stacks)为每一个 Action 创建不同的生命周期。开发者可以根据需要创建相应堆栈,从而和不同的 Action 一起使用。

11. 捕获输入

Struts 1 使用 ActionForm 对象捕获输入。所有的 ActionForm 必须继承一个基类。因为其他 JavaBean 不能用作 ActionForm,开发者经常创建多余的类捕获输入。动态 Bean(DynaBeans)可以作为创建传统 ActionForm 的选择,但是,开发者可能是在重新描述 (创建) 已经存在的 JavaBean(仍然会导致有冗余的 javabean)。Struts 2 直接使用 Action 属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己 (子) 属性的 Rich 对象类型。Action 属性能够通过 web 页面上的 taglibs 访问。Struts 2 也支持 ActionForm 模式。Rich 对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了 taglib 对 POJO 输入对象的引用。

目录

  1. Struts 1 与 Struts 2 核心区别
  2. 1. Action 实现类
  3. 2. 线程模式
  4. 3. Servlet 依赖
  5. 4. 可测性
  6. 5. 封装请求参数
  7. 6. 表达式语言
  8. 7. 绑定值到视图
  9. 8. 类型转换
  10. 9. 数据校验
  11. 10. Action 执行控制
  12. 11. 捕获输入
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 飞书机器人实现日程自动同步的技术方案
  • GitHub Copilot Pro 学生认证与配置指南
  • 微软 Copilot Chat 与 Microsoft 365 Copilot 核心差异解析
  • ToDesk ToClaw 评测:基于 OpenClaw 的零门槛 AI 自动化助手
  • AI Ping 实战:统一接口与大模型成本优化
  • FastAPI:Python 高性能 Web 框架深度解析
  • C++ 微服务 UserServer 设计与实战落地
  • GitHub 趋势日报:2025 年 06 月 26 日开源项目盘点
  • LLaMA-Factory 全流程模型训练与推理
  • 网络安全工程师职业发展与核心技能学习指南
  • OpenClaw 厂商全对比:主流 AI 智能体平台深度横评
  • Qwen3.5 Plus 与 OpenClaw 框架协同构建商用 AI Agent 实战
  • C++ 手撕 Sqrt 开根号算法详解与源码实现
  • 灵感画廊:基于 Stable Diffusion XL 的极简 AI 绘画工具
  • 基于 GLM-4.6V-Flash-WEB 的电力设施周边活动监测方案
  • RTX 4090 本地部署国产 AIGC 视频模型:腾讯混元与通义万相实战
  • ComfyUI-Manager 低配置设备优化指南:10 个技巧提升 AI 绘画效率
  • Python 保留小数的 6 种常用方法与注意事项
  • 企业 AI Agent 落地难点与 OpenClaw 实践路径分析
  • SDXL Prompt Styler 提示词增强工具使用指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online