2013-07-30 2 views
0

Я пытаюсь создать веб-сайт, на котором изображения, связанные с определенной сущностью, отображаются над JSP, когда мы выбираем этот объект из раскрывающегося списка над предыдущим JSP. Я получаю изображения из базы данных MySQL. Я попытался развернуть свое приложение как в Oracle Weblogic 12c, так и в Apache Tomcat 7.x. и я столкнулся с почти подобным типом проблем с обоими.Изображения не отображаются должным образом над JSP

A. Weblogic - Отображалось только одно изображение (в случае, если в базе данных имеется несколько изображений, связанных с этим выпадающим списком), а также в первой попытке. Для остальных попыток я получаю ниже ошибки:

java.net.ProtocolException: Не встречал заявленную Content-Length, писал: «0» байтов вместо заявленных

Состояние 1: Только отображается одно изображение (при первом обращении к времени приложения с момента запуска сервера), даже если имеется несколько изображений, связанных с определенным раскрывающимся списком

Условие 2: Если я вернусь назад кнопкой браузера или снова удаляю URL (независимо от браузера) ничего не отображается до тех пор, пока Я не перезапуске сервера

A. Tomcat - история немного отличается в случае Tomcat.I я не получаю исключение по консоли в случае Tomcat

Состояние 1: только одно изображение отображается (в первый раз доступ к приложению с момента запуска сервера), даже если есть несколько изображений, связанных с определенным выпадающим списком. отдых всех изображений, используемых для показа, как разбитые на пару в течение секунд, пока страница загружается completely.When страницы загружается полностью только один образом, используемый, чтобы быть там (первой) и отдых всех сломанных изображений, используемых быть исчезло

Условие 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> 

Глядя, как проблема размера буфера в каждом из case.Could кто-нибудь, пожалуйста, предложите. Почти застрял в течение 4-5 дней над тем же.

+0

Зачем смешивать скрипты и JSTL? Вероятно, у вас есть «Исключение» в вашем JSP, поэтому вы не видите ничего похожего на ваш взгляд. Попробуйте использовать простой '', где шаблон '/ path/to/your/image' совпадает с вашим URL-адресом URL-адреса сервлета. Сделайте это для 2 или 3 изображений (для быстрого тестирования нескольких изображений), затем используйте правильный ответ сервлета, который пересылает на вашу страницу, чтобы заполнить ваши ''s. –

+0

Спасибо за ответ, Luiggi.Well Я объяснил исключение выше в случае weblogic выше: java.net.ProtocolException: не отвечал заявленным Content-Length, написал: «0» байтов вместо заявленных. В случае с Tomcat я не получаю никаких исключений. –

+0

Когда вы получите сообщение об ошибке? В соответствии с выходом на экране кажется, что изображение было написано полностью для ответа или оно прерывается в середине этого процесса? –

ответ

0

Я думаю, что ваша ошибка вызвана установкой заголовка "Content-Disposition". Этот заголовок используется, чтобы браузер знал, что файл будет загружен в ответ либо как встроенный, либо как вложение.

В любом случае, это не ваш случай, если я правильно понимаю проблему. Вам нужно создать html-страницу с URL-адресами изображений <img src="MultiImageservlet/${imageName}". Браузер выполнит этот запрос и ожидает двоичных данных изображения, которые нужно вернуть не для скачивания.

Приведенные ниже заголовки должны быть достаточно для скачивания:

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-страницу, которая будет отображать одно изображение и попытаться отладить оттуда.

Я надеюсь, что помогает

0

я получил ответ на мой вопрос .... :)

На самом деле данные, поступающие из ImageDAO не продувают properly.I установил ее, очистив mixList в multiimageServlet после каждого Вызов ImageDAO.find().

Я отключил ненужные заголовки, так как на самом деле они не требовались.

Спасибо за помощь, c.s ... :)

Смежные вопросы