Struts1和Struts2是Java Web开发中两种流行的MVC框架,它们在设计和功能上有许多不同之处。以下是对这两个框架异同点的详细解释: 1. **Action类**: - **Struts1**:要求Action类继承一个抽象基类,如`Action`或`ActionSupport`。这种做法限制了Action的灵活性,因为开发人员必须遵守框架的基类结构。 - **Struts2**:Action类可以实现`Action`接口,也可以实现其他接口以获得定制服务。它提供了`ActionSupport`基类,但Action接口并非强制要求。任何具有`execute`方法的POJO(Plain Old Java Object)都可作为Action对象。 2. **线程模式**: - **Struts1**:Action类采用单例模式,意味着一个Action实例处理所有请求,这要求Action及其成员变量必须是线程安全的,增加了开发的复杂性。 - **Struts2**:Action对象为每个请求创建一个新实例,消除了线程安全问题,更符合面向对象的设计原则。 3. **Servlet依赖**: - **Struts1**:Action直接依赖于Servlet API,`HttpServletRequest`和`HttpServletResponse`作为参数传递给`execute`方法,测试时需要依赖容器。 - **Struts2**:Action不依赖于容器,允许独立测试。虽然仍可以访问请求和响应,但其他元素减少了直接依赖Servlet API的必要性。 4. **可测性**: - **Struts1**:由于Action类与Servlet API紧密耦合,测试通常需要使用Struts TestCase这样的工具,增加了测试的复杂性。 - **Struts2**:Action类更易于测试,支持依赖注入,可以独立于容器进行测试。 5. **捕获输入**: - **Struts1**:使用ActionForm对象来捕获用户输入,ActionForm需要继承基类,可能导致重复类的创建。DynaBeans提供了更多灵活性,但仍需额外工作。 - **Struts2**:Action的属性可以直接作为输入属性,不需要额外的ActionForm对象。支持rich对象类型作为输入/输出,简化了与POJO的交互。 6. **表达式语言**: - **Struts1**:整合了JSTL EL,对集合和索引属性支持有限。 - **Struts2**:支持JSTL,但更倾向于使用强大的OGNL,提供了更丰富的对象图遍历和操作。 7. **绑定值到页面(view)**: - **Struts1**:使用标准JSP机制将对象绑定到视图层。 - **Struts2**:引入ValueStack技术,允许taglib访问值栈中的值,无需在视图中直接绑定对象,提高了复用性和灵活性。 8. **类型转换**: - **Struts1**:使用Commons-Beanutils进行类型转换,转换器不可配置,每个属性都是String类型。 - **Struts2**:通过OGNL进行类型转换,提供基础类型和常见对象的转换器,且转换器可配置。 9. **校验**: - **Struts1**:支持在ActionForm的`validate`方法中进行手动校验,或使用Commons Validator扩展。但对子对象的校验支持有限。 - **Struts2**:提供了更灵活的验证机制,可以在Action级别或模型级别的校验,支持注解驱动的校验,更易于维护和扩展。 10. **国际化与错误处理**: - **Struts1**:使用Resource Bundle进行国际化,错误处理相对繁琐。 - **Struts2**:支持更简洁的国际化实现,错误和异常处理更加直观,通过拦截器链处理。 总结来说,Struts2在很多方面都比Struts1更加灵活、易测试和可扩展。它的设计决策使得开发过程更加简洁,降低了与容器的耦合度,提升了代码的可读性和可维护性。然而,Struts1在某些场景下仍然适用,特别是对于已经稳定运行且维护需求较低的项目。
剩余10页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助