2012-10-02 47 views
3

兩天來,我試着找出哪裏出了問題。我讀到這裏,我要補充一個返回到代碼,而我做到了,而且我仍然得到java.lang.IllegalStateException:在響應已提交後無法調用sendRedirect()

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; 
    }  
+0

你可以提供獲取兩次調用'的getParameter「之前運行的代碼? –

+3

有別的東西,你缺少它修改響應您之前重定向()。 – kosa

+0

@Nambari後,肯定? –

回答

12

從看到的高層次,您的具體問題是因爲您錯誤地使用JSP文件而不是Servlet類作爲前端控制器。

從低層看,您的具體問題是由於JSP在生成HTML代碼並將其發送到HTTP響應期間扮演的角色,因此JSP扮演的角色。響應緩衝區大小默認爲2KB。一旦代碼到達該行,JSP中的每個HTML和其他模板文本都會被寫入到響應中,並且潛在地被。因此,當第一次達到響應緩衝區大小限制時,所有HTTP響應頭文件和迄今爲止編寫的HTML代碼將被髮送到客戶端(網頁瀏覽器)。換句話說,答覆是承諾的。這是一個不歸路。從客戶端取回已經發送的字節是不可能的。

重定向基本上在HTTP響應上設置一個Location標頭。爲了能夠正確地設置這個,響應顯然不會被提交。如果客戶端已經發送和檢索了全部響應頭,則無法設置新的響應頭。

從低層次看,您可以通過將所有前端控制器和業務邏輯移動到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> 

然而,這是一個bad practice。而是將所有前端控制器和業務邏輯移動到Servlet。那麼你的方法是從高層看到正確的。 Java代碼不屬於JSP文件,而是屬於Java類。

相關問題