您好,登錄后才能下訂單哦!
這篇文章給大家介紹使用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ò),可以把它分享出去讓更多的人看到。
免責(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)容。