Java 如何使用响应中包含图像的Servlet显示JSP页面?

Java 如何使用响应中包含图像的Servlet显示JSP页面?,java,image,jsp,servlets,Java,Image,Jsp,Servlets,Servlet doGet()代码,用于从数据库中获取图像并在响应中存储图像 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Get userid from session try { // Get photos from database in (image) // Init

Servlet doGet()代码,用于从数据库中获取图像并在响应中存储图像

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

// Get userid from session

try {

    // Get photos from database in (image)

    // Init servlet response.
    response.reset();
    response.setBufferSize(DEFAULT_BUFFER_SIZE);
    response.setContentType(image.getContenttype());
    response.setHeader("Content-Length", String.valueOf(image.getLength()));
    response.setHeader("Content-Disposition", "inline; filename=\"" + image.getTitle()
    + "\"");

    // Prepare streams.
    BufferedInputStream input = null;
    BufferedOutputStream output = null;

    try {
        // Open streams.
        input = new BufferedInputStream(image.getPhoto(), DEFAULT_BUFFER_SIZE);
        output = new BufferedOutputStream(response.getOutputStream(),
                 DEFAULT_BUFFER_SIZE);

        // Write file contents to response.
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
    } finally {
        // Gently close streams.
        output.close();
        input.close();
    }

    //Redirect it to photo page
    RequestDispatcher rd = request.getRequestDispatcher
        ("/webplugin/jsp/profile/photos.jsp");
    rd.forward(request, response);

} catch (Exception e) {
    e.printStackTrace();
}

}
但是,当这个servlet显示JSP页面时,它只显示图像,而不显示JSP页面

JSP代码:

... JSP code

<img src="Servlet url">

... JSP code cont...
如何在JSP中获取图像,而不只是在浏览器中获取图像

在浏览器地址栏中输入包含
元素的JSP文件的URL


如何避免上述例外

从servlet代码中删除以下行

//Redirect it to profile page
RequestDispatcher rd = request.getRequestDispatcher
    ("/webplugin/jsp/profile/photos.jsp");
rd.forward(request, response);
servlet应该只返回图像。没别的了。下载和显示图像的应该是网络浏览器本身,而不是网络服务器

另见:
如何在JSP中获取图像,而不只是在浏览器中获取图像

在浏览器地址栏中输入包含
元素的JSP文件的URL


如何避免上述例外

从servlet代码中删除以下行

//Redirect it to profile page
RequestDispatcher rd = request.getRequestDispatcher
    ("/webplugin/jsp/profile/photos.jsp");
rd.forward(request, response);
servlet应该只返回图像。没别的了。下载和显示图像的应该是网络浏览器本身,而不是网络服务器

另见:

1您正在修改响应,然后转发,这是没有用的。不要这样做


21您正在修改响应,然后转发,这是没有用的。不要这样做


2

我已经删除了RequestDispatcher,异常也消失了,它工作正常。但是,JSP中应该包含的图像在您建议的更改后显示为原来的样子。我感到困惑。现在到底是什么问题?您的评论中的“但是”意味着它没有如您所期望的那样工作,但是您也提到它工作正常,图像显示原样。此外,我的web.xml看起来与上面一样,我也使用了
,但它仍然只在浏览器中显示图像,而在JSP中不显示图像。那么URL就是完全错误的。假设您的JSP确实在
http://localhost:8080/contextname/webplugin/jsp/profile/photos.jsp
,那么这个
img src
将基本上指向
http://localhost:8080/contextname/webplugin/jsp/profile/Photos
,但servlet实际上监听
http://localhost:8080/contextname/Photos
。至于如何解决这个问题,请重新阅读我在上一个问题中给出的答案是的,您需要在URL前面加上
${pageContext.request.contextPath}
。好的。希望你现在也能很好地理解现在到底发生了什么。浏览器请求JSP。服务器执行JSP,JSP反过来生成并向响应发送一组HTML。浏览器检索这组HTML代码(正如您在浏览器中右键单击页面并查看源代码时所看到的)。浏览器解析HTML以显示它,遇到一个
,并发送一个新的请求。最后,浏览器显示图像。使用HTTP流量检查器(如在Net选项卡中)应该会显示所有这些请求(和响应)。我已经删除了RequestDispatcher,异常消失,它工作正常。但是,JSP中应该包含的图像在您建议的更改后显示为原来的样子。我感到困惑。现在到底是什么问题?您的评论中的“但是”意味着它没有如您所期望的那样工作,但是您也提到它工作正常,图像显示原样。此外,我的web.xml看起来与上面一样,我也使用了
,但它仍然只在浏览器中显示图像,而在JSP中不显示图像。那么URL就是完全错误的。假设您的JSP确实在
http://localhost:8080/contextname/webplugin/jsp/profile/photos.jsp
,那么这个
img src
将基本上指向
http://localhost:8080/contextname/webplugin/jsp/profile/Photos
,但servlet实际上监听
http://localhost:8080/contextname/Photos
。至于如何解决这个问题,请重新阅读我在上一个问题中给出的答案是的,您需要在URL前面加上
${pageContext.request.contextPath}
。好的。希望你现在也能很好地理解现在到底发生了什么。浏览器请求JSP。服务器执行JSP,JSP反过来生成并向响应发送一组HTML。浏览器检索这组HTML代码(正如您在浏览器中右键单击页面并查看源代码时所看到的)。浏览器解析HTML以显示它,遇到一个
,并发送一个新的请求。最后,浏览器显示图像。使用HTTP流量检查器(如在Net选项卡中)应显示所有这些请求(和响应)。