【问题标题】:Edit resource in WEB-INF during application runtime在应用程序运行期间编辑 WEB-INF 中的资源
【发布时间】:2013-01-09 06:38:06
【问题描述】:

我可以像这样在我的 WEB-INF 文件夹中获取一个资源的 InputStream:

    ExternalContext externalContext = facesContext.getExternalContext();
    InputStream in = externalContext.getResourceAsStream("/WEB-INF/config.xml");

现在我想在运行时编辑此文件,但我不知道如何覆盖该文件。 有没有比创建 FileOutputStream 到绝对路径更好的方法?即使不是,我仍然需要一种方法来获取文件的绝对路径(WEB-INF 文件夹的绝对路径)。

【问题讨论】:

  • 为什么需要覆盖xml文件?
  • 你不能编辑正在使用的文件!!

标签: jakarta-ee servlets jsf-2


【解决方案1】:

至于具体问题,可以通过如下方式获取文件的绝对路径:

ExternalContext externalContext = facesContext.getExternalContext();
String realPath = externalContext.getRealPath("/WEB-INF/config.xml");
FileOutputStream output = new FileOutputStream(realPath);
// ...

至于具体的功能要求,有两个可能的主要问题:

  1. getRealPath() 将返回null,当容器被配置为在内存而不是磁盘上展开 WAR 文件时。那么就没有物理磁盘文件系统路径了。无法获取内存中位置的“文件路径”。

  2. 即使它返回一个有效的路径,在本地磁盘文件系统上扩展的 WAR 结构中所做的所有更改都会在您重新部署 WAR 时丢失,甚至在某些服务器配置中也将在您重新启动服务器时丢失。原因很简单,这些更改不包含在原始 WAR 文件中。您基本上需要提取 WAR,在其中进行更改,再次打包 WAR 并触发服务器的重新部署。这在运行时没有任何意义。

换句话说,您正在寻找错误的解决方案。您需要准备一个固定的本地磁盘文件系统路径,并改为读取/写入它。另一种方法是使用 SQL 数据库,或者很可能是 java.util.prefs.preferences

另见:

【讨论】:

  • 感谢您的回答。我决定使用固定的文件系统路径
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多