ResultSet.next()没有迭代

时间:2018-01-04 18:53:43

标签: java sql iteration resultset

我的代码:

public class DisplayImage extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String connectionURL = "jdbc:mysql://localhost:3306/ycards";
        java.sql.Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(connectionURL, "root", "letmein");
            PreparedStatement st1 = con.prepareStatement("select image from pictures");
            ResultSet rs1 = st1.executeQuery();
            String imgLen = "";
            while (rs1.next()) {
                imgLen = rs1.getString(1);
                int len = imgLen.length();
                byte[] rb = new byte[len];
                InputStream readImg = rs1.getBinaryStream(1);
                readImg.read(rb, 0, len);
                response.setContentType("image/png");
                response.getOutputStream().write(rb, 0, len);
                response.getOutputStream().flush();
            }
            st1.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

输出: enter image description here

它只显示第一行而不是其余部分,为什么会这样做?注意:出于此示例,密码和用户名不正确。

1 个答案:

答案 0 :(得分:2)

您正在ResultSet上进行迭代,因为next()将光标从当前位置向前移动一行,并在读取最后一个位置时返回false

问题是你在每次迭代时都在冲洗httpResponse.outputstreamflush()上调用PrintWriter会提交HTTP响应 因此,在第一次迭代后你不能写任何东西。

我不认为您可以使用图片内容类型发送多个图片:

response.setContentType("image/png");

如果您想使用此内容类型,则可以创建一个结合了所有内容的大图像 但它真的有意义吗?

我怀疑你不需要使用:

response.setContentType("image/png");

但是您应该使用您应该首先生成的图像网址在客户端页面中显示图像 然后,您可以使用JSTL或scriplet迭代url图像,将它们呈现为HTML img元素。