2014-10-02 42 views
-1

以下是報告我將如何解決這個問題我試圖在doPost上返回requestdispatcher 有人可以解釋發生了什麼。我只是在數據庫中插入參數我的代碼有什麼問題?感謝HTTP狀態500 - 在響應提交後無法轉發TOMCAT 7.55

type Exception report 


message Cannot forward after response has been committed 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

java.lang.IllegalStateException: Cannot forward after response has been committed 
    EventHandler.InsertEvent.doPost(InsertEvent.java:75) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

SERVLET

package EventHandler; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.Statement; 

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

@WebServlet("/AddEvent")  

public class InsertEvent extends HttpServlet { 
    String title,description, founder, time, date, location, payment; 
    int price = 0; 
    int bank = 0; 
    String query; 
    Connection conn; 
    Statement stmt; 
    ResultSet rs; 
    DatabaseConnection dbconn; 

    private static final long serialVersionUID = 1L; 





    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 


    } 




    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 

     try{ 
      title = request.getParameter("title"); 
      description = request.getParameter("description"); 
      founder = request.getParameter("founder"); 
      time = request.getParameter("time"); 
      date = request.getParameter("date"); 
      location = request.getParameter("location"); 
      payment = request.getParameter("payment"); 
      price = Integer.parseInt(request.getParameter("price")); 
      bank = Integer.parseInt(request.getParameter("bank")); 
      System.out.println(title); 
      System.out.println(description); 
      System.out.println(founder); 
      System.out.println(time); 
      System.out.println(date); 
      System.out.println(location); 
      System.out.println(payment); 
      System.out.println(price); 
      System.out.println(bank); 
      conn = dbconn.setConnection(); 
      stmt = conn.createStatement(); 
      query = "insert into event_list values('"+title+"','"+description+"','"+founder+"','"+time+"','"+date+"','"+location+"','"+payment+"',"+price+","+bank+")"; 
      int i = stmt.executeUpdate(query); 

     }catch(Exception e){ 
      request.setAttribute("Error", e); 
      RequestDispatcher rd = request.getRequestDispatcher("error.jsp"); 
      rd.forward(request, response); 
     }finally{ 
      RequestDispatcher rd = request.getRequestDispatcher("CreateEvent.jsp"); 
      rd.forward(request, response); 
     } 

    } 

} 

的DbConnection

package EventHandler; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

public class DatabaseConnection { 
    Connection conn; 
    Statement stmt; 
    ResultSet rs; 
    String url = "jdbc:mysql://localhost:3306/form"; 
    String driver = "com.mysql.jdbc.Driver"; 
    String userName = "root"; 
    String password = "Incorrect00!"; 

    public DatabaseConnection(){ 

    } 

    public Connection setConnection(){ 
     try{ 
      Class.forName(driver); 
      conn = DriverManager.getConnection(url, userName, password); 
     }catch(Exception e){ 

     } 
     return conn; 
    } 

    public ResultSet getResult(String sql, Connection conn){ 
     this.conn = conn; 
     try{ 
      stmt = conn.createStatement(); 
      rs = stmt.executeQuery(sql); 
     }catch (Exception e){ 

     } 
     return rs; 
    } 
} 

JSP

<html> 
<head> 
<title>Create An event</title> 
<script src="js/jquery.js"></script> 
<script src="js/bootstrap.min.js"></script> 
<script src="js/bootstrap-datetimepicker.min.js"></script> 
<script src="js/CreateEvent.js"></script> 
<link href="css/bootstrap.css" rel="stylesheet" type="text/css"/> 
<link href="css/bootstrap-datetimepicker.min.css" rel="stylesheet" type="text/css"/> 



</head> 
<body> 

<form method="post" action="AddEvent" > 
<br> 

Title: <input type="text" name="title" ><br><br> 
Event Founder: <input type="text" name="founder" ><br><br> 
Description: <textarea name="description" ></textarea><br><br> 

    Time: 

        <input type='text' class="form-control" name="time" /> 

Day: 
        <input type='text' class="form-control" data-date-format="YYYY/MM/DD" name="date"/> 

Where: <input type="text" name="location"> <br> 
Include Payment? <br> 
<input type="radio" name="payment" id="showprice" value="yes">Yes<br> 
<input type="radio" name="payment" value="no">No<br> 

<div id="price"> 
Price: <input type="text" value="0" name="price"> 
<br> 
Bank Account Number : <input type="text" name="bank" value="0"> 
</div> 

<input type="submit" value="Finish" class="btn btn-success"/> 
</form> 
<a href="/EventPlannerV3">Show List</a> 
</body> 
</html> 
+0

與您的問題無關,但與您在代碼中使用的危險風格有關:請閱讀SQL注入,然後使用'prepareStatement'並提供各個參數,而不是連接您從請求中讀取的內容。然後在這裏閱讀關於小鮑比表:http://xkcd.com/327/ – 2014-10-03 11:50:11

回答

3

問題在於你正在調用請求調度程序兩次。

}catch(Exception e){ 
     request.setAttribute("Error", e); 
     RequestDispatcher rd = request.getRequestDispatcher("error.jsp"); 
     rd.forward(request, response); 
    }finally{ 
     RequestDispatcher rd = request.getRequestDispatcher("CreateEvent.jsp"); 
     rd.forward(request, response); 
    } 

您的程序捕獲異常則也執行了最終行,你已經轉發後,您不能轉發請求。

+0

我有一個問題插入到我的數據庫我的查詢是正確的,但它沒有通過我的數據庫可以請你告訴我什麼是錯的代碼? – 2014-10-02 18:55:18

+0

什麼是你的程序捕捉的原始錯誤...嘗試做catch(Exception e){e.printStackTrace();}它將有助於瞭解錯誤。 – brso05 2014-10-02 18:56:40

+0

也逃脫你的'在你的查詢應該是\' – brso05 2014-10-02 18:57:41

0

明智地使用你的.forward() mehtod。如果您在同一個班級中有多個轉發,也不要忘記添加return聲明。閱讀herehttps://stackoverflow.com/questions/19619949/how-does-function-terminate-with-requestdispatcher-forward

catch(Exception e){ 
     request.setAttribute("Error", e); 
     RequestDispatcher rd = request.getRequestDispatcher("error.jsp"); 
     rd.forward(request, response); 
     return; 
    }finally{ 
     RequestDispatcher rd = request.getRequestDispatcher("CreateEvent.jsp"); 
     rd.forward(request, response); 
     return; 
    } 

使程序控制復位,而不是執行其他塊。您在finally()中使用了RequestDispatcher,因此它將始終獨立於您的錯誤執行。嘗試最終以明智的方式使用。

  1. When should I use the finally-block in Java's try-catch-finally

  2. Why do I need to use finally to close resources?

希望這有助於!

相關問題