Java ServletContext#getResource()将WEB-INF中的JPEG文件返回为null

Java ServletContext#getResource()将WEB-INF中的JPEG文件返回为null,java,servlets,Java,Servlets,你好 我正在尝试将web应用程序中包含的JPG文件输出到 使用以下代码的用户: public class JpegOutput extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { byte bufferArray[] =

你好

我正在尝试将web应用程序中包含的JPG文件输出到 使用以下代码的用户:

public class JpegOutput extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        byte bufferArray[] = new byte[1024];
        ServletContext ctxt = getServletContext();

        response.setContentType("image/jpeg");
        ServletOutputStream os = response.getOutputStream();
        InputStream is = ctxt.getResource("/WEB-INF/image/image1.jpg").openStream();
        int read = is.read(bufferArray);
        while (read != 1) {
            os.write(bufferArray);
            read = is.read(bufferArray);
        }
        is.close();
        os.close();
    }
}
但出现了一个错误:

HTTP Status 500 -
exception java.lang.NullPointerException
我不确定它是否无法读取源图像或其他内容。无论如何,我把图像放在这个文件夹/WEB-INF/image/image1.jpg中

我做错了什么?我如何解决这个问题

编辑:我通过重命名文件名解决了这个问题。。。文件名区分大小写,而不是
image1.jpg,
它应该是
image1.jpg


谢谢。

您可以使用
getServletContext().getRealPath(“/”
获取
/WEB-INF/
的路径。例如

String path = getServletContext().getRealPath("/") + "WEB-INF/image/image1.jpg";
InputStream is = new FileInputStream(path);

虽然不确定这是否是NPE的原因。您可以检查日志文件并发布堆栈跟踪吗?

您可以使用
getServletContext().getRealPath(“/”
来获取
/WEB-INF/
的路径。例如

String path = getServletContext().getRealPath("/") + "WEB-INF/image/image1.jpg";
InputStream is = new FileInputStream(path);

虽然不确定这是否是NPE的原因。您能检查日志文件并发布stacktrace吗?

不确定是否有错误,但我认为最好转发请求,而不是手动提供图像:

public class JpegOutput extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/image/image1.jpg")
            .forward(request, response);
    }
}
还要注意,您的内容服务循环不正确,正确的循环如下所示:

while ((read = is.read(bufferArray)) != -1)
    os.write(bufferArray, 0, read);

不确定是否有错误,但我认为最好转发请求,而不是手动提供图像:

public class JpegOutput extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/image/image1.jpg")
            .forward(request, response);
    }
}
还要注意,您的内容服务循环不正确,正确的循环如下所示:

while ((read = is.read(bufferArray)) != -1)
    os.write(bufferArray, 0, read);

这张图片不在公共网络内容中有什么原因吗?那么你就不需要servlet了。如果你想有一天成为一名优秀的程序员(如你的个人资料中所述),你真的必须回答上面的评论:)这段代码闻起来太多了。@BalusC我只是在研究可能性。我不打算那样使用它。我只是个初学者。。我在一本书中读过它,所以我试着做代码。:)这张图片不在公共网络内容中有什么原因吗?那么你就不需要servlet了。如果你想有一天成为一名优秀的程序员(如你的个人资料中所述),你真的必须回答上面的评论:)这段代码闻起来太多了。@BalusC我只是在研究可能性。我不打算那样使用它。我只是个初学者。。我在一本书中读过它,所以我试着做代码。:)
ServletContext.getResource()
不适用于类路径,其用法正确。True,我的错误,将其与Class.getResource()混合使用。
ServletContext.getResource()
不适用于类路径,其用法正确。True,我的错误,将其与Class.getResource()混合使用。