在应用程序运行时期间编辑WEB-INF中的资源

时间:2013-01-25 10:01:31

标签: java-ee servlets jsf-2

我能够获取一个InputStream到我的WEB-INF文件夹中的资源,如下所示:

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

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

1 个答案:

答案 0 :(得分:2)

关于具体问题,您可以按如下方式获取文件的绝对路径:

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

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

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

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

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

    另见: