Struts2在web.xml中配置為“/*”和“*.action,*.jsp”的差別
問題:
1、Struts2在web.xml中配置為“/*”和“*.action,*.jsp”的差別。
2、There is no Action mapped for namespace / and action name ...的問題。
分析(環境是Struts2.1.8.1):
Struts2過濾器的配置有2種方式:
那麼這兩種方式的配置,究竟有什麼差別呢?
首先,假如配置方式是*.action的話,一般應當同時配置*.jsp,因為如果不通過action而直接訪問jsp頁面的話,Struts2標籤在解析的時候會獲取當前執行緒ThreadLocal中的Dispatcher。而Dispatcher是在Struts過濾器中預設的。程式碼如下:
除了為當前執行緒預設Dispatcher以外,Struts2對“/*”的請求,在完成普通的“*.action”過濾的基礎上,另外提供2點功能:
第1點用於訪問classpath中特定的靜態資源;
第2點支援無字尾名的Action請求;
Struts2的標籤有時候需要某些CSS、JS檔案的支援,比如<s:head/>標籤,可能就轉換成:
中通過packages引數指定的包、以及 "org.apache.struts2.static template org.apache.struts2.interceptor.debugging static"這4個包。
由於packages可配置,從而,如果有自己的classpath上的資源需要訪問,或者需要更改Struts本身的靜態資源時,只要把Classpath下相應的package設定在過濾器的初始引數中即可(這一條看上去好像沒什麼用處)。
上面是使用/*時對靜態資源的訪問,那麼使用*.action時如果需要的話,如何訪問靜態資源呢?
很簡單,只要把需要用到的靜態資源解壓縮到WebContent/struts目錄下即可。
第2點“支援無字尾名的Action請求”經常帶來一些混亂,最典型的就是“/*”錯誤地攔截了其他的對映為無字尾名的Servlet請求。比如DWR、FCKEditor等都存在這種問題。
比如,當訪問“/demo/dwr”時,正常情況應該顯示當前系統中對外暴露的JS方法的列表,但在Struts2的預設配置下,卻得到“There is no Action mapped for namespace / and action name dwr.”
又比如在預設配置下,訪問http://localhost:8080/demo/hello.action
和訪問http://localhost:8080/demo/hello這兩者是等同的。
當然,也只有無字尾名的URL請求才會被Struts2當做是Action,這也是為什麼/dwr無法訪問,然而/dwr/interface.js可以訪問的原因。
具體的,看一下下面的程式碼就明白了:
//Struts2預設將“*.action”或者無字尾的URL當做Action
protected List<String> extensions = new ArrayList<String>() {{ add("action"); add("");}};
protected String dropExtension(String name, ActionMapping mapping) {
if (extensions == null) {
return name;
}
for (String ext : extensions) {
if ("".equals(ext)) {
// This should also handle cases such as /foo/bar-1.0/description. It is tricky to distinquish /foo/bar-1.0 but perhaps adding a numeric check in the future could work
// request uri如果不包含副檔名的話,則匹配此情況
int index = name.lastIndexOf('.');
if (index == -1 || name.indexOf('/', index) >= 0) {
return name;
}
} else {
String extension = "." + ext;
if (name.endsWith(extension)) {
name = name.substring(0, name.length() - extension.length());
mapping.setExtension(ext);
return name;
}
}
}
return null;
}
那麼,怎麼解決此問題呢?
有2種辦法。
第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是無效的。
struts.i18n.encoding=utf-8
struts.action.extension=,
struts.action.excludePattern = /js.*,/static.*(js和static資料夾是專案中js和css所在的目錄)
相關文章
- Struts2 中jsp直接跳轉到actionJS
- 05. struts2中為Action屬性注入值
- struts2的action與jsp之間傳遞引數JS
- 使用struts2框架,web.xml怎麼配置框架WebXML
- 關於struts2 action中map型別屬性的對映型別
- Struts2 web.xml(七)WebXML
- 007--在Struts2的Action中訪問Servlet API三種形式ServletAPI
- websphere中web.xml配置WebXML
- jsp include directive, jsp:include action, jsp:plugin action compareJSPlugin
- web.xml中的shiroFilter配置WebXMLFilter
- struts2 action中result引數詳解
- Struts2中 Result型別配置詳解型別
- struts/Servlet,action轉到jsp後,路徑問題(struts2,jsp路徑,action路徑,action跳轉,相對路徑,絕對路徑)...ServletJS
- struts2中struts.xml和web.xml檔案解析及工作原理XMLWeb
- Struts2教程6:在Action類中獲得HttpServletResponse物件的四種方法HTTPServlet物件
- struts2的異常There is no Action mapped for namespace / and action nameAPPnamespace
- java web中jsp和action之間通訊小結JavaWebJS
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別SQL
- 在web.xml中配置過濾器WebXML過濾器
- Python中運算子"=="和"is"的差別分析Python
- web.xml配置引數context-param和init-param的區別WebXMLContext
- Action裡result型別Stream的引數配置型別
- 在 IDEA 中配置 Struts2Idea
- 在IT部門和研發部門的工作差別
- Struts2中Action動態呼叫DMI出現的一個問題
- 如何用程式碼修改struts中的web.xml配置WebXML
- Struts2 action前的資料預處理
- 在web.xml檔案中配置Servlet時,主要配置哪些資訊?WebXMLServlet
- jsp中include指令和include動作的區別JS
- springMVC和Struts2的區別SpringMVC
- struts2中的6大配置檔案
- firefox和IE在一個逗號上的差別Firefox
- web.xml中的contextConfigLocation在spring中的作用WebXMLContextSpring
- 簡單理解Struts2 action中動態方法及萬用字元字元
- 別人眼中的程式猿和現實中的程式猿差別在哪?
- JAVAEE框架學習——Struts2——Action API 使用Java框架API
- (三)struts2進階之實現Action
- Struts2筆記05 action操作域物件筆記物件