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所在的目錄)
相關文章
- 在 IDEA 中配置 Struts2Idea
- @Component和@Configuration作為配置類的差別
- 05. struts2中為Action屬性注入值
- 007--在Struts2的Action中訪問Servlet API三種形式ServletAPI
- java web中jsp和action之間通訊小結JavaWebJS
- 在web.xml檔案中配置Servlet時,主要配置哪些資訊?WebXMLServlet
- Struts2 action前的資料預處理
- Struts2中Action動態呼叫DMI出現的一個問題
- (三)struts2進階之實現Action
- JAVAEE框架學習——Struts2——Action API 使用Java框架API
- firefox和IE在一個逗號上的差別Firefox
- Struts2教程之二Action建立方式
- Struts2教程之三Action訪問方式
- Struts2配置-1
- 別人眼中的程式猿和現實中的程式猿差別在哪?
- Dynamics 365 Online和On-premises在開發方式上的差別REM
- 徹底弄懂C#中delegate、event、EventHandler、Action、Func的使用和區別C#
- Eclipse中html/jsp格式化配置EclipseHTMLJS
- 在Struts2中寫介面,返回json格式JSON
- 【PROFILE】PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX引數在Oracle不同版本中的差別Oracle
- Struts2配置後ClassNotFoundExceptionException
- web專案中web.xml的servlet和servletmapping的解讀WebXMLServletAPP
- Jsp和Servlet有什麼區別?JSServlet
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- springMVC---配置檔案解析(web.xml)SpringMVCWebXML
- Asp.Net中的Action和Func委託ASP.NET
- python中分辨int和float的差別Python
- 在xpath中text()和string(.)的區別
- jsp頁面number型別自動轉為String型別JS型別
- 在Linux中,如何配置和使用Xen?Linux
- 小程式和APP的差別是什麼?APP
- Spring - 配置檔案中的classpath: 和 classpath*: 的區別Spring
- 介面和列舉在方法中的區別
- keycloak~在認證的action中自定義重定向地址
- Spring Boot 支援 JSP配置Spring BootJS
- 智慧閘道器和交換機在智慧路燈杆上的用途差別
- ERP採購收貨在標準成本和移動平均價下的差別
- Oracle中exists和in的效能差異Oracle