DWR与Strut2的Action冲突问题

DWR与Strut2整合后,当运行http://localhost:8080/工程名称/dwr测试暴露的方法时,就会出现如下错误:

“There is no Action mapped for namespace / and action name dwr.”

要解决这个问题,首先要了解一下:

1、Struts2在web.xml中配置为“/*”和“*.action,*.jsp”的差别
        Struts2在web.xml中配置过滤器的方法有2种方式:

 一种为: 

<filter-mapping>   
    <filter-name>struts2</filter-name>   
    <url-pattern>/*</url-pattern>   
</filter-mapping> 

另一种为:

<filter-mapping>   
    <filter-name>struts2</filter-name>   
    <url-pattern>*.action</url-pattern>   
</filter-mapping>   
<filter-mapping>   
    <filter-name>struts2</filter-name>   
    <url-pattern>*.jsp</url-pattern>   
</filter-mapping>  

解析:假如配置方式是*.action的话,一般应当同时配置*.jsp,因为如果不通过action而直接访问jsp页面的话,Struts2标签在解析的时候会获取当前线程ThreadLocal中的Dispatcher。而Dispatcher是在Struts过滤器中预设的。

除了为当前线程预设Dispatcher以外,Struts2对“/*”的请求,在完成普通的“*.action”过滤的基础上,另外提供两点功能: 
1)、用于访问classpath中特定的静态资源; 
2)、支持无后缀名的Action请求; 

这里我们主要关注的是第二点:

         对于第二点中的“支持无后缀名的Action请求”经常带来一些混乱,最典型的就是“/*”错误地拦截了其他的映射为无后缀名的Servlet请求。比如DWR、FCKEditor等都存在这种问题。 
例如,当访问“/工程名/dwr”时,正常情况应该显示当前系统中对外暴露的JS方法的列表,但在Struts2的默认配置下,却得到“There is no Action mapped for namespace / and action name dwr.” 
又比如在默认配置下,访问http://localhost:8080/工程名/helloWorld.action 和访问http://localhost:8080/工程名/helloWorld这两者是等同的。 当然,也只有无后缀名的URL请求才会被Struts2当做是Action,这也是为什么/dwr无法访问,然而/dwr/interface.js可以访问的原因。 

如何解决“There is no Action mapped for namespace / and action name dwr.”问题?
解决的方法主要有两种: 
第1种直接在Struts.properties中定义: 
struts.action.extension = action即可解决此问题。 
Struts2缺省配置对应于: 
struts.action.extension = action,(注意后面有个逗号) 

《DWR学习四》DWR测试与Strut2的Action冲突问题 - heavengate - Heavengate的博客

 
第2种是在struts.xml中设置: 

<constant name="struts.action.excludePattern" value="/dwr.*,/dwr/test.*" />

(注意,这儿是正则表达式,不是URL匹配模式,所以要写/dwr.*而不是/dwr/*) 

最后运行程序:

文章参考:http://heavengate.blog.163.com/blog/static/20238105320126199927335/

转载于:https://my.oschina.net/zion/blog/786064

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值