在Java Web应用程序(WAR)中存储配置文件的最佳位置是什么?
我创建一个Web应用程序(WAR)并将其部署在Tomcat上。在webapp中,有一个带有表单的页面,管理员可以在其中输入一些配置数据。我不想将此数据存储在DBMS中,而只是存储在文件系统上的XML文件中。放在哪里?
我想将文件放在部署应用程序本身的目录树中的某个位置。我的配置文件应该在WEB-INF目录中吗?还是放在其他地方?
在servlet中使用Java代码查找目录的绝对路径是什么?还是可以通过相对路径访问它?
解决方案
我不会将其存储在应用程序文件夹中,因为这将使用应用程序的新部署覆盖配置。
我建议我们看一下Preferences API,或者在users文件夹(运行Tomcat的用户)中写一些东西。
答案取决于我们打算如何读取和写入该配置文件。
例如,Spring框架使我们能够使用XML配置文件(或者Java属性文件)。这些可以存储在类路径中(例如,在WEB-INF目录中),文件系统上的其他任何位置,甚至是内存中。如果要为此使用Spring,则最简单的存储配置文件的位置就是WEB-INF目录,然后使用Spring的ClassPathXmlApplicationContext类访问配置文件。
但是同样,这完全取决于我们打算如何访问该文件。
如果这是自定义配置,则WEB-INF是一个不错的选择。但是某些库可能需要配置才能驻留在WEB-INF / classs中。
我们要做的是将其放置在服务器上的单独目录中(我们可以使用/ config,/ opt / config,/ root / config,/ home / username / config之类的东西,或者任何我们想要的东西)。当我们的servlet启动时,他们读取XML文件,从中获取一些东西(最重要的是数据库连接信息),仅此而已。
我问我们为什么要这样做一次。
将所有内容存储在数据库中会很好,但是显然我们不能在数据库中存储数据库连接信息。
我们可以对代码中的内容进行硬编码,但是由于许多原因,这很丑陋。如果必须更改信息,则必须重新构建代码并重新部署。如果有人获得了代码或者WAR文件的副本,那么他们将获得该信息。
将内容放在WAR文件中看起来不错,但是如果我们想进行很多更改,则可能不是一个好主意。问题是,如果我们必须更改信息,那么下次重新部署该文件时,它将覆盖该文件,因此我们忘记存储在WAR中的版本中所做的任何更改都将被忘记。
该文件在文件系统上的特殊位置对我们来说效果很好。它没有太大的缺点。我们知道它在哪里,它分开存储,如果它们都需要不同的配置值(因为它不是WAR的一部分),则使部署到多台计算机变得容易。
我能想到的唯一可行的解决方案是将除数据库登录信息外的所有内容保留在数据库中。那将来自通过JVM检索的Java系统属性。这是汉斯·道根(Hans Doggen)上面提到的"偏好设置" 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"中。