【问题标题】:How to load a .properties file into a jsp如何将 .properties 文件加载到 jsp 中
【发布时间】:2009-07-16 22:26:13
【问题描述】:

我已经做到了:

private Properties logoUrls = new Properties();
logoUrls.load(new FileInputStream("channelLogos.properties"));

channelLogos.properties 与我的 JSP 位于同一目录中。我得到一个 FileNotFound 异常。如果不是与 JSP 相同的目录,我的应用程序实际上认为我所说的“channelLogos.properties”在哪里?如何确定加载属性文件的正确路径?

【问题讨论】:

标签: java jsp servlets


【解决方案1】:

这样就可以了:

<%@page import="java.io.InputStream" %>
<%@page import="java.util.Properties" %>

<%
    InputStream stream = application.getResourceAsStream("/some.properties");
    Properties props = new Properties();
    props.load(stream);
%>

无论如何,我真的认为你应该在 classpath 中有属性文件并使用 servlet

【讨论】:

  • 是的,这是正确的做法。诚然,我这样做是快速、丑陋、肮脏、糟糕的方式。
  • 是的,我知道,呵呵...我刚刚回答了你的问题;)
  • 仅供参考,有一个 application.getResourceAsStream("...") 可以为您节省几行代码。
【解决方案2】:

我想强烈推荐阅读有关Model 2 Servlets 的内容。我向所有仍在使用 Model 1 Servlets 的人推荐它,也就是说,在 JSP 中做“真正的工作”。

关于您的问题:首先,将属性文件放入类路径中,然后使用 getResourceAsSttream 读取文件:

Thread.currentThread().getContextClassLoader().getResourceAsStream("channelLogos.properties");

当然有很多选择,每个人都会有自己喜欢的。

【讨论】:

  • 我完全同意在 jsp 规则中不做真正的事情,但我在这个案例中打破了它。
  • @morgancodes:我完全同意不时打破自己的规则。 ;)
【解决方案3】:

当您说“与 JSP 相同的目录”时,您的具体意思是什么?您的 JSP 位于某个位置,例如,/mywebapp/somefolder/my.jspmywebapp 是您的应用程序根,而您的属性文件是 /mywebapp/somefolder/channelLogos.properties

如果是这样,那么很可能它们不在同一个目录中。 JSP 已经编译,它的实际位置可能因 servlet 容器而异。您最好的选择是使用 pkaeding 建议的ServletContext.getRealPath(),并将相对于 webapp 上下文的属性文件路径作为参数。使用上面的例子:

private Properties logoUrls = new Properties();
logoUrls.load(new FileInputStream(servletContext.getRealPath("/somefolder/channelLogos.properties")));

也就是说,请记住,如果您坚持将您的属性与 JSP 放在同一个文件夹中,您应该注意限制它被公开访问(除非这是故意的)。

【讨论】:

  • 谢谢。这行得通。但是,我计划在 jspInit 中完成所有这些工作,它无法轻松访问 servletContext。也许类路径方法确实是最好的。
  • getServletConfig().getServletContext() 将从jspInit 方法中获取servletContext。也就是说,类路径方法完全更好,而 MVC 更好:-) 我只提供了这个答案,因为你坚持要单独在 JSP 中完成。
【解决方案4】:

看看ServletContext.getRealPath()。这应该会为您提供属性文件的完整路径。

【讨论】:

  • 很高兴知道这一点。谢谢!使用该技术,它向我表明我的路径似乎对我的属性文件是正确的,但我仍然得到一个文件未发现异常。有什么想法吗?
【解决方案5】:

JSP 运行在 servlet 容器中,所以它的当前工作目录是由容器定义的。通常它是容器的安装目录或其 bin 目录。在任何情况下,它都不是您要存储自定义属性文件的地方。

有两种典型的方法可以满足您的需要。

如果您的文件是应用程序的一部分并且您在部署时从不更改它,则第一种方法很好。在这种情况下,从资源中读取它:

props.load(getClass().getResourceAsStream())

甚至更好

props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream())

*

如果您想更改属性文件,第二种方法很好 关于部署环境

*。在这种情况下,将它放在容器外的文件系统中的某个位置。例如 Linux 上的 /opt/mycompany/conf/myproperties.properties 或您喜欢的任何其他位置。现在您应该在创建 FileInputStream 时使用绝对路径。

为了使系统更好地可配置,您不应该在代码中写入配置文件的路径。更好的方法是使用系统属性将其传递给应用程序,例如在运行应用程序服务器时添加 -Dmycompany.conf=/opt/mycompany/myprops.properties 等参数。当您要读取文件时,请执行以下操作:

新的 FileInputStream(System.getProperties("mycompany.conf"))

现在您的系统配置可以由部署者独立控制。

【讨论】:

    【解决方案6】:

    在属性文件中,属性如下:

         label.esme.interface.dependenciesDelete = "Dependencies present. Cannot delete."
    

    如果您使用的是 Struts 框架,它可以出现在 struts-config.xml 中,例如:

        <message-resources parameter="pathToApplcnRsrc"/>
    

    或struts.properties,如:

        struts.custom.i18n.resources = ApplicationResource
    

    在 JSP 中使用如下属性文件中的属性:

        '<s:text name="label.esme.interface.dependenciesDelete" />'
    

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2019-03-14
      • 2011-12-01
      • 1970-01-01
      • 2013-06-22
      • 2017-08-22
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多