java getResourceAsStream使用servletContext()返回null
这是一个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)
# 1 楼答案
在ServletContext上调用GetResourceAsStream()时,我也遇到了NullPointerException,并且已经修复,因此我在这里为遇到相同问题的人发布了文章。根据 http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html,方法getRealPath()将返回服务器文件系统上的实际路径,因此,假设/opt/apache tomcat/是您的tomcat在服务器上的位置,那么调用上面的代码
sc.getRealPath("/WEB-INF/pdf/order.pdf")
可能会返回/opt/apache-tomcat/wtpwebapps/itext/WEB-INF/pdf/order.pdf
。该文档还提到,对于getResourceAsStream()方法,我们应该传入servlet上下文根的相对路径,以/。因此,对于上面的代码,您应该将/WEB-INF/pdf/order.pdf
insead的实路径传递给getResourceAsStream()方法# 2 楼答案
您是否尝试过sc.getResourceAsStream(“/WEB-INF/pdf/order.pdf”)
它是否位于src/main/resources/WEB-INF/pdf下?文件名为。pdf和非pdf格式。PDF
编辑:我在家里试过这个,它对我有效
注意:给你一个标准的版本,订单。pdf应位于src/main/webapp/WEB-INF/pdf文件夹中
(而不是src/main/resources…)
Vishal,你能用我上面的代码检查一下文件夹结构吗