gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:11:14 37 4
gpt4 key购买 nike

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

最佳答案

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

1.放在类路径中
这样您就可以通过 ClassLoader#getResourceAsStream() 加载它使用类路径相对路径:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
这里 foo.properties应该放置在由 webapp 的默认类路径覆盖的根目录之一中,例如webapp的 /WEB-INF/lib/WEB-INF/classes , 服务器的 /lib , 或 JDK/JRE 的 /lib .如果属性文件是特定于 webapp 的,最好将它放在 /WEB-INF/classes .如果您在 IDE 中开发标准 WAR 项目,请将其放入 src文件夹(项目的源文件夹)。如果您使用的是 Maven 项目,请将其放入 /main/resources文件夹。
您也可以将它放在默认类路径之外的某个位置,并将其路径添加到应用服务器的类路径中。例如在 Tomcat 中,您可以将其配置为 shared.loader Tomcat/conf/catalina.properties 的属性(property).
如果您已放置 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本身内部,那么它是不可见的。上下文类加载器是您最安全的选择,因此您可以将属性文件“无处不在”放在类路径中和/或您打算能够从 webapp 覆盖服务器提供的文件。

2. 放入网页内容
这样您就可以通过 ServletContext#getResourceAsStream() 加载它使用 webcontent-relative 路径:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
请注意,我已经演示了将文件放在 /WEB-INF 中。文件夹,否则任何网络浏览器都可以公开访问它。另请注意 ServletContext在任何 HttpServlet类只能由继承的 GenericServlet#getServletContext() 访问在 Filter FilterConfig#getServletContext() .如果你不在一个 servlet 类中,它通常可以通过 @Inject 注入(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 应用程序。作为预防措施, never use getRealPath() .部署文件夹中的所有更改都将在重新部署时丢失,原因很简单,更改不会反射(reflect)在原始 WAR 文件中。
也可以看看:
  • getResourceAsStream() vs FileInputStream
  • Adding a directory to tomcat classpath
  • Accessing properties file in a JSF application programmatically
  • 关于servlets - 在基于 servlet 的应用程序中放置以及如何读取配置资源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57953928/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com