有時候,我們希望讀取web應用中的一些資源文件,比如配置文件、圖片等等。為此,在ServletContext接口中提供了一些讀取web資源的方法,這些方法是依靠Servlet容器來實現(xiàn)的。Servlet容器根據(jù)資源文件相對于web應用的路徑,返回關聯(lián)資源文件的IO流、資源文件在文件系統(tǒng)的絕對路徑等。下面我們來一一了解這些方法,具體如下:
1.獲取真實路徑
假如現(xiàn)在web應用下有一個test.txt文件,想要在Servlet中獲取這個資源文件,就可以使用ServletContext的相關方法來獲取。下面我們通過一個案例來了解這個方法該如何使用,詳情請參考
ServletContext獲取資源方法案例詳解,點擊此處
下載源代碼,如下所示:
(1)創(chuàng)建web應用,Example15,該應用下新建一個Servlet類,PathServlet,主要代碼如例1-1所示:
例1-1 PathServlet.java
public class PathServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//”/”表示web應用的根路徑
System.out.println("ServletContext get real path:");
ServletContext servletContext=this.getServletContext();
String path=servletContext.getRealPath("/");
System.out.println(path);
String indexPath=servletContext.getRealPath("/index.jsp");
System.out.println(indexPath);
}
}
(2)PathServlet在web.xml文件中配置的訪問路徑是:“/PathServlet”。
(3)將web應用Example15發(fā)布到Tomcat服務器,然后啟動Tomcat服務器,在瀏覽器地址欄上輸入:http://localhost:8080/Example15/PathServlet,控制臺打印結(jié)果,如圖1-1所示:
圖1-1 控制臺打印結(jié)果
由圖1-1可知,ServletContext接口的getRealPath(String path)方法返回的是資源文件在服務器文件系統(tǒng)上的真實路徑。參數(shù)path代表資源文件的虛擬路徑,它應該以正斜線(/)開始,“/“表示當前web應用的根目錄,也可以不以“/“開始,但是建議大家一斜線開始,這樣比較規(guī)范一些。
2.獲取資源流
ServletContext不僅可以獲取資源的真實路徑,還可以獲取資源流,即將資源以輸入流的方式獲取,下面通過一個案例來詳細了解該方法的使用,具體如下:
(1)修改PathServlet,在該類的doGet()方法中添加如下代碼,如例1-3所示:
例1-3 StreamServlet.java
//使用ServletContext獲取資源流
System.out.println("ServletContext get inputstream:");
InputStream input=servletContext.getResourceAsStream("/index.jsp");
System.out.println(input);
(2)重新啟動Tomcat服務器,在瀏覽器地址欄上輸入:http://localhost:8080/Example15/StreamServlet,控制臺顯示結(jié)果如圖1-2所示:
圖1-2 控制臺打印結(jié)果
由圖1-2可知,ServletContext接口的getResouceAsStream(String path)方法可以獲取path指定資源的流,path路徑可以不以“/”開頭,類似于getRealPath(String path)方法。其實這個方法也可以理解為,先獲得資源的真實路徑,再使用InputStream input=new FileInputStream(new File(servletContext.getRealPath(path)))創(chuàng)建一個輸入流。
3.獲取指定目錄下的所有資源路徑
使用ServletContext可以獲取指定目錄下的所有資源路徑,例如獲取WEB-INF目錄下的所有資源路徑:
(1)修改PathServlet,在該類的doGet()方法中添加如下代碼,如例1-4所示:
例1-5 getResourcePaths()方法使用
//使用ServletContext獲取指定目錄下所有資源路徑
System.out.println("ServletContext get all path:");
Set<String> paths=servletContext.getResourcePaths("WEB-INF");
System.out.println(paths);
(2)重新啟動Tomcat服務器,在瀏覽器地址欄再次訪問http://localhost:8080/Example15/PathServlet,控制臺打印結(jié)果如圖1-3所示:
圖1-3 控制臺打印結(jié)果
由圖1-3可知,通過ServletContext接口的getResourcePaths(String path)方法,將WEB-INF目錄下的所有資源路徑都獲取到了,該方法的返回值是一個Set集合,需要注意的是WEB-INF目錄下的lib和classes都是目錄,但是通過getResourcePaths()方法不會進一步會獲得lib和classes目錄下的資源路徑。而且,該方法的參數(shù)一定要以”/”開頭,否則會報錯。
本文版權(quán)歸傳智播客Java培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://metathetuscanyresort.com/javaee