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

7gyucuyw  于 2021-07-06  发布在  Java
关注(0)|答案(6)|浏览(302)

在我的web应用程序中,我必须向一组预定义的用户发送电子邮件,比如 finance@xyz.com ,所以我想把它加到 .properties 文件,并在需要时访问它。这是一个正确的程序,如果是这样,那么我应该把这个文件放在哪里?我使用的是netbeanside,它有两个单独的源文件和jsp文件文件夹。

2admgd59

2admgd591#

它只需要在类路径中(也就是说,确保它作为构建的一部分在.war中的/webinf/classes下结束)。

fslejnso

fslejnso2#

警告:如果你把配置文件放在 WEB-INF/classes 文件夹,并且您的ide(比如eclipse)执行清理/重建,它将删除conf文件,除非它们位于java源目录中。balusc的回答在选项1中暗示了这一点,但我想强调一下。
我很难理解,如果你在eclipse中“复制”一个web项目,它会从任何源文件夹进行清理/重建。在我的例子中,我从pojojava库中添加了一个“linkedsourcedir”,它将编译到 WEB-INF/classes 文件夹。在该项目(不是web应用程序项目)中执行清理/重建会导致相同的问题。
我想把我的conf放在pojo src文件夹中,但是这些conf都是为第三方lib(比如quartz或urlrewrite)准备的,它们在 WEB-INF/lib 文件夹,所以这没有意义。我计划在开始使用它时将它放在webprojects“src”文件夹中进行测试,但该文件夹当前是空的,并且其中包含conf文件似乎不太美观。
所以我投票赞成把conf文件放进去 WEB-INF/commonConfFolder/filename.properties ,位于classes文件夹旁边,即balus选项2。

l7wslrjt

l7wslrjt3#

您可以使用源文件夹创建这些文件,因此无论何时生成,这些文件都会自动复制到classes目录。
不要使用属性文件,而是使用xml文件。
如果数据太小,甚至可以使用web.xml访问属性。
请注意,这些方法中的任何一种都需要重新启动app server才能反映出更改。

2sbarzqh

2sbarzqh4#

例如:在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>

和chat.properties您可以这样声明您的属性
例如:

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.
oalqel3c

oalqel3c5#

假设您的代码正在查找文件app.properties。通过在tomcat的bin dir中创建setenv.sh,将这个文件复制到任意dir并将这个dir添加到classpath。
在tomcat的setenv.sh中(如果此文件不存在,请创建一个,tomcat将加载此setenv.sh文件)。 #!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/" 属性文件不应位于./webapps//web inf/classes/app.properties中
tomcat类加载器将用来自web inf/classes的加载器重写/
一本好书:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

iswrvxsc

iswrvxsc6#

这是你的选择。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 . 如果propertiesfile是特定于webapp的,最好是将其放置在 /WEB-INF/classes . 如果您正在ide中开发一个标准的war项目,请把它放进去 src 文件夹(项目的源文件夹)。如果您使用的是maven项目,请将其放入 /main/resources 文件夹。
也可以将其放置在默认类路径之外的某个位置,并将其路径添加到appserver的类路径中。例如,在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内部,那么它是不可见的。上下文类加载器是您最安全的选择,因此您可以将属性文件“随处可见”放置在类路径中,和/或您希望能够覆盖上webapp提供的服务器。

2. 把它放到网络内容里

这样你就可以通过 ServletContext#getResourceAsStream() 具有webcontent相对路径:

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

注意,我已经演示了如何将文件放入 /WEB-INF 文件夹,否则任何webbrowser都可以访问它。还要注意的是 ServletContext 在任何地方 HttpServlet 类只能由继承的 GenericServlet#getServletContext() 而且在 FilterFilterConfig#getServletContext() . 如果您不在servlet类中,它通常只是通过 @Inject .

3. 把它放在本地磁盘文件系统中

这样你就可以正常加载了 java.io 绝对本地磁盘文件系统路径:

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

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

选择哪一个?

在你自己的可维护性观点中权衡一下优点/缺点。
如果属性文件是“静态”的,并且在运行时不需要更改,那么您可以将它们保留在war中。
如果您希望能够从web应用程序外部编辑属性文件,而无需每次都重新生成和重新部署war,则将其放在项目外部的类路径中(如有必要,将目录添加到类路径中)。
如果您希望能够使用从web应用程序内部以编程方式编辑属性文件 Properties#store() 方法,将其放在web应用程序之外。作为 Properties#store() 需要 Writer ,不能使用磁盘文件系统路径。该路径又可以作为vm参数或系统属性传递给web应用程序。作为预防措施,切勿使用 getRealPath() . 重新部署时,deploy文件夹中的所有更改都将丢失,原因很简单,这些更改不会反映回原始war文件中。

另请参见:

getresourceasstream()与fileinputstream
向tomcat类路径添加目录
以编程方式访问jsf应用程序中的属性文件

相关问题