Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未通过JSP正确显示图像_Java_Image_Jsp_Servlets_Weblogic - Fatal编程技术网

Java 未通过JSP正确显示图像

Java 未通过JSP正确显示图像,java,image,jsp,servlets,weblogic,Java,Image,Jsp,Servlets,Weblogic,我正在尝试开发一个网站,当我们从先前JSP上的下拉列表中选择某个实体时,与该实体相关的图像将显示在JSP上。我正在从MySQL数据库获取图像。 我已经尝试在OracleWebLogic12c和ApacheTomcat7.x中部署我的应用程序。我在这两方面都面临着类似的问题 A.Weblogic-仅显示一个图像(如果数据库中有多个图像与该下拉列表相关),并且也是第一次尝试。对于其余的尝试,我得到以下错误: java.net.ProtocolException:不符合规定的内容长度,写入:“0”字节

我正在尝试开发一个网站,当我们从先前JSP上的下拉列表中选择某个实体时,与该实体相关的图像将显示在JSP上。我正在从MySQL数据库获取图像。 我已经尝试在OracleWebLogic12c和ApacheTomcat7.x中部署我的应用程序。我在这两方面都面临着类似的问题

A.Weblogic-仅显示一个图像(如果数据库中有多个图像与该下拉列表相关),并且也是第一次尝试。对于其余的尝试,我得到以下错误:

java.net.ProtocolException:不符合规定的内容长度,写入:“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 {
package com.ankit.controller;
导入java.io.BufferedInputStream;
导入java.io.BufferedOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.sql.Blob;
导入java.util.List;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.log4j.Logger;
导入org.apache.log4j.xml.DOMConfigurator;
导入com.ankit.dao.ImageDAO;
公共类MultiImageservlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
公共多映像servlet(){
超级();
}
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
尝试
{
int bufferSize=8192;
BufferedInputStream input1=null;
BufferedOutputStream输出=null;
InputStream输入=null;
java.net.URL url1=Thread.currentThread().getContextClassLoader().getResource(“Log4j.xml”);
DOMConfigurator.configure(url1);
Logger=Logger.getLogger(MultiImageservlet.class);
字符串imageName=request.getPathInfo().substring(1);
logger.info(“imageName”+imageName);
List mixList=ImageDAO.find(imageName);
input=(InputStream)mixList.get(1);
input1=新的BufferedInputStream(输入);
logger.info(“输入”+输入);
Blob pic=(Blob)mixList.get(0);
logger.info(“Blob”+pic);
int length=(int)pic.length();
response.setContentType(“image/jpg”);
setHeader(“内容类型”,getServletContext().getMimeType(imageName));
setHeader(“Content-Length”,String.valueOf(pic.Length());
resetBuffer();
setHeader(“内容处置”、“内联;文件名=\”“+imageName+”\”);
//ServletOutputStream输出=response.getOutputStream();
输出=新的BufferedOutputStream(response.getOutputStream());
字节[]缓冲区=新字节[bufferSize];
而((长度=input1.read(缓冲区))!=-1{
System.out.println(“写入”+长度+“字节”);
输出.写入(缓冲区,0,长度);
}
input1.close();
output.flush();
output.close();
response.flushBuffer();
}
捕获(例外情况除外)
{
例如printStackTrace();
}
}
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发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的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中的混合列表来修复它

我还禁用了不必要的标题,因为实际上并不需要这些标题


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

为什么要混合使用Scriptlet和JSTL?可能您的JSP中有一个
异常
,因此没有在中显示任何内容