HTTP状态500-提交响应后无法转发TOMCAT 7.55



下面是我将如何修复这一问题的报告我已经尝试在doPost上返回requestdispatcher有人能解释一下发生了什么吗?我只是在数据库中插入了参数。我的代码出了什么问题?感谢

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>

问题是您要调用请求调度程序两次。

}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);
    }

你的程序正在捕获一个异常,然后它也在执行最后一行——在你已经转发了请求之后,你不能转发它。

明智地使用.forward()方法。另外,如果同一类中有多个转发,也不要忘记添加return语句。阅读此处并https://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,因此它将始终独立于您的错误执行。试着以明智的方式使用finally。

  1. 我应该在什么时候使用Java中的finally块';s try catch finally

  2. 为什么我需要使用finally来关闭资源?

希望这能有所帮助!!

最新更新