很多程序员在开发web项目中都会遇到一个问题,就是Struts2无法与ajax框架DWR共存于项目中,其实,这是自然而然的事。
原因
首先,为何会冲突?其实原因很明显,就是Struts2的过滤器和DWR的过滤器产生冲突,web server无法准确判断准确的地址,
打开web.xml会发现,我们配置了如下的信息
首先是Struts2的过滤器
<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中,我们将web项目下的所有路径都交给了struts2来处理,
然而,我们又配置了DWR的过滤器
<servlet> <servlet-name>dwr-invoker</servlet-name> <display-name>DWR Servlet</display-name> <description>Direct Web Remoter Servlet</description> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
虽然,这里我们配置了url-pattern /dwr/*下的所有路径归DWR,
但是,在前方已经配置了将web项目下的所有路径交给Struts2,
因此,这就是产生冲突的根本原因。
《《解决方案》》
那么,如何来解决这个冲突呢?Struts2和DWR谁也无法替代谁,在项目中必不可少,
我们能想到的最直接的方案就是:在Struts2所处理的路径中,分出一部分让DWR处理,这样就两全其美了。
要分出Struts2不处理的路径,其实很简单。
在Struts2中有个属性叫excludePattern,也就是用来配置Struts2不处理的路径
?
看到这里,我们突然恍然大悟,心情异常激动,
于是我们只需要在Struts.xml中添加配置
<constant name="struts.action.excludePattern" value="/dwr/*" />
让/dwr/*下的全部路径归DWR。