Struts2与DWR共存配置解决冲突方法
"这篇文章主要探讨了如何在项目中同时使用Struts2和DWR框架,以解决两者之间的兼容性问题。Struts2是一款强大的MVC框架,而DWR(Direct Web Remoting)允许在JavaScript和Java之间进行实时的、异步的通信。两者结合可以提供更丰富的Web应用功能。然而,它们的默认配置可能存在冲突,导致应用无法正常运行。本文提供了具体的解决方案,旨在帮助开发者解决这些问题。" 在项目开发中,有时会遇到需要同时使用Struts2和DWR的情况。Struts2是基于Java的Web应用框架,主要用于处理HTTP请求并管理应用程序的业务逻辑,而DWR则是一个用于实现AJAX功能的库,使得前端JavaScript可以直接调用后端Java方法。然而,这两个框架的过滤器配置可能会产生冲突,因为它们都试图处理所有的HTTP请求。 Struts2使用`StrutsPrepareAndExecuteFilter`作为其核心过滤器,负责准备和执行请求。在默认配置下,这个过滤器会匹配所有URL模式,即`<url-pattern>/*</url-pattern>`,这意味着所有请求都会通过Struts2的生命周期。这将对DWR的请求造成影响,因为DWR也有自己的过滤器来处理特定的URL(通常以`/dwr/*`开头)。 为了解决这个问题,我们需要调整Struts2的配置,确保DWR的请求能够正确地被DWR过滤器处理,而不是被Struts2拦截。一种可能的解决方案是为Struts2的过滤器定义一个更具体的URL模式,避免覆盖DWR的URL。例如,我们可以将`<url-pattern>`设置为应用程序中Struts2控制的特定路径,而不是`/*`,这样只有匹配这个模式的请求才会通过Struts2的过滤器。 同时,为了确保DWR能够正常工作,我们需要确保其过滤器在Struts2过滤器之前或之后执行,具体取决于DWR的配置需求。如果DWR需要在Struts2之前处理请求,那么DWR的过滤器应该在`web.xml`中排在前面;反之,如果DWR需要在Struts2之后处理,则DWR的过滤器应排在后面。 此外,开发者还需要注意排除DWR的URL,使其不会被Struts2的`prepare.isUrlExcluded`方法拦截。这可以通过自定义排除模式或者扩展`prepare.setEncodingAndLocale`、`prepare.createActionContext`等方法来实现,确保DWR相关的请求不会进入Struts2的生命周期。 要在项目中成功共存Struts2和DWR,关键在于正确配置过滤器,明确各自的职责范围,并确保请求能够按照预期的顺序被处理。通过适当的配置调整,开发者可以充分利用这两个框架的优势,创建功能强大且交互性强的Web应用。
1.struts2和dwr为什么会冲突?
最近很多同学都在问同样一个问题,struts2和dwr该如何共存?我们先分析一下为什么会出现冲突.
struts2通过StrutsPrepareAndExecuteFilter过滤器来处理请求,常见的配置如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
问题就在这里,<url-pattern>/*</url-pattern>配置过滤了所有的请求,当用户提交的请求是 /dwr/*时,也同样被StrutsPrepareAndExecuteFilter处理了,根本达不到DWR框架,这就是为什么二者不能共存的原因.
2.通过struts2源码发现问题
网上我没找到问题的解决方案,所以,只能通过阅读源代码来查找问题的根源了.在StrutsPrepareAndExecuteFilter类中,重写了doFilter方法:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
prepare.setEncodingAndLocale(request, response);
下载后可阅读完整内容,剩余3页未读,立即下载
- 粉丝: 0
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展