【问题标题】:printWriter() in servletservlet 中的 printWriter()
【发布时间】:2015-07-20 00:00:45
【问题描述】:

我有 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());
    }

【问题讨论】:

  • 请详细说明“不起作用”部分。

标签: java jakarta-ee servlets web


【解决方案1】:

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

Java Doc 是这么说的:

获取输出流...

ServletOutputStream getOutputStream() 抛出 IOException

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

在 ServletOutputStream 上调用 flush() 会提交响应。 可以调用此方法或 getWriter() 来编写正文,而不是两者。

返回:用于写入二进制数据的 ServletOutputStream 抛出:IllegalStateException - 如果已在此响应上调用 getWriter 方法

【讨论】:

    【解决方案2】:

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

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

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

    它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 2011-02-12
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2015-03-15
      • 2019-08-19
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多