Servlet中獲取類路徑下資源
類路徑對一個javaweb應用而言,就是WEB-INF/classes下和WEB-INF/lib目錄下的所有jar文件。
將一個javaweb項目發佈到Tomcat服務器中,src目錄不再存在,src下的資源都會出現在WEB-INF目錄下的classes目錄中。現在我們要獲取這個目錄下的資源,有兩種方式:
(1) 使用ClassLoader對象獲取;
(2) 使用Class對象獲取;
這兩個類中都有獲取類路徑的方法,下面我們來分別講解這兩種方法,具體如下:
(1)使用ClassLoader對象獲取類路徑下資源
首先,要獲取類路徑下的資源,要先獲取ClassLoader對象。ClassLoader對象可以通過Class對象來獲取。
1) 在應用的src目錄下,新建一個test.txt文件;
2) 新建一個Servlet類,來獲取test.txt文件
public class ClassPathServlet extendsHttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
//1.獲的ClassLoader對象
ClassLoaderclassLoader=this.getClass().getClassLoader();
//2.調用ClassLoader對象的getResourcAsStream()方法
InputStream input=classLoader.getResourceAsStream("test.txt");
//讀取輸入流內容,轉換成字符串返回
String value=IOUtils.toString(input);
System.out.println(value);
}
}
通過ClassLoader的getResourceAsStream(Stringpath)方法,獲得了指定路徑的對應輸入流,現在想要在控制檯將該流打印成字符串,需要使用工具包:commons-io-1.4.jar(該jar包源代碼中已存在)。然後使用該jar包中的幫助類IOUtils,將輸入流轉換成字符串並返回。
注意:在上面的講解中,我們獲取test.txt文件的輸入流使用的是該文件的相對路徑,即classLoader.getResourceAsStream(“test.txt”);它相對的是classes的根路徑。
(2)使用Class對象獲取類路徑下資源
Class類中也有一個方法是可以獲取類路徑下資源。示例如下:
1) 在應用的src目錄下,新建一個test.txt文件;
2)新建一個Servlet類,來獲取test.txt文件
public class ClassServlet extends HttpServlet{
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
Class clazz=this.getClass();
InputStreaminput=clazz.getResourceAsStream("/test.txt");
String value=IOUtils.toString(input);
System.out.println(value);
}
}
注意:(1)Class對象的getResourceAsStream(String path)方法中,如果path參數不是以”/”開頭,即表示採用的是相對路徑,相對當前類所在的類路徑,這裏相對的是ClassServlet所在的類路徑。
(2)如果path參數是以“/”開頭,則表示是在classes根路徑下查找text.txt文件。
(3)如果test.txt文件處於src目錄下的cn.itcast.web.servlet包下,那麼在ClassServlet類中使用Class類來獲取test.txt文件的輸入流,可以採用如下方式:
InputStream input=clazz.getResourceAsStream(“/cn/itcast/web/servlet/test.txt”);
或:InputStreaminput=clazz.getResourceAsStream(“test.txt”);
因爲test.txt與ClassServlet在同包下,所以可以採用相對路徑。