3

2日間、何が悪かったのかを調べてみました。私はここでコードにリターンを追加する必要があることを読みました、そして私はそれをしました、そして私はまだ得ます

java.lang.IllegalStateException: Cannot call sendRedirect() 
     after the response has been committed, Error.

どうすればこの問題を解決できますか?

データベースに接続するたびに発生します。これは接続方法です:

<%!

public  void connect()
{
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String dbURL = "jdbc:mysql://localhost:3306/moti";
            String user = "root";
            String password = "j3o4h5n6y7";
            con =  DriverManager.getConnection(dbURL, user, password);  
            statement = con.createStatement();
        }
        catch(Exception ex) {
            throw new Error(ex);
        }  
}
%>

このコードブロックのように:

            String post = request.getParameter("send");
            if(post != null )
            {
                    connect();
                    statement.execute(add);
                    con.close();
                    response.sendRedirect("fourm.jsp");
                    return;

            }

しかし、このコードでは、その作業を完全にブロックします:

    String back = request.getParameter("retrun");

    if(back != null)
    {

        response.sendRedirect("fourm.jsp");
        return;
    }       
4

1 に答える 1

12

高レベルから見ると、フロントコントローラーとしてサーブレットクラスではなくJSPファイルを誤って使用しているため、具体的な問題が発生しています。

低レベルから見ると、具体的な問題は、HTML コードを生成して HTTP 応答に送信する際に、JSP がビュー テクノロジとしての役割を果たしているために発生します。応答バッファ サイズのデフォルトは 2KB です。コードがその行に到達すると、JSP 内のすべての HTML およびその他のテンプレート テキストが即座に応答に書き込まれます。そのため、応答バッファー サイズの制限に初めて達すると、すべての HTTP 応答ヘッダーとそれまでに書き込まれた HTML コードがクライアント (Web ブラウザー) に送信されます。つまり、応答はコミットされます。これは後戻りできないポイントです。クライアントから送信済みのバイトを取り戻すことは不可能です。

リダイレクトは、基本的Locationに HTTP 応答にヘッダーを設定します。これを適切に設定できるようにするには、応答がまだコミットされていない必要があります。すべての応答ヘッダーがクライアントによって既に送信および取得されている場合、新しい応答ヘッダーを設定することは単に不可能です。

低レベルから見ると、すべてのフロント コントローラーとビジネス ロジックを JSP ファイルの一番上に移動して、最初の HTML コードが送信されるずっと前に実行されるようにすることで、具体的な問題を解決できます。このようにして、フロント コントローラーとビジネス ロジックが完了する前に応答がコミットされるリスクを排除します。

<%@page pageEncoding="UTF-8" %>
<%
    // Write business code here.
%>
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Some</title>
    </head>
    <body>
        ... (no controller/business logic here! just pure presentation)
    </body>
</html>

ただし、これは悪い習慣です。代わりに、すべてのフロント コントローラーとビジネス ロジックをServletに移動します。次に、あなたのアプローチは、正しいと思われる高レベルからのものです。Java コードは JSP ファイルではなく、Java クラスに属します。

于 2012-10-02T16:48:33.350 に答える