java。郎。IllegalStateException:不能(进|sendRedirect|创建届会议)之后的反应已经承诺
-
22-09-2019 - |
题
这种方法引发的
java。郎。IllegalStateException:不向后回应,已致力
我无法发现的问题。任何帮助吗?
int noOfRows = Integer.parseInt(request.getParameter("noOfRows"));
String chkboxVal = "";
// String FormatId=null;
Vector vRow = new Vector();
Vector vRow1 = new Vector();
String GroupId = "";
String GroupDesc = "";
for (int i = 0; i < noOfRows; i++) {
if ((request.getParameter("chk_select" + i)) == null) {
chkboxVal = "notticked";
} else {
chkboxVal = request.getParameter("chk_select" + i);
if (chkboxVal.equals("ticked")) {
fwdurl = "true";
Statement st1 = con.createStatement();
GroupId = request.getParameter("GroupId" + i);
GroupDesc = request.getParameter("GroupDesc" + i);
ResultSet rs1 = st1
.executeQuery("select FileId,Description from cs2k_Files "
+ " where FileId like 'M%' and co_code = "
+ ccode);
ResultSetMetaData rsm = rs1.getMetaData();
int cCount = rsm.getColumnCount();
while (rs1.next()) {
Vector vCol1 = new Vector();
for (int j = 1; j <= cCount; j++) {
vCol1.addElement(rs1.getObject(j));
}
vRow.addElement(vCol1);
}
rs1 = st1
.executeQuery("select FileId,NotAllowed from cs2kGroupSub "
+ " where FileId like 'M%' and GroupId = '"
+ GroupId + "'" + " and co_code = " + ccode);
rsm = rs1.getMetaData();
cCount = rsm.getColumnCount();
while (rs1.next()) {
Vector vCol2 = new Vector();
for (int j = 1; j <= cCount; j++) {
vCol2.addElement(rs1.getObject(j));
}
vRow1.addElement(vCol2);
}
// throw new Exception("test");
break;
}
}
}
if (fwdurl.equals("true")) {
// throw new Exception("test");
// response.sendRedirect("cs2k_GroupCopiedUpdt.jsp") ;
request.setAttribute("GroupId", GroupId);
request.setAttribute("GroupDesc", GroupDesc);
request.setAttribute("vRow", vRow);
request.setAttribute("vRow1", vRow1);
getServletConfig().getServletContext().getRequestDispatcher(
"/GroupCopiedUpdt.jsp").forward(request, response);
}
解决方案
一个常见的误解之中首先是,他们认为,该呼叫的 forward()
, sendRedirect()
, 或 sendError()
会奇迹般地出口和"跳跃"的方框,在此忽略了残的代码。例如:
protected void doPost() {
if (someCondition) {
sendRedirect();
}
forward(); // This is STILL invoked when someCondition is true!
}
这是因而实际上不正确的。他们这样做当然不是行为不同于任何其他Java方法的(期望的 System#exit()
当然)。时 someCondition
在上述例子是 true
和你这样叫 forward()
后 sendRedirect()
或 sendError()
在同一请求/回应,然后机会 大 你将得到的例外情况:
java。郎。IllegalStateException:不向后回应,已致力
如果的 if
声明呼吁一个 forward()
你以后叫 sendRedirect()
或 sendError()
, 然后下面的例外将引:
java。郎。IllegalStateException:不能打电话给sendRedirect()后的响应已经承诺
为了解决这个问题,你需要添加一个 return;
发言之后
protected void doPost() {
if (someCondition) {
sendRedirect();
return;
}
forward();
}
...或介绍一个人块。
protected void doPost() {
if (someCondition) {
sendRedirect();
} else {
forward();
}
}
到naildown的根本原因在你的代码,只要搜索的任何线路通话一个 forward()
, sendRedirect()
或 sendError()
没有退出的方法框或跳过剩的代码。这可能是内部的相同的servlet前特别代码线,而且在任何servlet或过滤器,这是被称为前特别servlet。
在情况下 sendError()
, 如果你唯一的目的就是要设置响应的状态,使用 setStatus()
代替。
另一个可能的原因是,servlet写的响应,而一个 forward()
将所谓的,或已被称为中非常相同的方法。
protected void doPost() {
out.write("some string");
// ...
forward(); // Fail!
}
响应缓冲区大违约,在大多数服务器为2KB,所以如果你写超过2KB,那么它将致力于和 forward()
将失败的同样的方式:
java。郎。IllegalStateException:不向后回应,已致力
解决方案是显而易见的,只是不要写信给响应的servlet。这就是责任的JSP。你只需要设置一请求属性,像这样 request.setAttribute("data", "some string")
然后打印在JSP喜欢这样 ${data}
.也参看 我们Servlet wiki网页 学习如何使用Servlet正确的方式。
又一个可能的原因是, forward()
, sendRedirect()
或 sendError()
方法都援引通过代码嵌入在JSP文件在形式上的老式方法 <% scriptlets %>
, 一种做法是 正式劝阻自2001年以来.例如:
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
...
<% sendRedirect(); %>
...
</body>
</html>
这里的问题是,JSP国内立即写模板文本(即HTML代码)通过 out.write("<!DOCTYPE html> ... etc ...")
尽快就遇到了。这是因而基本上相同的问题,作为解释的前一部分。
解决方案是显而易见的,只是不要写Java码在JSP文件。这就是责任的一个正常的Java class如Servlet或一个过滤器。也参看 我们Servlet wiki网页 学习如何使用Servlet正确的方式。
参见:
无关 你的具体问题,JDBC码是泄漏的资源。修复这一点为好。为暗示,也见 怎么通常应当连接、发言和结果被封闭在JDBC?
其他提示
甚至添加return语句调出此异常,对于这唯一的办法是这样的代码:
if(!response.isCommitted())
// Place another redirection
通常你看到这个错误后,你已经做了一个重新定向,然后试图输出一些更多数据的输出流。在这情况我已经见过这个在过去,这往往是一个过滤器,是试图重新定向的网页,然后仍然将其转发通过的servlet。我看不到任何东西立刻错servlet,所以你可能想试试有一个看任何过滤器,你在的地方。
编辑:一些更多的帮助诊断的问题...
第一步要诊断这一问题,以确定究竟在哪里唯一的例外是被抛出。我们假设它是被扔线
getServletConfig().getServletContext()
.getRequestDispatcher("/GroupCopiedUpdt.jsp")
.forward(request, response);
但是你可能会发现,它是被扔在后面的码在那里你都在试图输出输出流之后你们试图要做的前进。如果它来自上述行,那么它意味着某个地方在这之前线你有:
- 输出数据输出的流,或者
- 所做的另一个重定向事先。
祝你好运!
这是因为你的servlet正试图访问的请求对象,它是没有更多的存在.. servlet的向前或包含语句不停止方法块的执行。它继续方法块或第一返回语句就像任何其他Java方法的结束。
要解决这个问题,最好的办法刚才设置的页面(即假设将请求转发)动态根据你的逻辑。是:
protected void doPost(request , response){
String returnPage="default.jsp";
if(condition1){
returnPage="page1.jsp";
}
if(condition2){
returnPage="page2.jsp";
}
request.getRequestDispatcher(returnPage).forward(request,response); //at last line
}
,并在最后一行做正向只有一次......
您也可以使用固定return语句每个正向(后这个问题)或if ... else块
把每向前()我除去
super.service(req, res);
然后它的工作对我很好
...凹凸
我不得不同样的错误。我注意到重写super.doPost(request, response);
方法时,我被调用doPost()
以及明确调用超类构造
public ScheduleServlet() {
super();
// TODO Auto-generated constructor stub
}
当我从super.doPost(request, response);
语句中注释掉doPost()
它的工作完美...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//super.doPost(request, response);
// More code here...
}
不用说,我需要super()
最佳实践来重新阅读:P
您应该,而你是转发或重定向流量增加的收益语句。
示例:
如果forwardind,
request.getRequestDispatcher("/abs.jsp").forward(request, response);
return;
如果重定向,
response.sendRedirect(roundTripURI);
return;
返回向前方法以后,就可以做到这一点:
return null;
有将打破电流范围。