56

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

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

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

4

6 回答 6

49

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

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

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

您可以在代码中硬编码一些东西,但这很丑陋,原因有很多。如果信息必须更改,您必须重新构建代码并重新部署。如果有人获得了您的代码或 WAR 文件的副本,他们就会获得该信息。

把东西放在 WAR 文件中看起来不错,但如果你想改变很多东西,那可能是个坏主意。问题是,如果您必须更改信息,那么下次重新部署时它将覆盖文件,因此您不记得在 WAR 内置版本中更改的任何内容都会被遗忘。

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

我能想到的唯一其他可行的解决方案是将除了数据库登录信息之外的所有内容都保存在数据库中。这将来自通过 JVM 检索的 Java 系统属性。这是上面 Hans Doggen 提到的 Preferences API 的东西。我不认为它在我们的应用程序第一次开发时就已经存在,如果它没有被使用的话。

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

于 2008-09-18T20:15:24.000 回答
16

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

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
于 2008-09-18T20:19:45.050 回答
9

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

于 2008-09-18T20:29:48.660 回答
6

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

我建议你看看 Preferences API,或者在 users 文件夹(运行 Tomcat 的用户)中写一些东西。

于 2008-09-18T19:57:34.977 回答
3

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

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

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

于 2008-09-18T19:57:38.597 回答
1

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

于 2008-09-18T19:58:21.840 回答