2014-10-02 256 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?

希望这有助于!

相关问题