簡體   English   中英

在JSP中將MySQL請求拋出IllegalStateException時使用的response.getOutputStream

[英]response.getOutputStream used on MySQL request throwing IllegalStateException in JSP

我面臨着一個奇怪的問題。 我正在嘗試創建一個網站,該網站通過從MySQL服務器檢索和顯示數據來動態創建“論壇線程”式的頁面。 此數據可以有兩種類型:純文本或圖像文件(存儲為BLOB)。 在測試時,數據庫中有3個條目-1個文本,1個圖片,1個文本。 我們正在使用JSP和servlet檢索和顯示數據。 文本條目寫得很好,但是當嘗試顯示圖片時,我們不斷從OutputStream實例獲取IllegalStateExceptions-即,它將一直運行代碼,直到我們嘗試實例化OutputStream,然后拋出異常。

我們認為它與多線程有關,但是在嘗試使用同步和特定的重入鎖之后,我們仍然會得到異常。 我應該提到,如果我們嘗試將代碼的“ get-image”部分作為單獨的servlet而不是JSP的一部分來運行,則它會很好地顯示圖像。

Servlet代碼如下所示:

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class listConversation
 */
@WebServlet("/ListConversation")
public class ListConversation extends HttpServlet
{

    @Override
    protected synchronized void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
    {
        try
        {
            String connectionURL = [our database URL, username and password];
            String myDriver = "com.mysql.jdbc.Driver";

            Class.forName(myDriver).newInstance();

            Connection con = DriverManager.getConnection(connectionURL);

            Statement stmt = con.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT ID, Content1 FROM Conversations WHERE ConversationID=587 ORDER BY Date ASC");

            res.setContentType("text/html");
            PrintWriter out = res.getWriter();

            out.print("<hr>");

            while (rs.next())
            {
                out.print("<b>Besked</b><br/>" + rs.getString("Content1") + "<br/><br/>");

                try {

                    System.out.println("Try-block started.");
                    Statement stmt2 = con.createStatement();
                    System.out.println("Statement created.");
                    ResultSet rs2 = stmt2.executeQuery("SELECT Content2 FROM Conversations WHERE ID = 4");
                    System.out.println("Statement executed.");
                    ServletOutputStream outStream = res.getOutputStream();
                    System.out.println("Outputstream initialized.");
                    Blob image;
                            if (rs2.next()) {
                                image = rs2.getBlob(1);
                                System.out.println("Image created.");
                            } else {
                                res.setContentType("text/html");
                                out.println("h4><font color='red'>image not found for given id</font></h4>");
                                        return;
                            }
                            res.setContentType("image/gif");
                            InputStream in = image.getBinaryStream();
                            int length = (int) image.length();
                            int bufferSize = 1024;
                            byte[] buffer = new byte[bufferSize];
                            System.out.println("Initializing...");
                            while ((length = in.read(buffer)) != -1) {
                                outStream.write(buffer, 0, length);
                            }
                            System.out.println("Image streamed.");
                            in.close();
                            stmt2.close();
                            rs2.close();
                            outStream.close();
                            System.out.println("Closing.");
                            out.flush();
                }
                catch(IllegalStateException e)
                {
                    System.out.println("Darn OutputStreams...");
                }
                catch (Exception e) {
                    res.setContentType("text/html");
                    out.println("<h4><font color='red'>Image Display Error=" + e.getMessage() +
                            "</font></h4>");
                    return;
                }

                out.print("<hr>");
            }

            stmt.close();
            con.close();

            }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
    {
        doGet(req,res);
    }


}

控制台輸出為:

Try-block started. 
Statement created. 
Statement executed.
Darn OutputStreams...

因為我們有3個ConversationID為587的條目。Content1是文本,Content2是BLOBS。

任何想法或糾正將不勝感激。 謝謝:D

您不能在同一響應中調用response.getWriter()和response.getOutputStream()。 通話

PrintWriter out = res.getWriter();

已經“聲明”了響應,可以這樣說,當您致電時

ServletOutputStream outStream = res.getOutputStream();

你會得到例外。

暫無
暫無

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

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