Java Server 页
日期:2003 年 7 月 3 日
如何在 JSP 文件中执行 I/O 操作
在看完这篇方法文档之后,您应该能够在 JSP 文件中编写代码,使用各种方法从文件系统中读取文件。
简介
典型情况下,大部分 web 应用程序需要从文件系统的静态文件中读取特定于应用程序的数据。然而,程序员 必须知道这些文件的完整路径 才能使用 I/O 类的构造函数器访问它们。因为 web 应用程序是作为 WAR 部署在应用程序服务器/servlet 引擎上,所以这些文件的完整路径(它们与应用程序捆绑)对于每个服务器是不同的。程序员不能使用相对路径,因为相对路径是从应用程序服务器/servlet 引擎启动的目录开始的,而这个目录在每个服务器上是不同的。
一个技巧是在 web.xml 文件中使用 <init-param> 标记配置文件路径,并在 servlet/JSP 中获取文件路径。但是这需要在部署之前更改 web.xml 文件以指向实际的路径。
为了解决这些配置问题,程序员可以使用 java.lang.ClassLoader 和 javax.servlet.ServletContext 类的特性。本文档的剩余部分讨论这个办法。
运行示例的前提条件
为了运行这里提供的示例,您需要
Oracle9i JDeveloper 9.0.3(从 OTN 下载) 或 Oracle9i AS Containers for J2EE (OC4J) 9.0.3 (从 OTN 下载) 。
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())); ... %>
运行示例
从 Oracle9i JDeveloper 运行
在 Oracle9i JDeveloper 中打开文件 Files-JSP.jws
选择 Files-JSP.jpr 并选择 Run。这将把应用程序部署到嵌入的 OC4J。您可以看见一列可供交换的货币列表。要想查看相反的汇率,点击 'Reverse rates' 链接。
在 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
例如: c:\Files-JSP\ant
使浏览器指向 http://<servername>:<port>/file-jsp/selectCurrencies.html
总结
在这篇方法文档中,您已经学习了如何在 JSP 文件中使用 ServletContext 和 ClassLoader API 执行文件操作。
资源