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(從

href="/technology/global/cn/software/index.html">OTN 下載)
Oracle9iAS Containers for J2EE (OC4J) 9.0.3 (從

href="/technology/global/cn/software/products/ias/index.html">OTN 下載)

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

源文件可從

href="/technology/sample_code/tech/java/codesnippet/jsps/jspio/Files-JSP.zip">此處下載。


說明

此示例是一個貨幣轉換器程序,它讀取存儲在一個文件中的貨幣匯率列表並使用這些數據進行轉換。
示例中的文件有

文本文件 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 執行文件操作。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章