Java 提交响应后无法转发Servlet错误
当我运行这段代码时,我得到一个IllegalStateException:提交响应后无法转发。很抱歉,我对servlets不熟悉。我应该如何解决此问题?这发生在这一行: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
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异常发生的时间和发生的时间,您可以在请求中为此设置一个属性。此外,您还需要解决线程安全问题,如下面提到的帖子