servlet讀取web應用下的資源文件相關問題記錄
在java web中通過servletContext接口中定義的一系列方法可以獲取到web應用下的資源文件。這些方法需要依靠servlet容器提供功能:
getResourcePaths方法
該方法
Set getResourcePaths(String path)
該方法返回一個Set集合,集合中包含資源目錄中子目錄和文件的路徑名稱。參數path必須以正斜線(/)開始,指定匹配資源的部分路徑。
在測試中遇到以下幾點問題:
該方法實際會以/WEB-INF/爲根目錄進行遍歷,所以當path參數爲/時,其返回的爲/WEB-INF/下的所有文件及目錄的集合
。
測試1:
Set<String> resources = getResourcePaths("/"); ---> 輸出: [/WEB-INF/]
從結果中可以看出,該方法以/WEB-INF/
爲根目錄進行向下搜索的。
測試2:
在web-inf目錄下加入資源目錄及文件:
/WEB-INF/images/...
Set<String> resources = getResourcePaths("/"); ---> 輸出: [/WEB-INF/]
總結: 該方法只會返回/WEB-INF/。(此處有疑問)
該方法如果傳入的是在classes
下的資源時並不會返回資源目錄下的資源集合,只會返回null
,所以該方法並不能在classes
目錄中中生效(此處也有疑問
)
getRealPath
該方法API即:
String getRealPath(String path);
該方法以正斜線(/
)開始,/
表示當前web應用的根目錄,如果serlvet無法將虛擬路徑轉換爲文件系統的真實路徑,則返回null
,這個方法返回一個文件在服務器上的真實路徑(文件的絕對路徑
)。
String realPath = getRealPath("/image/image.jpg") ----> C:\Users\Linux\Desktop\idea\heiketu\src\main\webapp\images\image.jpg
- 這個方法會返回一個文件所在的絕對路徑(
文件絕對路徑,即在服務器上的絕對位置
)。
getResource
此方法API爲:
URL getResource(String path);
此方法返回映射到某個資源文件的URL對象,參數path與getResourPaths相同,必須要以/
開始,/
表示當前Web應用的根目錄。
測試結果:
URL resource = context.getResource("/");
System.out.println("[返回的資源URL] ---: " + resource); ----> [返回的資源URL] ----: [返回的資源URL] ---: jndi:/localhost/main/
這個方法範圍的是文件的URL地址,如果傳入的是具體文件,則會返回null
(這個有存疑)
getResourceAsStream
方法的API爲
InputStream getResourceAsStream(String path);
該方法會從項目的根路徑進行查找,返回資源文件的輸入流對象。
這個api接收參數與getResource方法的接收參數相同,必須以/
開始,從項目根路徑進行查找。如果傳入的是絕對路徑則會拋出NullException
異常。