【问题标题】:Locating created file with Java EE and Tomcat使用 Java EE 和 Tomcat 定位创建的文件
【发布时间】:2012-08-28 20:33:48
【问题描述】:
我创建了一个动态 Web 项目,并使用 Apache Tomcat 作为服务器。
在我的 servlet 中,我正在创建一个文本文件并希望在 JSP 中重用它。但是,当我执行以下简单操作时,默认情况下会在 Eclipse 的安装文件夹中创建它们:
File f = new file("test.txt").
我不知道为什么会这样。有没有办法在WebContent 目录中创建文件,因为我想让该文件可以在我的 JSP 中下载。
【问题讨论】:
标签:
java
jsp
jakarta-ee
tomcat
file-io
【解决方案1】:
Java 有一个“当前目录”的概念。当您通过 Eclipse 启动应用程序时,这可能确实指向您的安装目录。如果您不指定任何路径,则会在当前目录中创建一个文件。因此,您的 test.txt 最终出现在此处的原因。
WebContent 目录是 Eclipse 特有的。您的代码不应依赖于将任何内容放在那里。只有在开发应用程序时才通过 Eclipse 启动应用程序,而不是在将其部署到实时服务器时。
此目录的内容将成为您的 .war 的 root,这是一个众所周知的位置,与您如何启动和部署应用程序无关,但您仍然不能依赖在运行时向该位置写入任何内容.您可以将您的应用程序部署为一个打包的 .war(可能用于实时部署),或者您可以将您的应用程序部署为未打包的,但您的应用程序服务器可能根本无法获取运行时所做的任何更改。
如果您确定您的应用程序仅在单个服务器上运行,您可以执行的操作是将文件写入文件系统上众所周知的位置,例如/tmp 或/var/yourapp/files 等。提供的代码然后可以从该位置获取这些文件。
如果您想根据 Java EE 规则 100% 安全地播放它,您可以将文件存储在具有可配置地址的 FTP 服务器之类的东西上。从技术上讲,您的战争可以在集群上的节点之间传送,并且请求最终可能会发送到不同的机器,因此依赖于本地文件系统将无法正常工作。
【解决方案2】:
执行此语句this.getServletContext().getRealPath (""),您将获得Tomcat WebServer 在运行时指向的路径。您可以添加一个文件夹“MyFolder”并调用此语句:
新文件(this.getServletContext().getRealPath ("") + "/MyFolder/test.txt");
无论如何,默认路径看起来像:
...\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\<NameOfYourProject>
请注意,当您创建一个新文件时,它不会出现在您的直接工作区中(检查 .metadata 路径),除非您更改了 tomcat 应该指向的运行时位置。