溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用struts2怎么對(duì)靜態(tài)資源進(jìn)行映射

發(fā)布時(shí)間:2020-12-08 15:56:03 來源:億速云 閱讀:285 作者:Leah 欄目:編程語言

這篇文章給大家介紹使用struts2怎么對(duì)靜態(tài)資源進(jìn)行映射,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

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

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

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

<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)用下有一個(gè)目錄“static”,現(xiàn)在要訪問其中的“top.html”文件,即訪問“l(fā)ocalhost:8080/static/top.html”,服務(wù)器總是抱404錯(cuò)誤。 

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

Java代碼

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方法中會(huì)對(duì)請(qǐng)求路徑進(jìn)行判斷:

Java代碼

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

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

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

Java代碼

String name = cleanupPath(path); 

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

Java代碼

/** 
 * @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)行解析的時(shí)候,就變成了解析對(duì)“/top.html”的請(qǐng)求,所以會(huì)報(bào)404錯(cuò)誤。 

關(guān)于使用struts2怎么對(duì)靜態(tài)資源進(jìn)行映射就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI