Java 提交响应后无法转发Servlet错误

Java 提交响应后无法转发Servlet错误,java,sql,jsp,servlets,Java,Sql,Jsp,Servlets,当我运行这段代码时,我得到一个IllegalStateException:提交响应后无法转发。很抱歉,我对servlets不熟悉。我应该如何解决此问题?这发生在这一行: RequestDispatcher rd = request.getRequestDispatcher("/displayjobs.jsp"); rd.forward(request, response); 以下是异常的堆栈跟踪: java.lang.IllegalStateException: Cannot forward

当我运行这段代码时,我得到一个IllegalStateException:提交响应后无法转发。很抱歉,我对servlets不熟悉。我应该如何解决此问题?这发生在这一行:

RequestDispatcher rd = request.getRequestDispatcher("/displayjobs.jsp");
rd.forward(request, response);
以下是异常的堆栈跟踪:

java.lang.IllegalStateException: Cannot forward after response has been committed
schedule.doGet(schedule.java:71)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
下面是我的servlet代码的其余部分。 编辑:我还包括了我的jsp代码,因为我现在在第2行遇到了NPE:

1 List data = (List)request.getAttribute("jobsData);
2 for(itr = data.iterator(); itr.hasNext();)
这意味着由于某种原因,数据是空的,而不是包含JobsData的信息

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try{
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
        String connectionUrl = "jdbc:sqlserver://10.11.1.246;databaseName=Test;integratedSecurity=false;user=sa;password=S0l1dConcepts";
        Connection con = DriverManager.getConnection(connectionUrl);
        String query = "select * from jobs";
        stmt = con.createStatement();
        res = stmt.executeQuery(query);
        while(res.next()){
            list.add(res.getString(1));
            list.add(res.getString(2));
            list.add(res.getString(3));
            list.add(res.getString(4));
            list.add(res.getString(5));
            list.add(res.getString(6));
            list.add(res.getString(7));
            list.add(res.getString(8));
            list.add(res.getString(9));
            list.add(res.getString(10));
        }
        res.close();
    }
    catch(Exception e){
        RequestDispatcher rd = request.getRequestDispatcher("/error.jsp");
        rd.forward(request, response);
    }
finally{
        request.setAttribute("jData", list);
        RequestDispatcher rd = request.getRequestDispatcher("/displayjobs.jsp");
        rd.forward(request, response);
        list.clear();
        out.close();
}

}


/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try{
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
        String connectionUrl = "jdbc:sqlserver://10.11.1.246;databaseName=Test;integratedSecurity=false;user=sa;password=S0l1dConcepts";
        Connection con = DriverManager.getConnection(connectionUrl);
        String query = "select * from jobs";
        stmt = con.createStatement();
        res = stmt.executeQuery(query);
        while(res.next()){
            list.add(res.getString(1));
            list.add(res.getString(2));
            list.add(res.getString(3));
            list.add(res.getString(4));
            list.add(res.getString(5));
            list.add(res.getString(6));
            list.add(res.getString(7));
            list.add(res.getString(8));
            list.add(res.getString(9));
            list.add(res.getString(10));
        }
        res.close();
    }
    catch(Exception e){
        RequestDispatcher rd = request.getRequestDispatcher("/error.jsp");
        rd.forward(request, response);
    }
    finally{
        request.setAttribute("jData", list);
        RequestDispatcher rd = request.getRequestDispatcher("/displayjobs.jsp");
        rd.forward(request, response);
        list.clear();
        out.close();
    }

}
}

以下是JSP代码:

<%@page import="java.util.List" %>
<%@page import="java.util.Iterator" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01   Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Scheduling</title>
</head>
<body>
    <table>
    <%Iterator itr;%>
    <%List data = (List)request.getAttribute("jobsData");
    for(itr = data.iterator(); itr.hasNext();){
        %>
    <tr>    
        <% String s = (String) itr.next();%>
        <td><%=s%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><%=itr.next()%></td>
        <td><input type="submit" value="Edit" name="edit" onclick ="editRecord(<%=s%> %>);"></td>
        <td><input type="submit" value="Delete" name="delete" onclick ="deleteRecord(<%=s%> %>);"></td>
        <%} %>
        </tr>
</table>

行程安排

您的代码存在许多问题。。。特别是,在发生错误的情况下,您将尝试转发两次(一次在catch块中,一次在finally块中)。您可能应该在出现异常时添加服务器端日志记录,以便知道存在问题,而不仅仅是将错误抛给用户

您还有
doGet
doPost
之间的代码重复,并且资源泄漏(您没有关闭数据库连接或语句)

Select*
也是个坏主意


在哪里定义了
列表
?如果它是在servet类级别定义的,那么您的代码就不是线程安全的。

问题很简单。异常被捕获,响应从catch块委派,然后再从finally块委派

你应该做的是在一个地方授权你的回应

请注意:-响应只能提交一次

boolean exceptionOcured =false;    
try{
// your code
}
catch(Exception e){
  exceptionOcured  =true;
}
finally{
// your code to release resources
}

if(exceptionOcured){
 RequestDispatcher rd = request.getRequestDispatcher("/error.jsp");
        rd.forward(request, response);
}else{
RequestDispatcher rd = request.getRequestDispatcher("/displayjobs.jsp");
        rd.forward(request, response);
}

任何时候你得到一个异常,发布异常堆栈跟踪。告诉我们发生在哪里。解释为什么这与你的期望不同。我已经编辑了我的帖子。很抱歉,谢谢,成功了。但是现在,由于某种原因,当我调用request.getatribute(“jobsData”)时,我在jsp页面中得到了一个nullpointerexception我不明白为什么会出现这种情况。我将包括我的jsp页面代码,顺便说一句,我非常感谢您的帮助!您必须告诉您的jsp异常发生的时间和发生的时间,您可以在请求中为此设置一个属性。此外,您还需要解决线程安全问题,如下面提到的帖子