当前位置: 首页 > 面试题库 >

在基于servlet的应用程序中的何处放置以及如何读取配置资源文件?

周苑博
2023-03-14
问题内容

在我的Web应用程序中,我必须将电子邮件发送给一组预定义的用户,例如finance@xyz.com,因此我希望将其添加到.properties文件中并在需要时进行访问。这是正确的过程吗?如果是这样,那我应该把这个文件放在哪里?我正在使用Netbeans IDE,它具有用于源文件和JSP文件的两个单独的文件夹。


问题答案:

这是你的选择。Java Web应用程序归档(WAR)中基本上有三种方式:

1.将其放在类路径中
这样就可以ClassLoader#getResourceAsStream()使用相对于classpath的路径加载它:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);

这里foo.properties应该被放置在它们通过web应用,例如web应用的默认的类路径所覆盖的根源之一/WEB-INF/lib和/WEB-INF/classes,服务器/lib,或JDK / JRE的/lib。如果properties文件是特定于Web应用程序的,则最好将其放在中/WEB-INF/classes。如果要在IDE中开发标准WAR项目,请将其放在src文件夹(项目的源文件夹)中。如果您正在使用Maven项目,请将其放在/main/resources文件夹中。

您也可以将其放置在默认类路径之外的某个位置,并将其路径添加到应用服务器的类路径。例如,在Tomcat中,您可以将其配置为的shared.loader属性Tomcat/conf/catalina.properties

如果已将其放置foo.properties在Java包结构(如)中com.example,则需要按以下方式加载它

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...

请注意,上下文类加载器的此路径不应以开头/。仅当您使用诸如之类的“相对”类加载器时SomeClass.class.getClassLoader(),您才确实需要使用来启动它/。

ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...

但是,属性文件的可见性则取决于所讨论的类加载器。只有与加载该类的类加载器相同的类加载器才可见。因此,如果该类是通过例如服务器公共类加载器而不是webapp类加载器加载的,并且属性文件位于webapp本身内部,则它是不可见的。上下文类加载器是您最安全的选择,因此您可以将属性文件“随处放置”在类路径中,并且/或者希望能够从Web应用程序覆盖服务器提供的文件。

2.放入网站内容
这样就可以ServletContext#getResourceAsStream()使用相对于webcontent的路径加载它:

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...

请注意,我已演示将文件放置在文件/WEB-INF夹中,否则任何Web浏览器都可以公开访问该文件。还要注意的是,ServletContext在任何HttpServlet仅仅通过继承的访问类GenericServlet#getServletContext()Filter通过FilterConfig#getServletContext()。如果您不在servlet类中,则通常只能通过注入@Inject。

3.放入本地磁盘文件系统
这样您就可以java.io使用绝对本地磁盘文件系统路径以通常的方式加载它:

InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...

请注意使用绝对路径的重要性。相对本地磁盘文件系统路径在Java EE Web应用程序中绝对无法通过。另请参见下面的第一个“另请参见”链接。

选择哪个?
只是权衡优势/劣势在你自己的可维护性意见。

如果属性文件是“静态”的,并且在运行时不需要更改,则可以将其保留在WAR中。

如果您希望能够从Web应用程序外部编辑属性文件而无需每次都重新构建和重新部署WAR,则将其放在项目外部的类路径中(如有必要,将目录添加到类路径中)。

如果您希望能够使用Properties#store()方法从Web应用程序内部以编程方式编辑属性文件,请将其放在Web应用程序外部。根据Properties#store()需要Writer,您不能使用磁盘文件系统路径。该路径又可以作为VM参数或系统属性传递给Web应用程序。作为预防措施,切勿使用getRealPath()。重新部署后,deploy文件夹中的所有更改都将丢失,原因很简单,因为更改不会反映在原始WAR文件中。



 类似资料:
  • 目前我有以下代码: 代码位于返回特定图像视图的函数中。问题是,每当用户请求此视图时,图像视图计数都应该增加,但是,我不喜欢在返回视图的函数中使用此逻辑,因此我希望创建一个: 在我的控制器中的某个地方(我一直在考虑把它放在我的中),然后在我的函数中调用返回视图的函数。 现在我想知道这是否是一个好方法。问题是,我不认为这将工作到现在,因为我不认为我被允许从另一个控制器调用函数,而不先做一些事情。

  • 我正试图找出如何以适当的方式测试我的代码,并卡在中间的某个地方。 我所使用的: 我需要什么样的帮助: 实现这种方法的工作项目是最可取的。不要花太多的文字,工作代码对我来说是最好的理解方式。 如果没有一个完整的项目,那么带有描述的代码段也很有用。 链接到关于1)基于Java的配置2)替换基于Java的配置进行测试的一些好的和简单的教程。 很抱歉,如果我的想法有点混乱,我是Java EE开发的新手,仍

  • 问题内容: 我正在用Eclipse编写Web应用程序。 我正在尝试使用ServiceLoader类加载一些插件。 ServiceLoader的文档说我需要在META-INF / services中放置一个文件。 我已经将该文件放置在WebContent / META-INF / service文件夹中,但是当我通过Eclipse运行JUnit测试时,找不到任何插件。 这是文件的正确位置吗? 另外,

  • 我试图在我的认证系统中实现JWT,我有几个问题。要存储令牌,我可以使用Cookie,但也可以使用或。 哪一个是最好的选择? 我已经读到JWT保护网站不受CSRF的影响。但是,如果我将JWT令牌保存在cookie存储中,我无法想象这将如何工作。 那么它将如何防止CSRF? 更新1 我看到一些使用示例,如下所示: 当我从浏览器向服务器发出请求时,如何实现这一点?我还看到一些人在URL中实现了令牌: 如

  • 我最近在使用作为Spring Boot applications(v2.2)开发的微服务,在我的公司,我们使用Keycloak作为授权服务器。我们之所以选择它,是因为我们需要复杂的策略、角色和组,我们还需要用户托管授权(UMA)来在用户之间共享资源。 有没有一种方法可以在控制器级别使用某种注释?类似于下面的伪代码:

  • 我正在尝试将我的应用程序配置为具有两个构建配置文件:开发和生产。为此,我在src/main/resources文件夹下创建了两个子目录:src/main/resources/development和src/main/resources/production。每个子目录都有自己的。属性文件。 我使用命令mvn install-P${profile_here}构建应用程序 Maven将与所选配置文件相