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
第2種是在struts.xml中設置:
<constant name="struts.action.excludePattern" value="/dwr.*,/dwr/test.*" />
(注意,這兒是正則表達式,不是URL匹配模式,因此要寫/dwr.*而不是/dwr/*)
最後運行程序:
文章參考:http://heavengate.blog.163.com/blog/static/20238105320126199927335/