欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ServletContext讀取web資源_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年07月26日 10:21:24   作者:fjdingsd  
這篇文章主要介紹了ServletContext讀取web資源,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

ServletContext類中有這么四個(gè)方法:

  1. getRealPath(String path)
  2. getResource(String path)
  3. getResourceAsStream(String path)
  4. getResourcePaths(String path)

這四個(gè)方法都使用web工程下某個(gè)web資源路徑的字符串表現(xiàn)形式作為參數(shù),而每個(gè)方法返回不同的類型,我們通過(guò)這四個(gè)方法之一可以獲取某個(gè)資源,并對(duì)其進(jìn)行讀取和修改操作。

假設(shè)我們的【myservlet】web工程中有一個(gè)數(shù)據(jù)庫(kù)的配置文件:database.properties,在這個(gè)數(shù)據(jù)庫(kù)中已經(jīng)有了一些參數(shù),而我們?cè)趙eb工程中希望讀取這個(gè)配置文件中的有關(guān)信息:

先來(lái)看看ServletContext中的getResourceAsStream()方法,這個(gè)方法返回InputStream對(duì)象。由于我們的配置文件為properties文件,所以可以用Properties對(duì)象來(lái)裝載這個(gè)輸入流,代碼如下:

 public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
     ServletContext context = this.getServletContext();
     InputStream in = context.getResourceAsStream("/database.properties");
     
     Properties prop = new Properties();
     prop.load(in);
     
     String url = prop.getProperty("url");
     String username = prop.getProperty("username");
     String password = prop.getProperty("password");
     System.out.println(url);
     System.out.println(username);
     System.out.println(password);
   }

最后在瀏覽器中訪問(wèn)這個(gè)Servlet,那么在MyEclipse的控制臺(tái)上能看到的數(shù)據(jù)正好是database.properties中我們配置的信息:

接下來(lái)看看ServletContext中的getRealPath()方法,這個(gè)方法返回String對(duì)象。由于我們的配置文件為properties文件,所以可以用Properties對(duì)象來(lái)裝載這個(gè)輸入流,代碼如下:

   ServletContext context = this.getServletContext();
     String filePath = context.getRealPath("/database.properties");
     
     FileInputStream fis = new FileInputStream(filePath);
     Properties prop = new Properties();
     prop.load(fis);
     
     String url = prop.getProperty("url");
     String username = prop.getProperty("username");
     String password = prop.getProperty("password");
     System.out.println(url);
     System.out.println(username);
     System.out.println(password);

最后在瀏覽器中訪問(wèn)這個(gè)Servlet,那么在MyEclipse的控制臺(tái)上能看到的數(shù)據(jù)正好是database.properties中我們配置的信息:

使用getRealPath()方法的好處在于這個(gè)方法還可以獲取文件名,而getResourceAsStream()方法就只能獲取文件流了。例如獲取文件名:

    ServletContext context = this.getServletContext();
     String filePath = context.getRealPath("/WEB-INF/web.xml");
     System.out.println(filePath);
     
     if(filePath == null) {
       System.out.println("所找文件不存在!");
     }
     String fileName = filePath.substring(filePath.lastIndexOf("\\"));
     System.out.println("文件為:"+fileName);

接著來(lái)看看ServletContext中的getResource()方法,這個(gè)方法返回URL對(duì)象。而URL對(duì)象具有打開(kāi)到此 URL 的連接并返回一個(gè)用于從該連接讀入的 InputStream的openStream()方法。由于我們的配置文件為properties文件,所以可以用Properties對(duì)象來(lái)裝載這個(gè)輸入流,代碼如下:

    ServletContext context = this.getServletContext();
     URL fileUrl = context.getResource("/database.properties");
     InputStream in = fileUrl.openStream();
     
     Properties prop = new Properties();
     prop.load(in);
     
     String url = prop.getProperty("url");
     String username = prop.getProperty("username");
     String password = prop.getProperty("password");
     System.out.println(url);
     System.out.println(username);
     System.out.println(password);

最后在瀏覽器中訪問(wèn)這個(gè)Servlet,那么在MyEclipse的控制臺(tái)上能看到的數(shù)據(jù)正好是database.properties中我們配置的信息:

