java.lang.IllegalStateException: Kann die Sitzung nicht weiterleiten (sendRedirect | Sitzung erstellen), nachdem die Antwort festgeschrieben wurde
Diese Methode wirft
java.lang.IllegalStateException: Cannot forward after response begangen wurde
und ich bin nicht in der Lage zu erkennen das problem. Keine Hilfe?
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);
}
InformationsquelleAutor der Frage sansknwoledge | 2010-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein häufiges Mißverständnis unter den Vorspeisen ist, dass Sie denken, dass der Aufruf einer
forward()
sendRedirect()
odersendError()
würde magisch verlassen und der "Sprung" aus der Methode block, hiermit ignorieren den Rest vom code. Zum Beispiel:Dies ist so eigentlich nicht wahr. Sie tun das sicherlich nicht anders Verhalten als jede andere Java-Methoden (erwarten
System#exit()
natürlich). Wenn diesomeCondition
im obigen Beispiel isttrue
und Sie daher aufrufenforward()
nachsendRedirect()
odersendError()
auf die gleiche Anfrage/Antwort, dann ist die chance großendass Sie die Ausnahme:Wenn die
if
- Anweisung ruft eineforward()
und du bist danach ruftsendRedirect()
odersendError()
dann unten exception wird geworfen:Dieses Problem zu beheben, müssen Sie entweder fügen Sie eine
return;
Anweisung danach... oder die Einführung eines else-block.
Zu naildown die Ursache in deinem code, nur die Suche für jede Zeile fordert eine
forward()
sendRedirect()
odersendError()
ohne das Verfahren zu blockieren oder das überspringen der Rest des Codes. Dies kann innerhalb der gleichen servlet vor der betreffenden code-Zeile, aber auch in jedem servlet oder filter, die war genannt worden, vor allem servlet.Im Falle von
sendError()
wenn sich Ihr alleiniger Zweck ist, um die Antwort status, verwenden SiesetStatus()
statt.Eine weitere mögliche Ursache ist, dass das servlet schreibt in der Antwort, während eine
forward()
aufgerufen werden, oder genannt wurde, in der gleichen Methode.Den response buffer size standardmäßig in die meisten server 2KB, so dass, wenn Sie schreiben, mehr als 2KB, dann wird es begangen und
forward()
fehl auf die gleiche Weise:Lösung liegt auf der Hand, nicht nur schreiben die Antwort in das servlet. Das ist die Verantwortung der JSP. Sie stellen Sie einfach eine Anfrage-Attribut wie so
request.setAttribute("data", "some string")
und dann drucken Sie es auf JSP-wie so${data}
. Siehe auch unsere Servlets wiki-Seite zu lernen, wie man Servlets auf dem richtigen Weg.Siehe auch:
Unabhängigen zu Ihrem konkreten problem, Ihre JDBC-code ist undicht Ressourcen. Fix, wie gut. Für Hinweise, siehe auch Wie oft sollte Connection, Statement und ResultSet geschlossen werden in JDBC?
InformationsquelleAutor der Antwort BalusC
selbst hinzufügen einer return-Anweisung bringt diese Ausnahme, für die einzige Lösung ist dieser code:
InformationsquelleAutor der Antwort user1503117
In der Regel sehen Sie dieses Fehlermeldung erhalten haben, nachdem Sie bereits getan haben, eine Weiterleitung und dann versuchen, einige weitere Daten zu den output-stream. In den Fällen, wo ich gesehen habe das in der Vergangenheit, es ist oft eines der Filter, der versucht, leiten Sie die Seite, und dann noch nach vorne durch, um das servlet. Ich kann nichts sehen sofort Los mit der servlet, so möchten Sie vielleicht, um zu versuchen, einen Blick auf alle Filter, die Sie an Ort und Stelle als gut.
Bearbeiten: Etwas mehr Hilfe bei der Diagnose des Problems...
Der erste Schritt zur Diagnose dieses problem ist es, festzustellen, wo genau die Ausnahme geworfen wird. Wir gehen davon aus, dass es ausgelöst wird, durch die Linie
Aber Sie möglicherweise feststellen, dass es ausgelöst wird, die später im code, wo Sie versuchen, die Ausgabe an den Ausgabe-stream, nachdem Sie versucht haben, zu tun, der nach vorne. Wenn es ist aus der obigen Zeile, dann bedeutet es, dass irgendwo vor dieser Zeile haben Sie entweder:
Glück!
InformationsquelleAutor der Antwort Paul Wagland
Dies ist, weil Ihr servlet zugreifen möchte, ein Anfrage-Objekt, das keine mehr vorhanden sind..
Ein servlet forward oder include-Anweisung Stoppt nicht die Ausführung der Methode block. Weiter geht es zu Ende-block-Methode oder der ersten return-Anweisung genau wie jede andere java-Methode.
Der beste Weg, um dieses problem zu beheben muss nur die Seite (wo Sie annehmen, weiterleiten der Anfrage) dynamisch nach Ihrer Logik. Das heißt:
tun und die vorne nur einmal zur letzten Zeile...
können Sie auch dieses problem mit return-Anweisung nach jeder vorwärts - () oder put jedem forward() in der if...else-block
InformationsquelleAutor der Antwort Suman Sengupta
Habe ich entfernt,
Dann es funktionierte gut für mich
InformationsquelleAutor der Antwort Kartik_Agarwal
Bump...
Hatte ich gerade den gleichen Fehler. Bemerkte ich, dass ich aufrufen
super.doPost(request, response);
beim überschreiben derdoPost()
Methode sowie explizit der Aufruf des superclass-KonstruktorsSobald ich auskommentiert, die
super.doPost(request, response);
innerhalbdoPost()
Aussage, es funktionierte perfekt...Unnötig zu sagen, ich brauchen, um wieder zu Lesen auf
super()
best practices :pInformationsquelleAutor der Antwort John Rambo
Sollten Sie zurück Aussage zu, während Sie weiterleiten oder umleiten der Strömung.
Beispiel:
wenn forwardind,
wenn umleiten,
InformationsquelleAutor der Antwort Ashish Mishra
Nach der Rückkehr vorwärts-Methode können Sie einfach, dies zu tun:
Wird es brechen Sie den aktuellen Bereich.
InformationsquelleAutor der Antwort Amir Amiri