我有一个servlet,它在init()上读入.properties文件。我的代码(不是下面的代码)可以工作,如果我在我的web.xml中设置了一个context-parameter,但我读到一个context-parameter是全局可访问的,我不希望这个,因为这个servlet只是一个更大的一块Web应用程序。我只想使用init-param标签来做到这一点 我试过这个:
public void init(ServletConfig config) throws ServletException {
try {
String fileName = config.getInitParameter("configFile");
System.out.println(fileName);
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
p = new Properties();
p.load(fis);
} catch (IOException e) {
e.printStackTrace();
}
}
但我一直得到文件未找到异常。我搜索过互联网,但大多数人都使用servlet上下文。如何在不在web.xml中包含context-param标记的情况下加载我的属性文件?
谢谢!
编辑:
java.io.FileNotFoundException: C:\WEB-INF\classes\myapp.properties (The system cannot find the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:120)
at java.io.FileInputStream.<init>(FileInputStream.java:79)
at ipadService.ProxyServlet.init(ProxyServlet.java:53)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1206)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
答案 0 :(得分:12)
鉴于fileName
是/WEB-INF/classes/myapp.properties
,您需要将其作为webapp资源,而不是本地磁盘文件系统文件。
所以,替换
String fileName = config.getInitParameter("configFile");
System.out.println(fileName);
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
p = new Properties();
p.load(fis);
通过
String fileName = config.getInitParameter("configFile");
InputStream input = config.getServletContext().getResourceAsStream(fileName);
p = new Properties();
p.load(input);
更简单的方法是将fileName
设置为myapp.properties
并将其作为类路径资源。
String fileName = config.getInitParameter("configFile");
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
p = new Properties();
p.load(input);
答案 1 :(得分:0)
问题不在于init参数设置。问题是您如何访问该文件。确保您的类路径中有配置文件,例如在Web-Inf目录下;然后将代码更改为访问文件,如
InputStream is = getClass().getResourceAsStream(fileName);
p = new Properties();
p.load(is);
答案 2 :(得分:0)
我不知道你如何设置你的web.xml,它应该没问题:
<servlet>
<servlet-name>MyServletName</servlet-name>
<servlet-class>com.mycompany.MyServlet</servlet-class>
<init-param>
<param-name> param1 </param-name>
<param-value> value1 </param-value>
</init-param>
<init-param>
<param-name> param2 </param-name>
<param-value> value2 </param-value>
</init-param>
...
</servlet>
和你的代码一样,你没有使用绝对路径,因此这个文件可以在classes目录中找到,你应该确保这个文件存在于WEB-INF / classes目录中。
答案 3 :(得分:-1)
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
@WebServlet("/Propertyloader")
public class Propertyloader extends HttpServlet
{
private static final long serialVersionUID = 1L;
public static Logger logger;
public static Properties props=new Properties();
public Propertyloader()
{
super();
}
public void init(ServletConfig sconfig)
{
try
{
logger = Logger.getLogger(Propertyloader.class.getName());
props.load(Propertyloader.class.getClassLoader().getResourceAsStream("books.properties"));
}