以上說(shuō)完了幾種通過(guò)ServletContext對(duì)象來(lái)讀取web應(yīng)用下的某個(gè)資源文件,只要通過(guò)讀取的方法,并將資源相對(duì)于web工程的路徑作為參數(shù)傳入其中便可。我們上述的例子都是直接在web工程中,或者web工程的某個(gè)目錄下,而如果我們把某個(gè)web資源放置在MyEclipse中的【src】目錄中,那么該如何讀取呢:

我們說(shuō)過(guò),這個(gè)web應(yīng)用在發(fā)布時(shí),會(huì)將【src】目錄下的.java文件編譯成為.class字節(jié)碼文件,由服務(wù)器自動(dòng)將這些字節(jié)碼文件放置在該web應(yīng)用中的【W(wǎng)EB-INF】下的【classes】目錄里,如果沒(méi)有【classes】目錄,服務(wù)器會(huì)自動(dòng)幫我們創(chuàng)建,因此,只要是放置在【src】目錄中的資源,最后也會(huì)被服務(wù)器自動(dòng)放置在【classes】目錄中,這樣我們可以繼續(xù)通過(guò)ServletContext對(duì)象來(lái)獲?。?/p>

    ServletContext context = this.getServletContext();
     InputStream in = context.getResourceAsStream("/WEB-INF/classes/database.properties");
     
     Properties prop = new Properties();
     prop.load(in);
     
     String url = prop.getProperty("url");
     String username = prop.getProperty("username");
     String password = prop.getProperty("password");
     System.out.println(url);
     System.out.println(username);
     System.out.println(password);

關(guān)于web工程下某個(gè)web資源在不同位置下的問(wèn)題:

問(wèn)題一:我們?yōu)槭裁床荒苡脗鹘y(tǒng)方式,如FileInputStream或者File對(duì)象來(lái)直接獲取web工程中的資源呢?其實(shí)也是可以的,但是有個(gè)路徑的問(wèn)題,Servlet中方法所需要的路徑都是相對(duì)于web應(yīng)用的路徑,而傳統(tǒng)的FileInputStream等等中方法所需的路徑參數(shù)都是相對(duì)于虛擬機(jī)的路徑。而又因?yàn)槲疫@個(gè)web應(yīng)用是從MyEclipse中的Tomcat里啟動(dòng)的,所以這時(shí)候的虛擬機(jī)目錄其實(shí)是Tomcat中的【bin】目錄。所以如果想用傳統(tǒng)方式讀取文件必須每次都將文件放置在Tomcat的【bin】目錄下, 這是多么麻煩的事,因此我們開(kāi)發(fā)web工程就應(yīng)該使用web工程中的方法來(lái)讀取文件!但是,這卻又引出了問(wèn)題二。。。

問(wèn)題二:當(dāng)我們web工程中有別的非Servlet的類時(shí),比如JavaBean,當(dāng)JavaBean需要連接數(shù)據(jù)庫(kù)時(shí),這就是非Servlet對(duì)象讀取web工程中的資源文件了,不能用ServletContext來(lái)讀取,問(wèn)題一種也說(shuō)過(guò)不能用傳統(tǒng)方式如FileInputStream來(lái)讀取,那么該如何讀取呢?

答案是:類加載器!由于在【src】目錄下的Java程序經(jīng)過(guò)編譯成字節(jié)碼class文件,如果要用到這些類,Java虛擬機(jī)需要先將這些字節(jié)碼文件加載到內(nèi)存中才可以使用,而這個(gè)過(guò)程就是由類加載器來(lái)完成。因此這就有一個(gè)知識(shí)點(diǎn),如果我們將某個(gè)web資源放置在【src】目錄下,因?yàn)檫@是個(gè)web工程,服務(wù)器會(huì)自動(dòng)將各個(gè)字節(jié)碼文件重新放置在【classes】目錄下, 而這個(gè)web資源也會(huì)重新被服務(wù)器放置在【classes】目錄下,那么類加載器能加載【classes】目錄下所有的字節(jié)碼文件,同時(shí),同處在這個(gè)目錄下的web資源也會(huì)被類加載器加載進(jìn)內(nèi)存,這時(shí)我們就可以使用類加載器讀取該web資源了。

例:在【myservlet】的dao包中創(chuàng)建一個(gè)Student的JavaBean對(duì)象,并在src【目錄下】創(chuàng)建一個(gè)student的配置文件student.properties,而這個(gè)配置文件內(nèi)容如下圖所示:

