在我的Web应用程序中,我需要向一组预定义的用户(如finance@xyz.example
)发送电子邮件,因此我希望将其添加到一个.properties
文件中,并在需要时访问它。如果是这样,请问我应该将此文件放在哪里?我正在使用具有源文件和JSP文件两个单独文件夹的Netbeans IDE。
在我的Web应用程序中,我需要向一组预定义的用户(如finance@xyz.example
)发送电子邮件,因此我希望将其添加到一个.properties
文件中,并在需要时访问它。如果是这样,请问我应该将此文件放在哪里?我正在使用具有源文件和JSP文件两个单独文件夹的Netbeans IDE。
这是你的选择。在Java web应用程序存档(WAR)中,基本上有三种方法:
这样你就可以通过ClassLoader#getResourceAsStream()
方法使用相对于类路径的路径进行加载:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
/WEB-INF/lib
和/WEB-INF/classes
、服务器的/lib
或JDK/JRE的/lib
之一,应该放置foo.properties
。如果属性文件是特定于Web应用程序的,则最好将其放置在/WEB-INF/classes
中。如果您正在使用IDE开发标准WAR项目,请将其放入src
文件夹(即项目的源文件夹)。如果您正在使用Maven项目,请将其放入/main/resources
文件夹。Tomcat/conf/catalina.properties
的shared.loader
属性。foo.properties
放置在像com.example
这样的Java包结构中,则需要按照以下方式加载它。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");
// ...
这样你就可以通过ServletContext#getResourceAsStream()
并使用相对于WebContent文件夹的路径来加载它:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
/WEB-INF
文件夹中,否则它将可以被任何Web浏览器公开访问。另请注意,ServletContext
在任何HttpServlet
类中只能通过继承的GenericServlet#getServletContext()
访问,在Filter
中可以通过FilterConfig#getServletContext()
访问。如果您不在servlet类中,则通常可以通过@Inject
注入。
这样,您就可以使用绝对本地磁盘文件系统路径以通常的java.io
方式加载它:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
注意使用绝对路径的重要性。相对于本地磁盘文件系统路径在Java EE Web应用程序中是绝对不可行的。另请参见下面第一个“参见”链接。
只需根据您自己对可维护性的优缺点进行权衡。
如果属性文件是“静态”的,不需要在运行时更改,则可以将其保留在WAR中。
如果您希望能够在Web应用程序之外编辑属性文件,而无需每次重新构建和部署WAR,则将其放在项目之外的类路径中(如果必要,请添加目录到类路径中)。
如果您希望能够在Web应用程序内部以编程方式编辑属性文件,使用Properties#store()
方法,请将其放在Web应用程序之外。由于Properties#store()
需要一个Writer
,因此不能使用磁盘文件系统路径。该路径可以作为VM参数或系统属性传递给Web应用程序。作为预防措施,永远不要使用getRealPath()
。重新部署时,部署文件夹中的所有更改都会丢失,因为这些更改没有反映在原始WAR文件中。
/etc/appconfs
);2)将该文件夹添加到应用服务器/域的类路径中。第二步是应用服务器特定的,我认为没有通用的示例。 - Tuukka MustonenWEB-INF/classes
文件夹中,并且您的IDE(例如Eclipse)进行了清除/重建操作,则会删除您的配置文件,除非它们位于Java源目录中。BalusC的答案在选项1中提到了这一点,但我想要强调一下。 WEB-INF / classes
文件夹中。在该项目中进行清理/重建(而不是Web应用程序项目)会导致相同的问题。WEB-INF/lib
文件夹中,因此这没有意义。计划在忙完后将其放入Web项目的“src”文件夹中进行测试,但是该文件夹目前为空,因此在其中放置配置文件似乎不太优雅。WEB-INF/commonConfFolder/filename.properties
中,即类文件夹旁边,这是Balus选项2。例如,在web.xml文件中标签
<context-param>
<param-name>chatpropertyfile</param-name>
<!-- Name of the chat properties file. It contains the name and description of rooms.-->
<param-value>chat.properties</param-value>
</context-param>
Jsp = Discussion about JSP can be made here.
Java = Talk about java and related technologies like J2EE.
ASP = Discuss about Active Server Pages related technologies like VBScript and JScript etc.
Web_Designing = Any discussion related to HTML, JavaScript, DHTML etc.
StartUp = Startup chat room. Chatter is added to this after he logs in.
chat.properties
文件应该放在哪里呢? - LetsGoBrandon只需要将它放在类路径下(也就是确保它在构建过程中作为一部分以 /WEB-INF/classes 结尾的 .war 文件出现)即可。