在servlet的init()中加载属性文件,而不使用web.xml中的context-param标记

时间:2012-03-27 15:18:45

标签: java servlets

我有一个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)

4 个答案:

答案 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"));
}