在Student類中,我們需要通過(guò)類加載器來(lái)獲取輸入流來(lái)讀取這個(gè)文件:

 public class Student {  
   public void getStudent() throws IOException {
     ClassLoader loader = Student.class.getClassLoader();
     InputStream in = loader.getResourceAsStream("student.properties");
     
     Properties prop = new Properties();
     prop.load(in);
     
     String studentName = prop.getProperty("name");
     String studentAge = prop.getProperty("age");
     System.out.println(studentName+":"+studentAge);
   }
 }

另外創(chuàng)建一個(gè)Servlet作為可以供瀏覽器訪問(wèn)的對(duì)象,在該Servlet中創(chuàng)建Student的示例來(lái)獲取配置文件中的內(nèi)容,這樣就達(dá)到了從非Servlet對(duì)象讀取web資源內(nèi)容并向Servlet對(duì)象傳遞數(shù)據(jù):

 public class ServletDemo extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
 
     Student student = new Student();
     student.getStudent();
   }
 }

從瀏覽器中訪問(wèn)該Servlet,可以看到通過(guò)類加載器讀取的配置文件中的內(nèi)容:

注意,這種方法只能是web資源放置在【src】目錄中才可以使用,如果要讀取的web資源是放置在web工程的目錄下,使用類加載器也還是無(wú)法讀取,因?yàn)轭惣虞d器只能讀取類目錄下的文件,這時(shí)候非Servlet類就無(wú)法讀取資源文件,只能使用ServletContext來(lái)讀取了。

方立勛老師說(shuō):“類加載器只能加載【classes】目錄下的所有文件一次,這樣在服務(wù)器運(yùn)行web工程的過(guò)程中,如果我們修改【classes】目錄下的student.properties配置文件,則由于類加載器不再加載,因此使用類加載器的方式不能讀取修改后的內(nèi)容”

但是我修改后,還是可以使用類加載器的方式讀取classes】目錄下修改后的student.properties配置文件,難道是因?yàn)镴DK7的原因嗎?

不過(guò)不管是什么原因,方立勛老師針對(duì)他的問(wèn)題所采取的解決方案還是值得學(xué)習(xí)的,他采用先用類加載器獲取該配置文件的路徑,然后再采用傳統(tǒng)方式獲取這個(gè)文件的輸入流。所以在Student中的getStudent()方法代碼改為:

 public class Student {  
   public void getStudent() throws IOException {
     ClassLoader loader = Student.class.getClassLoader();
     URL fileUrl = loader.getResource("student.properties");
     String filePath = fileUrl.getPath();
 
     FileInputStream fis = new FileInputStream(filePath);
     Properties prop = new Properties();
     prop.load(fis);
     
     String studentName = prop.getProperty("name");
     String studentAge = prop.getProperty("age");
     System.out.println(studentName+":"+studentAge);  
 }
 }

這種方式還有一種好處就是,如果要讀取的文件過(guò)大,而之前通過(guò)類加載器將大文件加載進(jìn)內(nèi)存就容易導(dǎo)致內(nèi)存溢出,所以還是采用這種方式比較好。

最后再說(shuō)明一點(diǎn),如果是在非Servlet類中采用類加載器獲取【classes】目錄中的資源,方法參數(shù)的路徑只需要是相對(duì)于【src】目錄即可。

補(bǔ)充:使用類加載器加載【classes】目錄中的資源,得到的路徑取決是哪個(gè)虛擬機(jī)(或服務(wù)器)調(diào)用,例如上面的代碼getStudent()方法,如果是在非Servlet的類的方法中被調(diào)用,那么就是使用JVM虛擬機(jī),那么得到的資源路徑并不是Tomcat的應(yīng)用【webapps】目錄的路徑。因此如果是要為Servlet中提供資源,那么非Servlet類中獲取資源的方法,請(qǐng)一定要使用Servlet來(lái)調(diào)用,這樣才能保證得到的資源路徑是在Tomcat服務(wù)器下的自己的web應(yīng)用所在目錄中的正確位置。

例如下面的例子,我的MyEclipse工作空間在【E】盤,而Tomcat服務(wù)器所在路徑為【F】盤:

 public class ResourceUtils {
   
   public static void main(String[] args) throws IOException {
     getResource();
   }
   
   @Test
   public static void getResource() throws IOException {
     
     ClassLoader loader = ResourceUtils.class.getClassLoader();
     URL url = loader.getResource("student.properties");
     String path = url.getPath();
     System.out.println(path);
   }
 }

而資源為student.properties配置文件,放置的位置為【src】目錄下:

這個(gè)是在我的一個(gè)web應(yīng)用中定義的一個(gè)非Servlet的普通Java類,這個(gè)類無(wú)論是用JUnit測(cè)試還是使用Main函數(shù),亦或是使用別的非Servlet類來(lái)調(diào)用getResource方法獲取在web應(yīng)用下【src】目錄中的student.properties資源,顯示的路徑為MyEclipse的工作空間,而不是Tomcat服務(wù)器:

而如果是使用Servlet來(lái)調(diào)用的話,才是真正顯示在Tomcat中web應(yīng)用所在的地方:

 public class ServletDemo extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
 
     ResourceUtils.getResource();
   }
 }

因此在使用web工程中,如果使用非Servlet類來(lái)獲取資源,請(qǐng)一定注意這個(gè)資源路徑問(wèn)題?。。?/p>

相關(guān)文章

  • Logstash配置Java日志格式的方法小結(jié)

    Logstash配置Java日志格式的方法小結(jié)

    Logstash 是用于日志收集的開(kāi)源工具,通常與 Elasticsearch 和 Kibana 一起使用,形成 ELK Stack,Logstash 非常靈活,可以通過(guò)配置文件(通常是 .conf 文件)來(lái)定義數(shù)據(jù)的輸入、處理和輸出,本文給大家介紹了Logstash配置Java日志格式的方法,需要的朋友可以參考下
    2024-09-09
  • Spring中@ConditionalOnProperty注解的作用詳解

    Spring中@ConditionalOnProperty注解的作用詳解

    這篇文章主要介紹了Spring中@ConditionalOnProperty注解的作用詳解,@ConditionalOnProperty注解主要是用來(lái)判斷配置文件中的內(nèi)容來(lái)決定配置類是否生效用的,如果條件不匹配,則配置類不生效,需要的朋友可以參考下
    2024-01-01
  • 詳解Java List的擴(kuò)容機(jī)制原理及應(yīng)用

    詳解Java List的擴(kuò)容機(jī)制原理及應(yīng)用

    在Java中,List是一種非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)有序的元素集合,本文將分析Java List的擴(kuò)容機(jī)制原理,并通過(guò)示例代碼和測(cè)試代碼來(lái)加強(qiáng)闡述內(nèi)容,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Java中Collection和Collections的區(qū)別

    Java中Collection和Collections的區(qū)別

    Collection是一個(gè)集合接口,集合類的頂級(jí)接口,Collections是一個(gè)包裝類,本文主要介紹了Java中Collection和Collections的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出的實(shí)現(xiàn)過(guò)程

    Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出的實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了Java 反轉(zhuǎn)帶頭結(jié)點(diǎn)的單鏈表并顯示輸出,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • 用Java8 stream處理數(shù)據(jù)

    用Java8 stream處理數(shù)據(jù)

    這篇文章主要介紹了用Java8 stream處理數(shù)據(jù),Java 8 API的設(shè)計(jì)者重新提出了一個(gè)新的抽象稱為流Stream,可以讓我們以一種聲明的方式處理數(shù)據(jù),此外,數(shù)據(jù)流可以充分利用多核架構(gòu)而無(wú)需編寫多線程的一行代碼,下面我們一起來(lái)看看文章詳細(xì)介紹
    2021-11-11
  • Spring中bean標(biāo)簽的用法詳解

    Spring中bean標(biāo)簽的用法詳解

    Bean標(biāo)簽一般用于配置對(duì)象交由Spring?來(lái)創(chuàng)建,這篇文章主要來(lái)和大家詳細(xì)聊聊Spring中bean標(biāo)簽的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • java同步與異步的學(xué)習(xí)筆記整理

    java同步與異步的學(xué)習(xí)筆記整理

    在本篇文章里小編給大家整理了關(guān)于java同步與異步的學(xué)習(xí)筆記整理內(nèi)容,需要的朋友們參考下。
    2020-02-02
  • java中synchronized Lock(本地同步)鎖的8種情況

    java中synchronized Lock(本地同步)鎖的8種情況

    本文主要介紹了java中synchronized Lock(本地同步)鎖的8種情況,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java實(shí)現(xiàn)調(diào)用ElasticSearch?API的示例詳解

    Java實(shí)現(xiàn)調(diào)用ElasticSearch?API的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java調(diào)用ElasticSearch?API的效果資料,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-03-03

最新評(píng)論