Java getResourceAsStream使用servletContext()返回null

Java getResourceAsStream使用servletContext()返回null,java,file,servlets,Java,File,Servlets,这是一个servlet,它读取.pdf并将其作为响应发送。我不明白为什么它不起作用 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/pdf"); ServletContext sc = this.getSe

这是一个servlet,它读取.pdf并将其作为响应发送。我不明白为什么它不起作用

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/pdf");
        ServletContext sc = this.getServletContext();
        String path = sc.getRealPath("/WEB-INF/pdf/order.pdf");
        System.out.print(path);// this prints correct path
        InputStream is = null;
        try{
            is = sc.getResourceAsStream(path); // this is not working
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.print(is);// it is null
        int read = 0;
        byte[] bytes = new byte[2048];
        OutputStream os = response.getOutputStream();

        try{
        while((read = is.read(bytes))!= -1){  //exception is thrown here
            os.write(bytes,0,read);
        }
        }catch(Exception e){
            e.printStackTrace();
        }
        os.flush();
        os.close();
      }
有人能解释为什么它不起作用吗?我使用这个.getServletContext().getRealPath(“/WEB-INF/pdf/demo.pdf”)

以下是堆栈跟踪:

2/21/13 14:24:21:322 IST] 00000033 SystemErr     R java.lang.NullPointerException
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at com.tgmc.servlets.DisplayOrder_PDF_Servlet.doGet(DisplayOrder_PDF_Servlet.java:42)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1449)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:790)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:443)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:175)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3610)
[2/21/13 14:24:21:323 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:274)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:926)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1557)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:173)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:455)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:384)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:288)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1016)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyReadCompletedCallback.complete(SSLConnectionLink.java:639)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1772)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
[2/21/13 14:24:21:324 IST] 00000033 SystemErr     R     at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
[2/21/13 14:24:21:325 IST] 00000033 SystemErr     R     at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
[2/21/13 14:24:21:325 IST] 00000033 SystemErr     R     at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
[2/21/13 14:24:21:325 IST] 00000033 SystemErr     R     at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:202)
[2/21/13 14:24:21:325 IST] 00000033 SystemErr     R     at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:766)
[2/21/13 14:24:21:325 IST] 00000033 SystemErr     R     at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:896)
[2/21/13 14:24:21:325 IST] 00000033 SystemErr     R     at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1527)

您是否尝试过sc.getResourceAsStream(“/WEB-INF/pdf/order.pdf”)

它是否位于src/main/resources/WEB-INF/pdf下?文件名为.pdf而不是.pdf

编辑:我在家里试过这个,它对我有效

    try{
        is = sc.getResourceAsStream("/WEB-INF/pdf/order.pdf"); // this works!
    }catch(Exception e){
        e.printStackTrace();
    }
注意:如果您有一个标准版本,order.pdf应该位于src/main/webapp/WEB-INF/pdf文件夹中

(而不是src/main/resources…)


Vishal,你能用我上面的代码检查一下文件夹结构吗?

你试过sc.getResourceAsStream(“/WEB-INF/pdf/order.pdf”)吗

它是否位于src/main/resources/WEB-INF/pdf下?文件名为.pdf而不是.pdf

编辑:我在家里试过这个,它对我有效

    try{
        is = sc.getResourceAsStream("/WEB-INF/pdf/order.pdf"); // this works!
    }catch(Exception e){
        e.printStackTrace();
    }
注意:如果您有一个标准版本,order.pdf应该位于src/main/webapp/WEB-INF/pdf文件夹中

(而不是src/main/resources…)


Vishal,你能用我上面的代码检查一下文件夹结构吗?

