Java代碼
ServletContext context = getServletContext();
org.apache.log4j.PropertyConfigurator.
configure(context.getRealPath("/")
+ "/WEB-INF/log4j.properties"); 其中,context.getRealPath("/")得到當前Web應用的真實根目錄,比如,如果你的WebLogic安裝在D:\bea下,在Windows下context.getRealPath("/")通常會返回:D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp。這樣,和 "/ WEB-INF /log4j.properties"拼接後,就得到了log4j.properties檔案的真實路徑。現在一切正常!測試通過後,將DefaultWebApp下的所有檔案打為一個.war包,進行部署時,發現系統報告找不到“D:\bea
\wlserver6.1\null\ WEB-INF \log4j.properties”檔案!如果你的應用中還需要讀取其它已經被打包到war包中的檔案,都會報告找不到檔案。並且,系統並不會到D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp 目錄下尋找,而會到D:\bea\wlserver6.1\null下尋找。這是因為context.getRealPath("/")返回了null。
查看ServletContext的API文檔,原來,對一個打包的應用來說,是沒有RealPath的概念的,調用getRealPath 只會簡單地返回null。其實,也很好理解,一個檔案被打包入了.war檔案,就不存在目錄結構了(雖然包中仍然存在目錄結構,但這不等同於檔案系統中的目錄結構)。所以,對war包中的資源是無法得到RealPath的。這樣也就無從通過檔案IO進行讀取了。那麼,如何讀取war包中的資源呢?答案是使用ServletContext.getResourceAsStream(String)方法。那麼,現在對於war應用可以成功運行,但如果現在不通過war部署,直接通過目錄結構部署應用會不會又出現找不到資源的錯誤呢?請來看看
ServletContext.getResourceAsStream的API文檔,
Java代碼
# Returns a URL to the resource that is
# mapped to a specified path. The path
# must begin with a "/" and is interpreted
# as relative to the current context root.
# This method allows the servlet container
# to make a resource available to servlets
# from any source. Resources can be located
# on a local or remote file system,
# in a database, or in a .war file.
# 可見,通過getResourceAsStream可以擷取包括本地檔案系統、遠程檔案系統、war包等資源。不會出現上面擔心的問題。
結論:在開發J2EE Web應用時,如果需要讀取本應用中的檔案,盡量使用ServletContext.getResourceAsStream進行,而不要使用檔案IO。getRealPath在不同的伺服器中獲得的參數是不一樣的,有些會返回空,有些會返回正常資料,這就要看伺服器是否解包檔案了,而且有些伺服器中getRealPath是本身就以"/"結尾的,這裡是最好進行下判斷:
Java代碼
realPath.endsWith("/")?realPath:(realPath+"/")
3,web程式可以通過ServletContext進行載入
一個特定資源的URL可以通過調用ServletContext.getResource(String path)得到,這兒的path參數必須以“/”開始,將被解析為相對於當前Servlet背景的根的相對路徑。這個方法有別於基於類載入器的 java.lang.Class.getResource方法。假如你通過ServletContext.getResource方法請求了一個.jsp 頁面,你得到的將是JSP的源碼,要得到執行結果,可以使用RequestDispatcher對象的include方法。你也可以直接以輸入資料流的形式得到資源,
Java代碼
public InputStream getResourceAsStream(String path); 上個例子已經很好的聯合檔案io來對2者進行了比較了。Java代碼
inputStream = sc.getResourceAsStream(EnumConstants.SERVER_CONFIGURATION_FILEPATH.toString());
/**
*"SERVER_CONFIGURATION_FILEPATH" server configuration reflection class properties file path <b>"/config/server-config.properites"
*/
public static final EnumConstants SERVER_CONFIGURATION_FILEPATH = new EnumConstants("/config/server-config.properites"); 轉自: http://www.360doc.com/content/11/0314/10/3477798_100936997.shtml