[英]Images are not being displayed properly over JSP
我正在嘗試開發一個網站,當我們從以前的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秒
相關代碼段如下:
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天。
我認為您的錯誤是由設置"Content-Disposition"
標頭引起的。 此標頭用於使瀏覽器知道將以內聯或附件形式在響應中下載文件。
無論如何,如果我正確地理解了問題,那么這不是您的情況。 您需要創建一個帶有圖像URL <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頁面,該頁面將顯示單個圖像,然后嘗試從該頁面進行調試。
希望對您有所幫助
我有我的問題的答案.... :)
實際上來自ImageDAO的數據沒有被正確刷新。我通過在每次ImageDAO.find()調用之后清除multiimageServlet中的mixList來修復它。
我也禁用了不必要的標題,因為實際上並不需要這些標題。
感謝您的幫助,cs .. :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.