我创建了一个Web应用程序(WAR)并将其部署在Tomcat上.在webapp中,有一个页面,其中包含管理员可以输入某些配置数据的表单.我不想将这些数据存储在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.我不认为它是在我们的应用程序最初开发时,如果它没有被使用.
至于访问配置文件的路径,它只是文件系统上的一个文件.您无需担心Web路径.因此,当您的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的用户)中编写一些内容.