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

标签 jakarta-ee servlets jsf-2

我能够获取 WEB-INF 文件夹中资源的输入流,如下所示:

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

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

最佳答案

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

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 并触发服务器的重新部署。这在运行时没有任何意义。

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

另请参阅:

关于jakarta-ee - 在应用程序运行时编辑 WEB-INF 中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14519427/

相关文章:

jsf - 验证错误 : Value is not valid for SelectManyCheckBox

java - 如何设置具有 JSF 2.2、JPA 2.0 和依赖注入(inject)功能的 Google AppEngine Web 应用程序?

jakarta-ee - 运行 hadoop pi 示例时出现 java.lang.runtimeexception java.net.connectexception

java - RxJava : Reduce not working as expected

java - 使用 SQL 数据库中的值过滤 JSP 上的表值

java - ServletRequest过滤器测试用例

validation - 带有primefaces的电子邮件模式

java - WAR 文件中没有 .java 源文件

java - 如果我在 web.xml/session-config 中使用 -1 , session 超时永远不会发生

java - 列出 java webapp 中的 servlet(在 tomcat 中运行)