在ServletContext上调用GetResourceAsStream()时,我也遇到了NullPointerException,并且已经修复,所以我在这里为遇到同样问题的人发帖子。根据 ,方法getRealPath()将返回服务器文件系统上的实际路径,因此调用
sc.getRealPath(“/WEB-INF/pdf/order.pdf”)
,因为上面的代码可能会返回
/opt/apache tomcat/wtpwebap‌​ps/itext/WEB-INF/pdf/order.pdf
假设/opt/apache tomcat/是您的tomcat在服务器上的位置。该文档还提到,对于getResourceAsStream()方法,我们应该传入servlet上下文根的相对路径,以/。因此,对于上面的代码,您应该向getResourceAsStream()方法传递
/WEB-INF/pdf/order.pdf
插入真正的路径


在ServletContext上调用GetResourceAsStream()时,我也遇到了NullPointerException,并且已经修复,因此我在这里为遇到相同问题的人发布了文章。根据 ,方法getRealPath()将返回服务器文件系统上的实际路径,因此调用
sc.getRealPath(“/WEB-INF/pdf/order.pdf”)
,因为上面的代码可能会返回
/opt/apache tomcat/wtpwebap‌​ps/itext/WEB-INF/pdf/order.pdf
假设/opt/apache tomcat/是您的tomcat在服务器上的位置。该文档还提到,对于getResourceAsStream()方法,我们应该传入servlet上下文根的相对路径,以/。因此,对于上面的代码,您应该向getResourceAsStream()方法传递
/WEB-INF/pdf/order.pdf
插入真正的路径



您的WAR文件是否已展开?sc.getRealPath(“/WEB-INF/pdf/order.pdf”);只有当您的WAR文件已展开时,此选项才起作用显示您的stacktrace,您得到的异常是什么?@dj aqeel:NullPointerException@pradeep辛哈:你说的战争文件扩展是什么意思???@VishalAnand,它指的是一组文件而不是一个战争文件。你的战争文件扩展了吗?sc.getRealPath(“/WEB-INF/pdf/order.pdf”);只有当您的WAR文件已展开时,此选项才起作用显示您的stacktrace,您得到的异常是什么?@dj aqeel:NullPointerException@pradeep辛哈:你说的战争文件扩展是什么意思???@VishalAnand,它指的是一组文件而不是一个战争文件。Vishal,如果没有其他人回答,我今晚回家后可以试试你的代码。。。大约6小时后:)这是为我返回的路径值,作为文件的真实路径:Y:\eclipse\U projects\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\itext\WEB-INF\pdf\order.pdf。你知道为什么吗?我也试过你的代码,效果很好,但据我所知,WEB-INF目录中的文件不能用这种方式访问,对吗?它们受到保护,应该通过realPath()方法访问。如果我错了,请纠正我。谢谢你的支持:)不用担心,维沙。使用实路径将程序暴露于web容器(在本例中为Tomcat)的底层工作,这通常是不好的。另外,您甚至不知道您的pdf是否已经从WAR解压到文件系统。出于这个原因,最好使用
ServletContext.getResourceAsStream
之类的工具来访问战争中的资源,或者使用
ClassLoader.getResourceAsStream
来访问JAR中的资源。我也遇到了类似的问题,尽管它只在应用程序长时间闲置(如夜间)后才会出现。尚未找到解决方案,但将尝试request.getServletContext,而不是“this”中的解决方案。写在这里,以防我忘记回来报告成功/失败Vishal,如果没有其他人回答,我今晚回家后可以试用你的代码。。。大约6小时后:)这是为我返回的路径值,作为文件的真实路径:Y:\eclipse\U projects\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\itext\WEB-INF\pdf\order.pdf。你知道为什么吗?我也试过你的代码,效果很好,但据我所知,WEB-INF目录中的文件不能用这种方式访问,对吗?它们受到保护,应该通过realPath()方法访问。如果我错了,请纠正我。谢谢你的支持:)不用担心,维沙。使用实路径将程序暴露于web容器(在本例中为Tomcat)的底层工作,这通常是不好的。另外,您甚至不知道您的pdf是否已经从WAR解压到文件系统。出于这个原因,最好使用
ServletContext.getResourceAsStream
之类的东西来访问战争中的资源,或者使用
ClassLoader.getResourceAsStream
来访问JAR中的资源