Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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
如何使用Javaservlet在JSP中显示数据库中的图像?_Java_Jsp_Servlets_Dao - Fatal编程技术网

如何使用Javaservlet在JSP中显示数据库中的图像?

如何使用Javaservlet在JSP中显示数据库中的图像?,java,jsp,servlets,dao,Java,Jsp,Servlets,Dao,这是我当前的servlet代码。这是我从数据库中获取图像的地方 newServlet.java package LAWS_SERVLETS; import LAWS_DAOS.LReceiptsDAO; import LAWS_ENTITIES.Lawyer_Receipt; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.se

这是我当前的servlet代码。这是我从数据库中获取图像的地方

newServlet.java

package LAWS_SERVLETS;

import LAWS_DAOS.LReceiptsDAO;
import LAWS_ENTITIES.Lawyer_Receipt;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Meryl
 */
@WebServlet(name = "newServlet", urlPatterns = {"/newServlet"})
public class newServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

    }

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
        LReceiptsDAO lrDAO = new LReceiptsDAO();
        int imageId = Integer.parseInt(request.getParameter("id"));

        // Check if ID is supplied to the request.
        if (imageId == 0) {

            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }


        byte[] image = lrDAO.getReceiptFile(imageId);

        // Check if image is actually retrieved from database.
        if (image == null) {
            // Do your thing if the image does not exist in database.
            // Throw an exception, or send 404, or show default/warning image, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Init servlet response.
        response.reset();
        response.setContentType(image.getContentType());
        response.setContentLength(image.getContent().length);

        // Write image content to response.
        response.getOutputStream().write(image.getContent());

    }


}
勒塞普茨多

public byte[] getReceiptFile(int id){
   byte[] l = null;

    try {

        DBConnectionFactory myFactory = DBConnectionFactory.getInstance();
        Connection conn = myFactory.getConnection();
        PreparedStatement pstmt = conn.prepareStatement("SELECT receipt_filepath FROM  lawyer_receipts"
                + "where lawyerreceipt_id = ? ");

        pstmt.setInt(1, id);
        ResultSet rs = pstmt.executeQuery();
        while(rs.next()){

          l = rs.getBytes("receipt_filepath");              
        }
         conn.close();
         return l;
    } catch (SQLException ex) {
        Logger.getLogger(LReceiptsDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

我从中获得了servlet代码,但在设置initservlet响应部分时,似乎出现了一个错误

我很抱歉问这个问题。这是我第一次尝试从数据库中获取图像块,并通过DAO和servlet获取图像块。到目前为止,我只看到jsp中包含java代码的代码

我感谢你的帮助。谢谢大家!

尝试替换

response.setContentType(image.getContentType());
response.setContentLength(image.getContent().length);
response.getOutputStream().write(image.getContent());

试着替换

response.setContentType(image.getContentType());
response.setContentLength(image.getContent().length);
response.getOutputStream().write(image.getContent());


找不到
getContentType()
getContent()
方法的原因是它们不存在。变量
image
的类型是
byte[]
——一个基本字节数组——而数组没有这些方法。这段代码实际上不应该编译

获取该代码的链接的
image
变量类型为
com.example.model.image
(在该示例中定义并具有这些方法的类),而不是
byte[]

顺便说一句,您的示例中的代码选择了一个名为
receivement\u filepath
的字段,这表明该字段将图像的路径存储在磁盘上,而不是blob。如果是这样,您应该解析该路径并从磁盘读取该文件(如链接到的示例所示)

如果它是一个blob,那么您也应该将图像的内容类型存储在数据库中。在这种情况下,您可以执行以下操作:

PreparedStatement pstmt = conn.prepareStatement("SELECT image_blob_field_name, image_content_type_field_name FROM  lawyer_receipts"
            + "where lawyerreceipt_id = ? ");
...
byte[] image = rs.getBytes(1);
String contentType = rs.getString(2);
...
随后:

response.setContentType(contentType);
response.setContentLength(image.length);
response.getOutputStream().write(image);

找不到
getContentType()
getContent()
方法的原因是它们不存在。变量
image
的类型是
byte[]
——一个基本字节数组——而数组没有这些方法。这段代码实际上不应该编译

获取该代码的链接的
image
变量类型为
com.example.model.image
(在该示例中定义并具有这些方法的类),而不是
byte[]

顺便说一句,您的示例中的代码选择了一个名为
receivement\u filepath
的字段,这表明该字段将图像的路径存储在磁盘上,而不是blob。如果是这样,您应该解析该路径并从磁盘读取该文件(如链接到的示例所示)

如果它是一个blob,那么您也应该将图像的内容类型存储在数据库中。在这种情况下,您可以执行以下操作:

PreparedStatement pstmt = conn.prepareStatement("SELECT image_blob_field_name, image_content_type_field_name FROM  lawyer_receipts"
            + "where lawyerreceipt_id = ? ");
...
byte[] image = rs.getBytes(1);
String contentType = rs.getString(2);
...
随后:

response.setContentType(contentType);
response.setContentLength(image.length);
response.getOutputStream().write(image);

“当我设置init servlet响应部分时,似乎遇到了一个错误”-您遇到了什么错误?servlet找不到
getContentType()
getContent().length
,以及
getContent())
methods您问了一个错误的问题:BalusC在link中的代码只是说,如果DAO给您一个图像,如何从Servlet发送图像。他甚至在评论中说这是一把虚构的刀。只要用你自己的道具:)。您的请求
选择receipt\u filepath…
假设您的数据库只存储图像的路径。如果这是真的,你应该首先确保你真的得到了图像位,如果不能的话,你应该问另一个问题(包括你的尝试),“当我设置init servlet响应部分时,似乎我得到了一个错误”-你得到了什么错误?servlet找不到
getContentType()
getContent().length
,而
getContent()
方法您问了一个错误的问题:BalusC的链接代码只是说如果DAO给您一个图像,如何从Servlet发送图像。他甚至在评论中说这是一把虚构的刀。只要用你自己的道具:)。您的请求
选择receipt\u filepath…
假设您的数据库只存储图像的路径。如果这是真的,你应该首先确保你真的得到了图像位,如果你不能,你应该问另一个问题(包括你的尝试)。我可以将ContentType设置为
response.setContentType(“image/*”)相反?这取决于浏览器对通配符图像内容类型的支持。它在服务器端可以很好地工作,但我不知道浏览器支持它的程度。我可以将ContentType设置为
response.setContentType(“image/*”)相反?这取决于浏览器对通配符图像内容类型的支持。它将在服务器端完美运行,但我不知道浏览器支持它的程度。