DWR與Strut2的Action衝突問題

DWR與Strut2整合後,當運行http://localhost:8080/工程名稱/dwr測試暴露的方法時,就會出現以下錯誤:web

「There is no Action mapped for namespace / and action name dwr.」

要解決這個問題,首先要了解一下:正則表達式

一、Struts2在web.xml中配置爲「/*」和「*.action,*.jsp」的差異
        Struts2在web.xml中配置過濾器的方法有2種方式:app

 一種爲: jsp

<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請求; url

這裏咱們主要關注的是第二點:spa

         對於第二點中的「支持無後綴名的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,(注意後面有個逗號) code

《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/

相關文章
相關標籤/搜索