使用JSF編寫web程序的時(shí)候,JavaBean無法直接通過相對(duì)路徑來訪問文件。經(jīng)過一天的研究主要發(fā)現(xiàn)兩類解決方案,一是,通過FacesContext,二是,通過ClassLoader。
下面通過實(shí)例來說明。
首先是介紹web程序目錄的大致結(jié)構(gòu):
D:"......"Tomcat 6.0"webapps"imatrixb ------> 程序的更目錄
--META-INF
--WEB-INF
---------------classess
---------------------------cn
----------------------------------com
--------------------------------------------…… ----------->class 文件
---------------------------XmlData
---------------------------------path-config.xml (1)
--------------- path-config.xml (2)
…….
Index.jsp
一:FacesContext
獲得(2)號(hào)path-config.xml文件信息,
代碼如下:
String partPath=”/ WEB-INF/ path-config.xml”;
1. getRealPath():
FacesContext
context = FacesContext.getCurrentInstance();
HttpServletRequest rst = (HttpServletRequest)context.getExternalContext().getRequest();
String fullPath=rst.getRealPath(xmlfile); // 獲得xml文件的系統(tǒng)路徑,xmlfile為相對(duì)路徑
采用這個(gè)方法存在一些隱患:比方說對(duì)一個(gè)打包的應(yīng)用來說,是沒有RealPath的概念的,調(diào)用getRealPath只會(huì)簡(jiǎn)單地返回null。
2. getResourceAsStream():
FacesContext context = FacesContext.getCurrentInstance();
InputStream xmlStream = context.getExternalContext()
.getResourceAsStream(xmlfile);
用于只讀的形式。
二:ClassLoader
獲得(1)號(hào)path-config.xml文件信息,
代碼如下:
String partPath =”/XmlData/path-config.xml”;
String fullPath=this.getClass().getClassLoader().getResource(partPath).getPath();
//使用的時(shí)候還是存在一些問題,無法正常使用,暫時(shí)沒有發(fā)現(xiàn)解決的辦法
InputStream xmlStream=this.getClass().getClassLoader().getResourceAsStream(partPath);
//用于只讀的形式下,通過測(cè)試能夠正常的使用