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

2024-02-26

在我的网络应用程序中,我必须向一组预定义用户发送电子邮件,例如[email protected] /cdn-cgi/l/email-protection,所以我想将其添加到.properties文件并在需要时访问它。这是正确的过程吗?如果是,那么我应该将该文件放在哪里?我正在使用 Netbeans IDE,它有两个单独的文件夹用于源文件和 JSP 文件。


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


1.将其放入类路径中

这样你就可以通过以下方式加载它ClassLoader#getResourceAsStream() http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29使用类路径相对路径:

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

Here foo.properties应该放置在 web 应用程序的默认类路径覆盖的根目录之一中,例如网络应用程序/WEB-INF/lib and /WEB-INF/classes, 服务器的/lib,或 JDK/JRE 的/lib。如果属性文件是特定于 Web 应用程序的,最好将其放在/WEB-INF/classes。如果您正在 IDE 中开发标准 WAR 项目,请将其放入src文件夹(项目的源文件夹)。如果您使用的是 Maven 项目,请将其放入/main/resources folder.

您也可以将其放在默认类路径之外的某个位置,并将其路径添加到应用程序服务器的类路径中。例如,在 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() http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContext.html#getResourceAsStream%28java.lang.String%29具有网络内容相对路径:

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

请注意,我已经演示了将文件放入/WEB-INF文件夹,否则任何网络浏览器都可以公开访问它。另请注意,ServletContext是在任何HttpServlet类只能由继承访问GenericServlet#getServletContext() http://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext%28%29 and in Filter by FilterConfig#getServletContext() https://docs.oracle.com/javaee/7/api/javax/servlet/FilterConfig.html#getServletContext--。如果您不在 servlet 类中,它通常只能通过以下方式注入@Inject.


3.放入本地磁盘文件系统

这样你就可以像平常一样加载它java.io使用绝对本地磁盘文件系统路径的方式:

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

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


选择哪个?

只需权衡优点/缺点your自己对可维护性的看法。

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

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

如果您希望能够从 Web 应用程序内部以编程方式编辑属性文件,请使用Properties#store()方法,将其放在 Web 应用程序之外。作为Properties#store()需要一个Writer,您不能使用磁盘文件系统路径。该路径又可以作为 VM 参数或系统属性传递到 Web 应用程序。作为预防措施,never use getRealPath() https://stackoverflow.com/questions/12160639/what-does-servletcontext-getrealpath-mean-and-when-should-i-use-it。部署文件夹中的所有更改都将在重新部署时丢失,原因很简单,这些更改不会反映在原始 WAR 文件中。

