簡體   English   中英

servlet中的printWriter()

[英]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>");

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

它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM