我创建一个 Web 应用程序 (WAR) 并将其部署在 Tomcat 上。在里面 网络应用程序 有一个带有表单的页面,管理员可以在其中输入一些配置数据。我不想将此数据存储在 DBMS 中,而只想存储在文件系统上的 XML 文件中。放在哪里?

我想将该文件放在部署应用程序本身的目录树中的某个位置。我的配置文件应该在 WEB-INF 目录?或者放在其他地方?

在 servlet 中使用什么 Java 代码来查找目录的绝对路径?或者可以通过相对路径访问吗?

有帮助吗?

解决方案

我们所做的是将其放在服务器上的单独目录中(您可以使用 /config、/opt/config、/root/config、/home/username/config 或任何您想要的目录)。当我们的 servlet 启动时,它们读取 XML 文件,从中获取一些信息(最重要的是数据库连接信息),仅此而已。

我问过我们为什么这样做一次。

将所有内容存储在数据库中固然很好,但显然您不能将数据库连接信息存储在数据库中。

您可以在代码中对内容进行硬编码,但由于多种原因,这很丑陋。如果信息必须更改,您必须重建代码并重新部署。如果有人获得您的代码或 WAR 文件的副本,他们就会获得该信息。

将内容放入 WAR 文件中似乎不错,但如果您想进行大量更改,这可能是一个坏主意。问题是,如果您必须更改信息,那么下次重新部署时,它将覆盖该文件,因此您在构建到 WAR 的版本中不记得更改的任何内容都会被忘记。

文件系统上特殊位置的文件对我们来说效果很好。它没有任何大的缺点。您知道它在哪里,它是单独存储的,如果多台机器都需要不同的配置值,则可以轻松部署到它们(因为它不是 WAR 的一部分)。

我能想到的唯一有效的其他解决方案是将除数据库登录信息之外的所有内容保留在数据库中。这将来自通过 JVM 检索的 Java 系统属性。这就是上面 Hans Doggen 提到的 Preferences API。我认为当我们的应用程序首次开发时它并不存在,即使存在也没有被使用。

至于访问配置文件的路径,它只是文件系统上的一个文件。您无需担心网络路径。因此,当您的 servlet 启动时,它只需打开“/config/myapp/config.xml”(或其他)处的文件,它就会找到正确的内容。只是对这个路径进行硬编码对我来说似乎是无害的。

其他提示

WEB-INF 是放置配置文件的好地方。下面是一些从 servlet 获取目录绝对路径的代码。

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")

把它放进去 WEB-INF 会对尝试通过 URL 直接访问该文件的用户隐藏 XML 文件,所以是的,我会说将其放入 WEB-INF.

我不会将其存储在应用程序文件夹中,因为这会使用应用程序的新部署覆盖配置。

我建议您查看 Preferences API,或者在 users 文件夹(运行 Tomcat 的用户)中写入一些内容。

这个问题的答案取决于您打算如何读取和写入该配置文件。

例如,Spring 框架使您能够 使用 XML 配置文件 (或 Java 属性文件);这些可以存储在您的类路径中(例如,在 WEB-INF 目录中)、文件系统上的任何其他位置,甚至内存中。如果您要使用 Spring 来实现此目的,那么存储配置文件的最简单位置是在 WEB-INF 目录中,然后使用 Spring 的 类路径XmlApplicationContext 类来访问您的配置文件。

但同样,这完全取决于您计划如何访问该文件。

如果它是您的自定义配置,WEB-INF 是一个好地方。但某些库可能需要将配置驻留在 WEB-INF/classes 中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top