1. 程式人生 > >JSP頁面中如何使用相對路徑訪問檔案

JSP頁面中如何使用相對路徑訪問檔案

簡介

典型情況下,大部分 web 應用程式需要從檔案系統的靜態檔案中讀取特定於應用程式的資料。然而,程式設計師

class="paragraph">必須知道這些檔案的完整路徑

class="paragraph">才能使用 I/O 類的建構函式器訪問它們。因為 web 應用程式是作為 WAR 部署在應用程式伺服器/servlet 引擎上,所以這些檔案的完整路徑(它們與應用程式捆綁)對於每個伺服器是不同的。程式設計師不能使用相對路徑,因為相對路徑是從應用程式伺服器/servlet 引擎啟動的目錄開始的,而這個目錄在每個伺服器上是不同的。

一個技巧是在 web.xml 檔案中使用 標記配置檔案路徑,並在 servlet/JSP 中獲取檔案路徑。但是這需要在部署之前更改 web.xml 檔案以指向實際的路徑。

為了解決這些配置問題,程式設計師可以使用 java.lang.ClassLoader 和 javax.servlet.ServletContext 類的特性。本文件的剩餘部分討論這個辦法。

執行示例的前提條件

為了執行這裡提供的示例,您需要

Oracle9i JDeveloper 9.0.3(從 Apache Ant 1.4.x,如果您準備部署在 OC4J 上(可從 Apache 下載)。(可選的,只有當不使用 JDeveloper 時才是必需的)
原始檔可從

說明

此示例是一個貨幣轉換器程式,它讀取儲存在一個檔案中的貨幣匯率列表並使用這些資料進行轉換。
示例中的檔案有

文字檔案 rates.txt,用於儲存匯率。 HTML 檔案 selectCurrencies.html,它允許使用者選擇貨幣和數額。 JSP 檔案 convert.jsp,它轉換貨幣並打印出結果。 JSP 檔案 reverseRates.jsp,它逆向轉換匯率並寫入目錄WEB-INF/classes 下的檔案 reverserates.txt

有多種方法可以讀取檔案。javax.servlet.ServletContext API 具有訪問一般資源的方法。

getResource(String resource) - 返回 web 應用程式中的資源的 URL getResourceAsStream(String resource) - 返回 web 應用程式中的資源的 InpuStream getResourcePaths(String path) - 返回一個類似於目錄的列表,列出了 web 應用程式內其所有最長的子路徑與提供的路徑引數相匹配的資源路徑。所以,在 convert.jsp 中,我們使用這些 API 來獲取檔案


<%
...
//以輸入流獲取該檔案
//其路徑與應用程式上下文相關,rates.txt 位於
//應用程式的 WEB-INF 資料夾下
InputStream is = config.getServletContext().getResourceAsStream("/rates.txt");

...
%>

或者我們可以從 ClassLoader 使用 API,它要求資源位於 classpath 之內。在這種情況下,我們應該把檔案放在 WEB-INF/classses 目錄中,所有的應用程式類都存放於該目錄下。

檔案 reverseRates.jsp 結合了 ClassLoader 方法和 ServletContext 方法

<%
...
//為該檔案獲取 URL 並顯式地建立流
java.net.URL url =config.getServletContext().getResource("/rates.txt");
BufferedReader breader =new BufferedReader(new InputStreamReader(url.openStream()));


//另一個開啟檔案的方法是使用 ClassLoader API
//ClassLoader 例項的獲得方法如下所示。該例項必須是
//在應用程式中載入類的那一個。這樣的例項
//需要通過當前執行緒物件獲取。
//注意,如果檔案不存在,url 則為空。我們假定
//在 /WEB-INF/類下存在一個空檔案 "reverserates.txt"

url = Thread.currentThread().getContextClassLoader().getResource("reverserates.txt");
//我們將建立一個 BufferedWriter 來編寫逆向轉換的匯率
BufferedWriter writer = new BufferedWriter(new FileWriter(url.getFile()));
...
%>

執行示例

從 Oracle9

class="ITALICiBodycopy">i

JDeveloper 執行 在 Oracle9i JDeveloper 中開啟檔案 Files-JSP.jws 選擇 Files-JSP.jpr 並選擇 Run。這將把應用程式部署到嵌入的 OC4J。您可以看見一列可供交換的貨幣列表。要想檢視相反的匯率,點選 'Reverse rates' 連結。

class="heading4">在 OC4J 上執行,

啟動 OC4J。 在命令提示符,設定環境變數 ANT_HOME、JAVA_HOME、OC4J_HOME 和 OC4J_HOST
例如: c:/Files-JSP/set ANT_HOME=d:/ant141
c:/Files-JSP/set JAVA_HOME=d:/jdk1.3.1_01
c:/Files-JSP/set OC4J_HOME=d:/oc4j903
c:/Files-JSP/set OC4J_HOST=localhost:23791
執行 ant
例如: c:/Files-JSP/ant
使瀏覽器指向 http://: /file-jsp/selectCurrencies.html

總結

在這篇方法文件中,您已經學習瞭如何在 JSP 檔案中使用 ServletContext 和 ClassLoader API 執行檔案操作。