【问题标题】:Images are not being displayed properly over JSP图像无法通过 JSP 正确显示
【发布时间】:2013-07-30 20:09:20
【问题描述】:

我正在尝试开发一个网站,当我们从先前 JSP 的下拉列表中选择该实体时,在该 JSP 上显示与特定实体相关的图像。我正在从 MySQL 数据库中获取图像。 我尝试在 Oracle Weblogic 12c 和 Apache Tomcat 7.x 中部署我的应用程序。而且我都面临着几乎相似类型的问题。

A. Weblogic - 曾经只显示一个图像(以防数据库中有多个与该下拉菜单相关的图像),这也是第一次尝试。对于其余的尝试,我遇到了以下错误:

java.net.ProtocolException:不符合规定的 Content-Length,写入:'0' 字节而不是规定

条件1:即使有多个与特定下拉菜单相关的图像,也只显示一个图像(自启动服务器以来第一次访问应用程序时间)

条件 2:如果我通过浏览器后退按钮返回或再次点击 URL(无论浏览器如何),除非我没有重新启动服务器,否则不会显示任何内容

A. Tomcat - 对于 Tomcat,故事略有不同。对于 Tomcat,我不会在控制台上遇到异常

条件 1 :即使有多个与特定下拉菜单相关的图像,也仅显示一个图像(自启动服务器以来第一次访问应用程序时)。将所有图像显示为损坏几秒钟,直到页面完全加载。当页面完全加载时,只有一个图像曾经存在(第一个)并且所有损坏的图像都消失了

条件 2 :如果我通过浏览器后退按钮返回或再次点击 URL(无论浏览器如何)而不重新启动服务器,所有图像过去都会显示为损坏,并且在页面完全加载时会消失

使用 Tomcat 图片显示页面过去几乎会挂起 5-10 秒

相关代码sn-ps如下:

MultiimageServlet.java

package com.ankit.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import com.ankit.dao.ImageDAO;

public class MultiImageservlet extends HttpServlet {
private static final long serialVersionUID = 1L;

public MultiImageservlet() {
    super();

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try
    {
        int bufferSize = 8192;
    BufferedInputStream input1 =null;
    BufferedOutputStream output =null;
    InputStream input =null;
    java.net.URL url1=Thread.currentThread().getContextClassLoader().getResource("Log4j.xml");
    DOMConfigurator.configure(url1);
    Logger logger = Logger.getLogger(MultiImageservlet.class);
    String imageName = request.getPathInfo().substring(1);
    logger.info("imageName "+imageName);
    List<Object> mixList = ImageDAO.find(imageName);
     input = (InputStream) mixList.get(1);
     input1 = new BufferedInputStream(input);
    logger.info("input "+input);
    Blob pic = (Blob)mixList.get(0);
    logger.info("Blob "+pic);
    int length = (int)pic.length();
    response.setContentType("image/jpg");
    response.setHeader("Content-Type", getServletContext().getMimeType(imageName));
    response.setHeader("Content-Length", String.valueOf(pic.length()));
    response.resetBuffer();
    response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\"");
    //ServletOutputStream output = response.getOutputStream();
    output = new BufferedOutputStream(response.getOutputStream());
    byte[] buffer = new byte[bufferSize];
     while ((length = input1.read(buffer)) != -1) {                
           System.out.println("writing " + length + " bytes");                 
          output.write(buffer, 0, length);
          }


     input1.close();
      output.flush();
     output.close();
     response.flushBuffer();

    }

    catch(Exception ex)
    {

        ex.printStackTrace();
    }

}


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

}}

MultiImages.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org     /TR/html4/loose.dtd">
<%@ page import ="org.apache.log4j.*" %>
<%@ page import = "org.apache.log4j.xml.DOMConfigurator" %>
<%
int timeout = session.getMaxInactiveInterval();
response.setHeader("Refresh", timeout + "; URL = login.jsp");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>multiImages</title>
</head>
<body>
<h1> Welcome <%=session.getAttribute("userName") %> </h1>
<% java.net.URL     url1=Thread.currentThread().getContextClassLoader().getResource("Log4j.xml");
DOMConfigurator.configure(url1);
Logger logger = Logger.getLogger("multiImages.jsp");
logger.info("inside multiImages.jsp");
%>
<c:forEach items="${imageNames}" var="imageName">
<img src="MultiImageservlet/${imageName}"  height="150" width="150">
<%
logger.info("multi servlet executed");
%>
</c:forEach>
<a href="logout.jsp"><b>Logout</b></a>
</body>
</html>

在每种情况下看起来像缓冲区大小问题。有人可以建议。几乎在同一件事上卡住了 4-5 天。

【问题讨论】:

  • 为什么要混合使用 scriptlet 和 JSTL?可能您的 JSP 中有一个 Exception,因此您的视图中没有显示任何内容。尝试使用普通的&lt;img src="/path/to/your/image" /&gt;,其中/path/to/your/image 模式与您的Servlet URL 映射匹配。对 2 或 3 张图像执行此操作(用于快速多图像测试),然后使用来自 servlet 的正确响应,该响应转发到您的页面以填充您的 &lt;img&gt;s。
  • 感谢您的回复,Luiggi.Well 我已经解释了上面 weblogic 的异常情况:java.net.ProtocolException:不符合规定的内容长度,写道:“0”字节而不是规定.在 Tomcat 的情况下,我没有得到任何异常。
  • 什么时候出现错误?根据屏幕上的输出,图像似乎已完全写入响应,还是在此过程中中断?
  • 可以添加异常的堆栈跟踪吗?
  • 我还建议使用 chrome 的网络检查器之类的工具来查看每个图像请求的情况。

标签: java image jsp servlets weblogic


【解决方案1】:

我认为您的错误是由设置 "Content-Disposition" 标头引起的。此标头用于让浏览器知道将在响应中以内联或附件的形式下载文件。

无论如何,如果我正确理解问题,这不是你的情况。您需要创建一个带有图片网址&lt;img src="MultiImageservlet/${imageName}" 的html 页面。浏览器将发出该请求并期望 图像的二进制数据返回而不是下载。

下面的标题应该足够下载了:

response.setContentType("image/jpg");
response.setHeader("Content-Type", getServletContext().getMimeType(imageName));
response.setHeader("Content-Length", String.valueOf(pic.length()));

请删除这些行:

response.resetBuffer();  // You shouldn't need this either
response.setHeader("Content-Disposition", "inline; filename=\"" + imageName + "\"");

如果问题仍然存在,我建议尝试使用显示单个图像的简单 html 页面并尝试从那里进行调试。

希望对你有帮助

【讨论】:

    【解决方案2】:

    我的问题得到了答案....:)

    实际上来自 ImageDAO 的数据没有正确刷新。我通过在每次 ImageDAO.find() 调用后清除 multiimageServlet 中的 mixList 来修复它。

    我也禁用了不必要的标头,因为实际上不需要这些标头。

    感谢您的帮助,c.s...:)

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2021-09-26
      • 2018-12-10
      相关资源
      最近更新 更多