Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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 返回为null的图像Servlet图像_Java_Sql_Image_Oracle_Servlets - Fatal编程技术网

Java 返回为null的图像Servlet图像

Java 返回为null的图像Servlet图像,java,sql,image,oracle,servlets,Java,Sql,Image,Oracle,Servlets,您好,我尝试了以下这个非常有用的图坦卡蒙在这里发现: 我按照教程尝试创建我的图像servlet,它从数据库中检索图像并将其显示在我的jsp页面上。据我所知,代码看起来正常,但控制台显示一个500内部错误,我的服务器控制台在这里指示我的Image变量为null: Image image = dataManager.getPhotos(homeId); 以下是我的完整代码: @WebServlet(name = "ImageServlet", urlPatterns = {"/Image"})

您好,我尝试了以下这个非常有用的图坦卡蒙在这里发现:

我按照教程尝试创建我的图像servlet,它从数据库中检索图像并将其显示在我的jsp页面上。据我所知,代码看起来正常,但控制台显示一个500内部错误,我的服务器控制台在这里指示我的Image变量为null:

Image image = dataManager.getPhotos(homeId);
以下是我的完整代码:

@WebServlet(name = "ImageServlet", urlPatterns = {"/Image"})
public class ImageServlet extends HttpServlet {

private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
private static DatabaseConnector dataManager;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    // Get ID from request.
    String homeId = request.getParameter("id");

    // Check if ID is supplied to the request.
    if (homeId == null) {
        // Do your thing if the ID is not supplied to the request.
        // Throw an exception, or send 404, or show default/warning image, or just ignore it.
        response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
        return;
    }
    try {
        // Lookup Image by ImageId in database.
        // Do your "SELECT * FROM Image WHERE ImageID" thing.
        Image image = dataManager.getPhotos(homeId);

        // 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.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType("image/png");
        response.setHeader("Content-Length", String.valueOf(image.getLength()));
        response.setHeader("Content-Disposition", "inline; filename=\"" + image.getHomeID() + "\"");

        // Prepare streams.
        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            // Open streams.
            input = new BufferedInputStream(image.getContent(), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            // Write file contents to response.
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {
            // Gently close streams.
            close(output);
            close(input);
        }

    } catch (IllegalArgumentException ex) {
        Logger.getLogger(ImageServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(ImageServlet.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(ImageServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private static void close(Closeable resource) {
    if (resource != null) {
        try {
            resource.close();
        } catch (IOException e) {
            // Do your thing with the exception. Print it, log it or mail it.
            e.printStackTrace();
        }
    }
}
下面的“我的数据库连接器”处理并检索以下数据:

 public Image getPhotos(String homeID) throws
        IllegalArgumentException, SQLException, ClassNotFoundException {

    createConnection();

    Image img = new Image();

    ResultSet rs = null;
    PreparedStatement preparedStatement = null;

    String strQuery = "SELECT * "
            + "FROM home_photo "
            + "WHERE home_photo.home_id = ?";

    try {
        preparedStatement = conn.prepareStatement(strQuery);
        preparedStatement.setString(1, homeID);
        rs = preparedStatement.executeQuery();

        while (rs.next()) {
            img.setHomeID(rs.getInt("home_id"));
            img.setPhotoID(rs.getInt("photo_id"));
            img.setContent(rs.getBinaryStream("photo"));
            img.setDescription(rs.getString("description"));
            img.setLength(rs.getInt("length"));
            img.setContentType(rs.getString("type"));
        }

    } catch (SQLException e) {
        throw new SQLException(e);
    }

    closeConnection();
    return img;
}
我看不出它在哪里返回img和null


感谢您的帮助。

问题和代码表明,实际上是
数据管理器
null
。代码的编写方式是,如果
图像
曾经是
null
,那么它只会返回一个404,而不是带有
NullPointerException的500

您需要确保
dataManager
不是
null
,例如,通过在
init()
方法中实例化它,或者如果它是一个EJB,通过将它作为
@EJB
注入



与具体问题无关
DatabaseConnector
是一个
静态
变量,而JDBC
连接
被声明为实例变量也不是一个好迹象。此代码不是线程安全的。从这里开始学习如何编写正确的JDBC代码:在您找到image servlet的同一个博客上,您还可以找到一个basic。

您好,谢谢您的回复。我使用了int()方法来安装dataManager。但是代码现在在我的控制台中Servlet中的while循环中触发了一个“Stream Closed”异常,这实际上是一个不同的问题,您应该问一个新问题:)但是,您需要用
byte[]content
替换
InputStream内容
,并使用
ResultSet#getBytes()
来获取它。这基本上是由于关闭连接后,
InputStream
不再可用造成的。