一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - struts2靜態(tài)資源映射代碼示例

struts2靜態(tài)資源映射代碼示例

2021-01-13 15:01OkidoGreen Java教程

這篇文章主要介紹了struts2靜態(tài)資源映射的相關(guān)內(nèi)容,涉及了具體代碼示例,具有一定參考價值,需要的朋友可以了解下。

struts2框架中有一些它所需要的公共的靜態(tài)內(nèi)容,比如說js文件和一些css文件。當(dāng)框架需要這些靜態(tài)內(nèi)容的時候,F(xiàn)ilterDidpatcher會自動提供給我們。那么FilterDidpatcher是如何知道我們在請求靜態(tài)內(nèi)容的呢?任何請求只要以“/struts/”開頭,那么FilterDidpatcher就會認(rèn)為它是在請求靜態(tài)內(nèi)容。在識別出請求是請求靜態(tài)資源后FilterDidpatcher如何去匹配尋找靜態(tài)資源呢?這里有兩個關(guān)鍵點(diǎn):

1.確定所要請求的資源路徑。FilterDidpatcher會截取/struts/后面的內(nèi)容作為所要請求的資源。比如說現(xiàn)在請求是/struts/xhtml/styles.css,那么FilterDidpatcher就會把xhtml/styles.css作為我們所要請求的資源的路徑:xhtml目錄下面的styles.css文件。

2.到哪兒去尋找所請求的靜態(tài)內(nèi)容。默認(rèn)情況下FilterDidpatcher會隨意的org.apache.struts2.static和template這兩個包中去尋找。如果我們還想在別的其它包中尋找靜態(tài)內(nèi)容的話,那就需要在web.xml配置中FilterDidpatcher時,給它添加一個參數(shù)”packages”,然后把它的值設(shè)置為一系列以逗號或者空格分隔的包名,如下面所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
<filter>
    <filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
  <param-name>packages</param-name>
  <param-value>com.mangocity.static,hust.cm</param-value>
</init-param>
  </filter>
  <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 描述:web應(yīng)用下有一個目錄“static”,現(xiàn)在要訪問其中的“top.html”文件,即訪問“localhost:8080/static/top.html”,服務(wù)器總是抱404錯誤。 

    原因:在struts2的FilterDispatcher類的doFilter方法中,如果請求的是靜態(tài)資源,struts2會判斷該請求是否可以處理,這里的代碼如下:

Java代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
String resourcePath = RequestUtils.getServletPath(request);
if ("".equals(resourcePath) && null != request.getPathInfo()) {
  resourcePath = request.getPathInfo();
}
if (staticResourceLoader.canHandle(resourcePath)) {
  staticResourceLoader.findStaticResource(resourcePath, request, response);
} else {
   // this is a normal request, let it pass through
   chain.doFilter(request, response);
}
// The framework did its job here
return;

 其中,在DefaultStaticContentLoader類的canHandle方法中會對請求路徑進(jìn)行判斷:

Java代碼

?
1
2
3
4
public boolean canHandle(String resourcePath) {
  return serveStatic && 
   (resourcePath.startsWith("/struts") || resourcePath.startsWith("/static"));
}

這里,serveStatic的值為true,再加上要訪問的資源以“/static”開頭,所以這里返回true。 

    然后,會進(jìn)入DefaultStaticContentLoader類的findStaticResource方法,該方法的第一行語句是:   

Java代碼

?
1
String name = cleanupPath(path);

這里,cleanupPath方法的定義如下:

Java代碼

?
1
2
3
4
5
6
7
8
/**
 * @param path requested path
 * @return path without leading "/struts" or "/static"
 */
protected String cleanupPath(String path) {
  //path will start with "/struts" or "/static", remove them
  return path.substring(7);
}

 struts2把“/static”截掉了,這樣,后面再進(jìn)行解析的時候,就變成了解析對“/top.html”的請求,所以會報(bào)404錯誤。 

總結(jié)

悲劇的錯誤,還以為是自己程序的bug,改了半天。需要加強(qiáng)對開源程序中具體實(shí)現(xiàn)的了解。 希望本文所述對大家有所幫助,感謝朋友們對服務(wù)器之家網(wǎng)站的支持。

原文鏈接:http://blog.csdn.net/z69183787/article/details/48026019

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲 小说 欧美 激情 另类 | 亚洲国产三级在线观看 | 手机在线免费观看视频 | 美女脱一净二净不带胸罩 | 精品久久久噜噜噜久久7 | 俄罗斯一级毛片免费播放 | 国产精品久久久久久久久99热 | 美女张开下身让男人桶 | 亚洲天堂视频在线观看免费 | fquer老师 | 精品午夜久久福利大片免费 | 亚洲国产欧美久久香综合 | 亚洲va欧美va国产综合久久 | wc凹凸撒尿间谍女厕hd | 久久91精品国产91 | 亚洲精品丝袜在线一区波多野结衣 | 欧式午夜理伦三级在线观看 | 国内外精品免费视频 | 免费一区在线观看 | 久久视频这只精品99re6 | 亚洲福利 影院 | 99精品国产高清一区二区三区香蕉 | 青青青手机在线视频 | 国产自精品 | 亚洲欧美日韩国产综合专区 | 国产日本免费 | 西西人体大胆77777视频 | 久草热在线 | 波多野结衣52部合集在线观看 | 青草视频免费观看在线观看 | 亚洲精选在线观看 | 五月天在线视频观看 | 日处女b | 91porn在线观看国产 | 亚洲国产精品久久久久 | 美女无遮挡 | 色婷婷综合久久久 | 狠狠色婷婷丁香六月 | 日本片免费观看一区二区 | 白丝萝莉h | 国产日韩欧美在线一二三四 |