Struts2中的Wrapper技术:兼容Servlet的秘诀

需积分: 9 0 下载量 48 浏览量 更新于2024-08-18 收藏 369KB PPT 举报
"后台为servlet技术-wrapper在struts2中的应用" 在讨论“Wrapper在struts2中的应用”时,首先需要理解后台从Servlet技术转换到Struts2框架的背景。Servlet是Java Web开发中的基础组件,用于处理HTTP请求和响应,而Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它简化了Servlet的使用并提供了更高级的功能。 在升级系统框架时,原有的使用JSP和Servlet的前端代码通常包含大量的JSTL(JavaServer Pages Standard Tag Library)标签和OGNL(Object-Graph Navigation Language)表达式。Struts2框架支持OGNL,它是用于表达和操作对象图的强大的表达式语言,但在转换过程中,可能会遇到如何兼容旧有JSTL标签的问题。 Struts2通过使用包装模式(Wrapper Pattern)解决了这个问题。包装模式允许在不修改原有对象(这里是HttpServletRequest)的基础上,添加新的功能或改变其行为。在Struts2中,它创建了一个名为`StrutsRequestWrapper`的类,该类扩展自`HttpServletRequest`,并覆盖了一些关键方法,如`getAttribute`。 当Struts2接收到请求时,它会使用`Dispatcher`的`wrapRequest`方法将原始的HttpServletRequest包装成`StrutsRequestWrapper`。这样做有几个好处: 1. **增强功能**:`StrutsRequestWrapper`可以添加额外的属性或功能,比如提供对OGNL的支持。即使前端代码仍在使用JSTL表达式,Struts2也能解析并提供数据。 2. **解耦合**:通过包装,Struts2可以独立于底层的HTTP请求处理机制进行工作,使得框架更加灵活,易于维护和扩展。 3. **统一接口**:尽管内部实现了不同的逻辑,但对外仍然保持与HttpServletRequest相同的接口,这降低了对现有代码的改动。 在Struts2针对request的包装中,`StrutsRequestWrapper`对`getAttribute`方法进行了包装,意味着在查找属性时,它首先会尝试从原始的HttpServletRequest中获取,如果找不到,再考虑其他策略。例如,Struts2可能会从ValueStack中查找,这是它处理Action对象和视图数据的地方。如果ValueStack中有匹配的值,JSTL标签仍能正确地显示数据,无需修改前端代码。 此外,`Dispatcher`的`wrapRequest`方法还可能返回`MultiPartRequestWrapper`,这是一个专门处理多部分表单数据(如文件上传)的包装器,确保Struts2能够正确处理这些复杂请求。 Struts2通过包装模式成功地兼容了原有的Servlet应用,减少了升级过程中的工作量,并提供了更高级的特性和控制。这种设计使得开发者能够平滑地过渡到Struts2框架,同时保留了部分原有的JSP和Servlet代码,降低了迁移成本。