当前位置: 首页 > 面试题库 >

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

巢安澜
2023-03-14
问题内容

我有一个servlet,它读取init()上的.properties文件。如果我在web.xml中设置了上下文参数,则我的代码(下面的代码)不起作用,但是我读到上下文参数是全局可访问的,我不希望这样,因为此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();
    }
}

但我一直在获取文件未找到异常。我已经搜索了Internet,但是大多数人都使用servlet上下文。在不将context-
param标记包含在web.xml中的情况下,我还能如何加载我的属性文件?

谢谢!

编辑:

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)

问题答案:

鉴于fileName/WEB-INF/classes/myapp.properties,您需要将其作为Web应用程序资源而不是作为本地磁盘文件系统文件来获取。

因此,请更换

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

一种更简单的方法是将设置fileNamemyapp.properties并将其作为类路径资源获取。

String fileName = config.getInitParameter("configFile");
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
p = new Properties();
p.load(input);


 类似资料:
  • 问题内容: 在SpringMVC应用程序中,有没有一种方法可以使用web.xml加载上下文? 问题答案: Spring可以轻松集成到任何基于Java的Web框架中。你需要做的就是在中声明并使用 设置要加载的上下文文件。 然后,你可以使用WebApplicationContext来获取bean的句柄。

  • 问题内容: 根据caniuse,MicrosoftEdge版本10547+支持element的属性,但IE或Safari不支持。 如何在不使用具有属性集的元素或服务器的情况下下载文件对象? 问题答案: 有多种触发下载的方法。以下是一些: 使用表格: 使用javascript:

  • 我知道这可以在Servlet3.0中通过@Webservlet注释实现,在这里您只需分配url模式,而不必在web.xml中进行任何配置。是否有一种方法可以通过编程方式为运行Servlet2.5的应用程序分配servlets url模式? 我正在创建一个库,多个应用程序将依赖于它,并试图使它,以便这些应用程序中的每一个都不必显式配置任何servlet url映射,我正在创建的库中的servlet在

  • 问题内容: 我希望能够以不同于web.xml的方式修改/配置过滤器。这是2个过滤器的静态配置。我希望能够静态配置一个过滤器,并允许该过滤器加载其他过滤器。我只是想知道是否有人知道lib已有此功能。 使用Servlet API 2.5 我已经在Guice的GuiceFilter中完成了此操作,其中在运行时配置了过滤器。 问题答案: 只需执行与容器已完成的相同的工作即可。即,按照servlet过滤器所

  • 我正在尝试将一些遗留的(基于Struts2)web应用程序从Jboss迁移到Open-Liberty服务器,我想知道是否有一种方法可以从web.xml外部化上下文参数(或过滤器init-params)的值,就像在server.xml中使用${}语法或使用eclipse Microprofile的mpConfig特性一样。在最初的项目中,param值是在构建时使用占位符替换注入web.xml中的,但

  • 问题内容: 我有以下用于测试的类: 为了进行测试,我想通过一次SaveChanges调用插入一家公司和该公司的一名员工,如下所示: 即使我没有使用导航属性,而是通过Id建立了联系,但这种方式还是神秘地起作用了- 员工用正确的外键保存了公司的外键,该公司的外键从0更新为实际值,这使我走了出去!一些隐藏的C#功能? 然后,我决定添加更多代码,上面的代码段中对此进行了注释,使其插入了2个Company实