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

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

但我一直得到文件未找到exception。 我搜索过互联网,但大多数人都使用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.(FileInputStream.java:120) at java.io.FileInputStream.(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) 

鉴于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); 

也可以看看:

  • getResourceAsStream()vs FileInputStream
  • 在基于servlet的应用程序中放置位置以及如何读取配置资源文件?

问题不在于init参数设置。 问题是您如何访问该文件。 确保在类路径中有一个配置文件,例如在Web-Inf目录下; 然后更改您的代码以访问文件

 InputStream is = getClass().getResourceAsStream(fileName); p = new Properties(); p.load(is); 

我不知道你如何设置你的web.xml,它应该没问题:

  MyServletName com.mycompany.MyServlet   param1   value1     param2   value2   ...  

并且在你的代码中,你没有使用绝对路径,所以这个文件将在classes目录中找到,你应该确保这个文件存在于WEB-INF / classes目录中。

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