printWriter() in servlet



我有servlet从 doGet()内的oracle数据库中检索图像,并且使用 printwriter()时,代码不起作用。

protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
     response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();
     String id = request.getParameter("submit");
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "APP_DB", "1234");
        PreparedStatement ps = con.prepareStatement("select photo from photos where id = ?");
        ps.setString(1, id);
        ResultSet rs = ps.executeQuery();
        rs.next();
        Blob b = rs.getBlob("photo");
        response.setContentType("image/jpeg");
        response.setContentLength((int) b.length());
        InputStream is = b.getBinaryStream();
        OutputStream os = response.getOutputStream();
        byte buf[] = new byte[(int) b.length()];
        is.read(buf);
        os.write(buf);
         os.close();
        out.print("<a href='DisplyExcServlet'>visit</a>");//does not work            
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }

在同一呼叫中同时使用 getServletOutputStream()getWriter()是非法的。您应该只使用一个。

这就是Java Doc所说的:

getOutputstream ...

ServletOutputStream getOutputStream()抛出ioexception

返回适合在响应中编写二进制数据的ServletOutputStream。 servlet容器不编码二进制数据。

在ServletOutputStream上调用flush()提交响应。 可以打电话给该方法或GetWriter()写正文,而不是两者。

返回:编写二进制数据的ServletOutputStream 投掷:IllegalStateException-如果已调用GetWriter方法此响应

当您想进一步写入时,不得关闭输出流。更改

    os.close();
    out.print("<a href='DisplyExcServlet'>visit</a>");

to

    out.print("<a href='DisplyExcServlet'>visit</a>");
    os.close(); // now you can close it ^^

它应该起作用。

最新更新