也可以看看:

  • getResourceAsStream() 与 FileInputStream https://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream
  • 将目录添加到 tomcat 类路径 https://stackoverflow.com/questions/1300780/adding-a-directory-to-tomcat-classpath
  • 以编程方式访问 JSF 应用程序中的属性文件 https://stackoverflow.com/questions/7952090/accessing-i18n-properties-file-in-a-jsf-application-programmatically/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在基于 servlet 的应用程序中,配置资源文件应该放在哪里以及如何读取? 的相关文章

  • jqgrid删除:没有获取值

    我使用 JSP 和 Servlet IDE Eclipse 数据库 Oracle10 开发 Web 应用程序 我在用JQGRID以表格格式显示数据 我还想要添加 编辑 删除的功能JQGRID 到目前为止我已经完成了编辑功能 现在我想要Del
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 错误: 无法使用“localhost:10.0”作为 DISPLAY 变量的值连接到 X11 窗口服务器

    我有 2 个应用程序运行良好 除了 1 个功能的生产环境之外 此功能是从简单表格生成 Excel 在我的所有其他环境中 Excel 的生成都可以 但是当我尝试在生产环境中使用它时 我在日志中遇到了这个错误并且很顽皮错误500在我的应用程序上
  • 无法让远程 EJB 与 Wildfly 上的 EJB 客户端 API 配合使用

    我目前正在努力让远程 EJB 调用在 wildfly 8 x 和 9 x 上工作 详细来说 它是关于使用 EJB 客户端 API 方法从独立客户端应用程序 而不是从另一个应用程序服务器 进行远程调用 远程命名方法适用于我 但不适用于我的场景
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • ASP.NET Web Api:项目需要 SQL Server Express

    我在VS 2010下创建了一个Web API项目 当我切换到 VS 2012 后 我总是收到警告 Web 项目 xxx 需要 SQL Server Express 但不需要 安装在这台计算机上 我不想安装此 SQL Server Expre
  • CDI 装饰另一个 JAR 中的服务

    我想使用 CDI 的装饰器模式来增强服务提供的业务逻辑 我尝试装饰的服务位于另一个模块 用 Maven 术语来说 因此是另一个 JAR 例如 提供的服务在模块中com acme provider当装饰者在的时候com acme consum
  • Apache Tomcat 无法加载 web.xml - 连接超时

    如果我尝试在 Tomcat 中部署 Web 应用程序 则会出现异常 这web xml对我来说似乎是正确的 所以问题应该出在其他地方 任何帮助 将不胜感激 web xml
  • Spring 3 applicationContext-security-JDBC.xml 有 beans:bean 不是 bean?

    有人可以告诉我在我的 ApplicationContext 中我必须使用 beans bean 而不是 bean 以及如何修复它
  • 全局常量的正确使用方法

    在几乎每个项目中 我都无法决定如何处理某些全局常量值 以前 当我编写不使用 dll 的 C 程序时 这很容易 只需创建 h 文件 其中包含一些const它描述了我的项目的某些恒定值 然后我让每个文件都包含它 然后哒哒 有效 干净 尊重 DR
  • 如何在servlet中获取表单参数? request.getAttribute 不起作用

    是否可以让同一个 servlet 执行验证 似乎在这里可能需要利用某种递归 但是当我在电子邮件框中输入内容并单击 提交 时 电子邮件参数仍然为空 单击 提交 后 URL 更改为 http localhost servlet EmailSer
  • 终止用户会话

    我有 3 个标签 主页 选项卡 1 选项卡 2 当用户启动应用程序时 它会定向到 主页 选项卡 我使用以下命令创建一个新会话HttpSession session request getSession 当用户浏览到其他选项卡时 我使用以下方
  • 在样式定义中使用@string资源

    我在 styles xml 文件中定义了类似以下内容 如下所示 但是Android由于使用 string fontExtraLarge而崩溃 我假设这是因为定义的顺序 但这合法吗 我可以使用样式 parent 属性来解决此问题 但对于只有一
  • 维护动作变量的值?

    class SampleAction extends ActionSupport private Map
  • 在eclipse java项目中加载dll文件

    我正在尝试添加文件sqljdbc auth dll到项目库 我将包含 dll 的文件夹添加为外部类文件夹 在这里 我基本上尝试使用 Microsoft 提供的 SQL 驱动程序连接到我的 SQL SERVER 2008 数据库 我的代码是
  • 使用java连接到VPN后面的http服务器

    我想通过 VPN 连接到 REST Web 服务 Java 有没有办法在不使用操作系统功能的情况下建立到 VPN 网关的 pptp l2tp ipsec 连接和 HTTP 请求隧道 这很重要 因为我将从 servlet 连接到多个休息服务
  • FileNotFoundException(文件太大)

    我在尝试下载文件时遇到此异常 Caused by java io FileNotFoundException repository PWWVFSYWDW0STLHYVEEKHMYBXZTTETGROCQ4FGdsadadaXR1407709
  • 帮助我避免 JPA、Hibernate 和 MySQL 的连接超时

    我正在使用 JPA Hibernate 作为提供者 Glassfish 和 MySQL 开发中一切都运行良好 但是当我将应用程序部署到测试服务器并让它运行 大部分空闲 过夜时 我通常会在早上遇到这样的情况 2011 03 09T15 06
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • XAML:如何定义要在多个项目中使用的数据模板和样式

    我开始使用 WPF net 3 5 sp1 仅使用 VS 尚未混合 开发桌面应用程序 我现在的情况是 我在几个库中有一些通用的可重用组件 我可以在哪里定义样式和数据模板 以便它们可以在多个项目中重复使用 从而获得一致的外观和感觉 我看过 R

随机推荐

  • iPhone 应用内购买商店工具包错误 -1003“无法连接到 iTunes Store”

    我一直致力于添加应用内购买 并且能够使用 Store Kit 创建和测试应用内购买 耶 在测试过程中 我以一种导致应用程序在购买过程中崩溃的方式运行了我的应用程序 所以我猜接收 paymentQueue updatedTransaction
  • Bash 命令替换给出奇怪的不一致输出

    由于与此问题无关的某些原因 我不是直接在 bash 脚本中运行 Java 服务器 而是通过单独的子 shell 下的命令替换在后台运行 该子命令的目的是返回 Java 服务器的进程 ID 作为其标准输出 有问题的片段如下 launch da
  • 在 C++ 标识符中使用下划线的规则是什么?

    在 C 中 使用某种前缀来命名成员变量是很常见的 以表示它们是成员变量 而不是局部变量或参数 如果您有 MFC 背景 您可能会使用m foo 我也见过myFoo偶尔 C 或者可能只是 NET 似乎建议仅使用下划线 如下所示 foo C 标准
  • 我想使用 pyqt5 的拖放方法获取并显示图像

    我想使用 pyqt5 的拖放方法获取并显示图像 例如 像这张图片一样 我想制作拖放空间和图像显示空间 import sys from PyQt5 QtWidgets import QPushButton QWidget QLineEdit
  • CUDA 编译器 (nvcc) 宏

    是否有我可以使用的 CUDA 的 define 编译器 nvcc 宏 如 Windows 的 WIN32 等 我需要这个用于 nvcc 和 VC 编译器之间通用的头代码 我知道我可以继续定义我自己的并将其作为参数传递给 nvcc 编译器 D
  • C++:像使用数组一样使用 std::vector 是否安全?

    我需要有一个固定大小的元素数组 并调用它们需要了解它们如何放置在内存中的函数 特别是 功能类似于glVertexPointer 需要知道顶点在哪里 它们彼此之间有多远等等 在我的例子中 顶点将是要存储的元素的成员 要获取此数组中元素的索引
  • ggplot2:颜色随 y 轴值变化的条形图

    我有这个简单的代码 数据 条形图 dat lt c Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec val lt c 2 5 3 2 5 3 3 1 0 2 6 4 3 5 5 2 1 9 2
  • 使用 perl Archive::Zip 创建 *.epub -- epubchecker 错误

    我正在编写一个 perl 脚本 它将从给定的父文件夹中压缩一组文件并创建一个 epub 文件 该过程工作正常 我可以在 adobe 数字版本中打开 epub 但我收到 epubchecker 错误 Required MTA INF cont
  • 在.NET Core项目中引用外部DLL

    我有自己的 dll 文件 我曾经在 Nodejs 中与 Edge js 一起使用 我现在尝试将它与 dot net core 应用程序一起使用 但没有找到 没有如何访问它或定义它 有没有类似的东西 files MyLibrary dll o
  • 使用 FileOpenPicker 打开本地数据路径

    数据 我的文件 我想在我的 Hololens 应用程序中打开上面的数据路径 该路径位于我的应用程序文件夹 HoloApp Data myFiles 的本地 据我了解 执行此操作的主要方法是使用 FileOpenPickers 我读过API
  • 如何计算置信区间并将其绘制在条形图上

    我怎样才能绘制出一个条形图 data 1x10 cell 其中单元格中的每个值都有不同的尺寸 例如 3x100 3x40 66x2 等 我的目标是获得一个条形图 其中有 10 组条形图 每组中每个值有 3 个条形图 在条形图上 我希望它显示
  • 在 MATLAB 中使用 ROI

    我有一个 MATLAB 期末项目 需要帮助 我构建了一个 GUI 并使用显示图像imshow功能 现在我想要 从图像中选择区域并获取所选区域的像素 我知道 ROI 方法 但我不知道如何使用它 所以如果 有人可以向我解释一下 谢谢 如果您有图
  • 使用 grails-spring-security-rest 插件在 /api/login OPTIONS 请求上不允许使用 405 方法(战斗仍在继续......)

    在我的应用程序中 我使用 grails spring security rest 插件 目前正处于构建身份验证流程的阶段 如果我使用休息客户端 一切都会按预期工作 我可以通过在 json 中发布用户名和密码来登录并取回令牌 完美的 现在 我
  • 如何强制解压 Eclipse 插件?

    我的eclipse插件必须解压 如何强制安装程序解压它 如果直接把jar文件丢进jar包会解压吗plugins folder 可以在配置包括插件在内的功能时选择此选项 转到插件列表 选择您的插件并选中 安装后解压插件存档 可以说 这个属性应
  • 如果a和b只互相引用,GC会收集它们吗?

    如果a和b只互相引用 GC会收集它们吗 您能否帮忙解释一下原因或提供参考文档来解释该逻辑 非常感谢 是的 如果不存在更强烈的引用 它们将成为 GC 的候选者 需要注意的是 并非任何强引用都会在内存中保存对象 这些必须是从垃圾收集根链接的引用
  • 通过 Google Places API 解析地址

    我有一个巨大的 50k 数据库 其地址如下 12340 Via Moura San Diego CA United States 17029 Avenida Cordillera San Diego CA United States 332
  • Python:化学元素计数器

    我想获取给定混合物的元素 例如 对于空气 O2 和 N2 和己烷 C6H14 的混合物 字典给出了它们各自的摩尔数 mix O2 1 N2 3 76 C6H14 0 01 我想得到以下内容 O 2 N 7 52 C 0 06 H 0 14
  • 使用原子与氢。 Atom 的工作目录是当前文件位置的上一级文件夹。如何将其更改为当前文件夹?

    在 Hydrogen 和使用插件终端平台中 默认目录是我的代码文件所在位置的上一个文件夹 例如 我将处理一个带有路径的文件 比如说 parent code file py 当我跑步时pwd在插件的终端中或通过Python脚本中的Hydrog
  • rake db:struct:dump 在 PostgreSQL / Rails 3.2 下失败

    我收到此错误消息 pg dump too many command line arguments first is demo db Try pg dump help for more information rake aborted Err
  • 在基于 servlet 的应用程序中,配置资源文件应该放在哪里以及如何读取?

    在我的网络应用程序中 我必须向一组预定义用户发送电子邮件 例如 email protected cdn cgi l email protection 所以我想将其添加到 properties文件并在需要时访问它 这是正确的过程吗 如果是 那