servlet加载资源两种方式-内外(初始化参数).properties文件
在servlet中加載資源很方便,通過(guò)servletContext,這個(gè)是web服務(wù)器加載完web項(xiàng)目返回的參數(shù)之一,還有servletConfig,得到web項(xiàng)目一些配置信息,request和response,等等,我們現(xiàn)在用的這個(gè)servletContext也叫做Context域,一個(gè)web一共有四個(gè)域,分別是Context域,Session域,request域和response域,context域指的是整個(gè)應(yīng)用程序,域指的就是范圍。
1.那么servletContext加載資源通過(guò)getResourceAsOutputStream(),來(lái)返回一個(gè)流,通過(guò)這個(gè)流我們讀取資源文件。我們這里讀取(.properties)文件。
請(qǐng)注意,這里是在Servlet中讀取,而我的properties文件存在與這里
看代碼
1 ServletContext context = this.getServletContext(); 2 InputStream in = context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");這樣我們就能獲得這文件的一個(gè)字節(jié)輸入流。然后我們通過(guò)javaAPI中的Properties這個(gè)類來(lái)解析
1 ServletContext context = this.getServletContext(); 2 InputStream in = context.getResourceAsStream("/WEB-INF/classes/jdbc.properties"); 3 4 /* 5 * 下面是模版代碼 6 * */ 7 Properties prop = new Properties(); 8 prop.load(in); 9 String url = (String) prop.getProperty("url"); 10 System.out.println("打印:"+ url);用Properties這個(gè)類,要注意,這里的文件不能太大,為什么呢?因?yàn)檫@個(gè)類把這個(gè)文件加載到內(nèi)存里,為了防止內(nèi)存的溢出,所以它是有大小限制的,這里要注意。
2.用getRealPath()方法來(lái)獲取這個(gè)文件的絕對(duì)路徑,然后通過(guò)FileInputStream來(lái)獲得這個(gè)字節(jié)輸入流。用這個(gè)方法有一個(gè)好處,就是我們能通過(guò)這個(gè)path來(lái)獲得
這個(gè)文件的文件名稱。
1 ServletContext context = this.getServletContext(); 2 String path = context.getRealPath("/WEB-INF/classes/jdbc.properties"); 3 4 FileInputStream in = new FileInputStream(path); 5 6 /* 7 * 下面是模版代碼 8 * */ 9 Properties prop = new Properties(); 10 prop.load(in); 11 String url = (String) prop.getProperty("url"); 12 System.out.println("打印:"+ url); 13?
下面是不在servlet里面,也就是說(shuō)沒(méi)有servletContext這個(gè)對(duì)象,我們來(lái)讀取文件
這里我們同過(guò)類的裝載器來(lái)實(shí)現(xiàn)。
1 //PersonDao.class.getClassLoader()這個(gè)就是類的裝載器,我得到了這個(gè)類的裝載器 2 //就是得到了所有src里面的東西 3 InputStream in = PersonDao.class.getClassLoader().getResourceAsStream("jdbc.properties"); 4 /* 5 * 下面是模版代碼 6 * */ 7 Properties prop = new Properties(); 8 prop.load(in); 9 String url = (String) prop.getProperty("url"); 10 System.out.println("打印:"+ url);這里的路徑為什么直接就寫文件名稱,因?yàn)檫@個(gè)PersonDao.class.getClassLoader()就是類的加載器,就代表著classes,所以我們直接加載就行。
說(shuō)一下,這里用Properties這個(gè)類,如果說(shuō)你修改了jdbc.properties資源文件,比如里面的url的值被你修改了,而你的服務(wù)器沒(méi)有重新啟動(dòng),那么你在次執(zhí)行的時(shí)候,還是原來(lái)的值
這個(gè)是因?yàn)閟rc,也就是這個(gè)類只加載一次,當(dāng)你要訪問(wèn)這個(gè)文件的時(shí)候,虛擬機(jī)一看,我內(nèi)存里有,我就直接給你拿,他不會(huì)重新給你加載。
如果你非要得到這個(gè)修改后的值的話,那你就要通過(guò)PersonDao.class.getResource(“”)方法,就不要去用類裝載器了,這個(gè)方法會(huì)通過(guò)你給的資源,返回給你一個(gè)URL路徑,我們通過(guò)這個(gè)路徑用FilInputStream得到一個(gè)字節(jié)輸入流,這樣確保我們每次拿到的都是一個(gè)新的流,得到的才是一個(gè)新的數(shù)據(jù)。
?
1 String path = PersonDao.class.getResource("jdbc.properties").getPath(); 2 FileInputStream in = new FileInputStream(path); 3 4 /* 5 * 下面是模版代碼 6 * */ 7 Properties prop = new Properties(); 8 prop.load(in); 9 String urls = (String) prop.getProperty("url"); 10 System.out.println("打印:"+ urls);?
轉(zhuǎn)載于:https://www.cnblogs.com/duwenlei/p/3489416.html
總結(jié)
以上是生活随笔為你收集整理的servlet加载资源两种方式-内外(初始化参数).properties文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ctf misc 图片题知识点
- 下一篇: 2014程序化购买元年-芒果移动广告-王