struts2 dwr There is no Action mapped for action ... 原因及解决方案
struts2配置时,在web.xml中的配置如下:
1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>struts2</filter-name> 7 <url-pattern>/*</url-pattern> 8 </filter-mapping>
dwr 在 web.xml 中的配置如下:
1 <servlet> 2 <servlet-name>dwr-invoker</servlet-name> 3 <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 4 <init-param> 5 <param-name>debug</param-name> 6 <param-value>true</param-value> 7 </init-param> 8 </servlet> 9 <servlet-mapping> 10 <servlet-name>dwr-invoker</servlet-name> 11 <url-pattern>/dwr/*</url-pattern> 12 </servlet-mapping>
struts2 使用 /* 作为 url-pattern,而且在struts机制中,只要请求路径中无后缀名或者后缀名为 .action ,它就当 action 来处理。所以当配置了dwr之后,在测试页中,本来点击类之后应该显示当前系统中对外暴露的JS方法的列表,却显示了There is no Action mapped for action... 类似的信息,就是因为点击了类名链接后,路径中没有了后缀名。解决方法有两个:
(1)在Struts.properties中定义:
struts.action.extension = action
因为Struts2缺省配置是:
struts.action.extension = action,(注意后面有个逗号)
(2)在Struts.properties中设置:
struts.action.excludePattern = /dwr.*,/webEditor.*(注意,这儿是正则表达式,不是URL匹配模式,所以要写/dwr.*而不是/dwr/*)
这种写法应配置StrutsPrepareAndExecuteFilter,配置FilterDispatcher是无效的。