Servlet中獲取類路徑下資源

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在同包下,所以可以採用相對路徑。

發佈了119 篇原創文章 · 獲贊 57 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章