我已经达到了这个目标:
private Properties logoUrls = new Properties();
logoUrls.load(new FileInputStream("channelLogos.properties"));
其中channelLogos.properties与我的JSP位于同一目录中。我得到一个FileNotFound异常。我的应用程序实际上认为我的意思是“channelLogos.properties”,如果不是与JSP相同的目录?如何确定加载属性文件的正确路径?
答案 0 :(得分:10)
这将完成这项工作:
<%@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
答案 1 :(得分:6)
我想高度推荐阅读Model 2 Servlets。我向那些仍在使用Model 1 Servlet的人推荐它,也就是说,在JSP中做“真正的工作”。
关于你的问题:首先,在属性路径中抛出属性文件,然后使用getResourceAsSttream读取文件:
Thread.currentThread().getContextClassLoader().getResourceAsStream("channelLogos.properties");
当然,有很多选择,每个人都会有自己喜欢的选择。
答案 2 :(得分:4)
当你说“与JSP相同的目录”时,你到底是什么意思?您的JSP位于某个位置,例如/mywebapp/somefolder/my.jsp
,mywebapp
是您的应用程序根目录,您的属性文件是/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相同的文件夹中,您应该注意限制它不能公开访问(除非是这样)。
答案 3 :(得分:3)
看看ServletContext.getRealPath()。这应该为您提供属性文件的完整路径。
答案 4 :(得分:0)
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”))
现在,系统的配置可以由部署者独立控制。
答案 5 :(得分:0)
在属性文件中,属性列出如下:
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" />'