Struts1 和 Struts2 的区别和对比:
Action 类:
• Struts1 要求 Action 类继承一个抽象基类。Struts1 的一个普遍问题是使用抽象类编程而不
是接口。
• Struts 2 Action 类可以实现一个 Action 接口,也可实现其他接口,使可选和定制的服务成
为可能。Struts2 提供一个 ActionSupport 基类去 实现 常用的接口。Action 接口不是必须的,
任何有 execute 标识的 POJO 对象都可以用作 Struts2 的 Action 对象。
线程模式:
• Struts1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所
有的请求。单例策略限制了 Struts1 Action 能作的事,并且要在开发时特别小心。Action 资
源必须是线程安全的或同步的。
• Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上 ,
servlet 容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
Servlet 依赖:
• Struts1 Action 依 赖 于 Servlet API , 因 为 当 一 个 Action 被 调 用 时 HttpServletRequest 和
HttpServletResponse 被传递给 execute 方法。
• Struts 2 Action 不依赖于容器,允许 Action 脱离容器单独被测试。如果需要, Struts2
Action 仍然可以访问初始的 request 和 response。但是,其他的元素减少或者消除了直接访
问 HttpServetRequest 和 HttpServletResponse 的必要性。
可测性:
• 测试 Struts1 Action 的一个主要问题是 execute 方法暴露了 servlet API(这使得测试要依赖
于容器)。一个第三方扩展--Struts TestCase--提供了一套 Struts1 的模拟对象(来进行
测试)。
• Struts 2 Action 可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更
容易。
捕获输入:
• Struts1 使用 ActionForm 对象捕获输入。所有的 ActionForm 必须继承一个基类。因为其他
JavaBean 不 能 用 作 ActionForm , 开 发 者 经 常 创 建 多 余 的 类 捕 获 输 入 。 动 态
Bean(DynaBeans)可以作为创建传统 ActionForm 的选择,但是,开发者可能是在重新描
述(创建)已经存 在的 JavaBean(仍然会导致有冗余的 javabean)。
• Struts 2 直接使用 Action 属性作为输入属性,消除了对第二个输入对象的需求。输入属性
可能是有自己(子)属性的 rich 对象类型。Action 属性能够通过 web 页面上的 taglibs 访问。
Struts2 也支持 ActionForm 模式。rich 对象类型,包括业务对象,能够用作输入/输出对象。
这种 ModelDriven 特性简化了 taglib 对 POJO 输入对象的引用。
表达式语言:
• Struts1 整合了 JSTL,因此使用 JSTL EL。这种 EL 有基本对象图遍历,但是对集合和索引
属性的支持很弱。
• Struts2 可以使用 JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph