Diese Methode wirft
java.lang.IllegalStateException: Kann nicht weitergeleitet werden, nachdem die Antwort festgeschrieben wurde
und ich kann das Problem nicht erkennen. Irgendeine 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);
}
servlets
response
illegalstateexception
forward
requestdispatcher
sansknwoledge
quelle
quelle
Antworten:
Ein häufiges Missverständnis unter Startern ist, dass sie denken, dass der Aufruf von a
forward()
,sendRedirect()
odersendError()
auf magische Weise aus dem Methodenblock austreten und "springen" würde, wodurch der Rest des Codes ignoriert wird. Beispielsweise:Dies ist also eigentlich nicht wahr. Sie verhalten sich sicherlich nicht anders als alle anderen Java-Methoden (
System#exit()
natürlich zu erwarten ). Wenn dassomeCondition
obige Beispiel lautettrue
und Sie daherforward()
nachsendRedirect()
odersendError()
auf derselben Anfrage / Antwort anrufen , ist die Wahrscheinlichkeit groß, dass Sie die Ausnahme erhalten:Wenn die
if
Anweisung a aufruftforward()
und Sie anschließendsendRedirect()
oder aufrufensendError()
, wird die folgende Ausnahme ausgelöst:Um dies zu beheben, müssen Sie anschließend entweder eine
return;
Anweisung hinzufügen... oder um einen else-Block einzuführen.
Um die Grundursache in Ihrem Code zu ermitteln, suchen Sie einfach nach einer Zeile, die a aufruft
forward()
,sendRedirect()
odersendError()
ohne den Methodenblock zu verlassen oder den Rest des Codes zu überspringen. Dies kann sich innerhalb desselben Servlets vor der bestimmten Codezeile befinden, aber auch in jedem Servlet oder Filter, das vor dem bestimmten Servlet aufgerufen wurde.Im Fall
sendError()
, wenn Ihr einziger Zweck den Antwortstatus gesetzt ist, verwenden SiesetStatus()
stattdessen.Eine andere wahrscheinliche Ursache ist, dass das Servlet in die Antwort schreibt, während a
forward()
aufgerufen wird oder auf dieselbe Weise aufgerufen wurde.Die Standardgröße des Antwortpuffers beträgt bei den meisten Servern standardmäßig 2 KB. Wenn Sie also mehr als 2 KB darauf schreiben, wird sie festgeschrieben und schlägt auf
forward()
die gleiche Weise fehl:Die Lösung liegt auf der Hand. Schreiben Sie einfach nicht in die Antwort im Servlet. Das liegt in der Verantwortung der JSP. Sie legen einfach ein Anforderungsattribut wie folgt fest
request.setAttribute("data", "some string")
und drucken es dann wie folgt in JSP aus${data}
. Auf unserer Servlets-Wiki-Seite erfahren Sie, wie Sie Servlets richtig verwenden.Eine andere wahrscheinliche Ursache ist, dass das Servlet einen Dateidownload in die Antwort schreibt, wonach z
forward()
. B. a aufgerufen wird.Dies ist technisch nicht möglich. Sie müssen den
forward()
Anruf entfernen . Der Endbenutzer bleibt auf der aktuell geöffneten Seite. Wenn Sie die Seite nach einem Dateidownload tatsächlich ändern möchten, müssen Sie die Dateidownloadlogik auf das Laden der Seite der Zielseite verschieben.Noch eine weitere mögliche Ursache ist , dass das
forward()
,sendRedirect()
odersendError()
Methoden werden über Java - Code eingebettet in einer JSP - Datei in Form von altmodischer Art und Weise aufgerufen<% scriptlets %>
, eine Praxis , das wurde seit 2001 offiziell abgeraten . Beispielsweise:Das Problem hierbei ist, dass JSP intern sofort Vorlagentext (dh HTML-Code) über schreibt,
out.write("<!DOCTYPE html> ... etc ...")
sobald er auftritt. Dies ist also im Wesentlichen das gleiche Problem wie im vorherigen Abschnitt erläutert.Die Lösung liegt auf der Hand. Schreiben Sie einfach keinen Java-Code in eine JSP-Datei. Dies liegt in der Verantwortung einer normalen Java-Klasse wie einem Servlet oder einem Filter. Auf unserer Servlets-Wiki-Seite erfahren Sie, wie Sie Servlets richtig verwenden.
Siehe auch:
Unabhängig von Ihrem konkreten Problem verliert Ihr JDBC-Code Ressourcen. Beheben Sie das auch. Hinweise finden Sie auch unter Wie oft sollten Connection, Statement und ResultSet in JDBC geschlossen werden?
quelle
break;
? Das würde bedeuten, dass sich der Code in einerfor
oder einerwhile
Schleife befand, in der der Codeforward()
während der Schleife wiederholt aufgerufen wurde (was daher falsch ist, sollten Sie nach der Schleife nur einmal vorwärts aufrufen - oder um die Schleife zu entfernen, da sie anscheinend nicht benötigt wird). .forward()
Anruf aus, während es das nicht tun sollte. JSF, mit dem ich vertraut bin, macht das auch, wenn Sie nicht ausdrücklich anrufenFacesContext#responseComplete()
. Diese verwandte Frage (die ich mit den Schlüsselwörtern "Grails verhindern Render-Antwort" gefunden habe) kann hilfreich sein: stackoverflow.com/questions/5708654/…forward()
Anruf durch, während dies nicht der Fall sein sollte. Die Lösung liegt auf der Hand: Sagen Sie ihm, dass er das nicht tun soll. Es hatte nämlich keine Ahnung, dass Sie programmgesteuert den Job übernommen haben, den Grails erledigen sollte: den Umgang mit der Antwort. Technisch habe ich keine Ahnung, wie ich Grails das sagen soll. Aber ich weiß, dass viele andere MVC-Frameworks dies unterstützen (angewiesen werden, die Antwort nicht selbst zu verarbeiten), wie JSF, Spring MVC, Wicket usw. Ich wäre überrascht, wenn dies in Grails unmöglich ist.Selbst das Hinzufügen einer return-Anweisung führt zu dieser Ausnahme, für die dieser Code nur eine Lösung darstellt:
quelle
In der Regel wird dieser Fehler angezeigt, nachdem Sie bereits eine Umleitung durchgeführt haben und dann versuchen, weitere Daten an den Ausgabestream auszugeben. In den Fällen, in denen ich dies in der Vergangenheit gesehen habe, ist es oft einer der Filter, der versucht, die Seite umzuleiten und dann immer noch zum Servlet weiterzuleiten. Ich kann nicht sofort feststellen, dass mit dem Servlet etwas nicht stimmt. Vielleicht möchten Sie auch einen Blick auf die vorhandenen Filter werfen.
Bearbeiten : Weitere Hilfe bei der Diagnose des Problems ...
Der erste Schritt zur Diagnose dieses Problems besteht darin, genau festzustellen, wo die Ausnahme ausgelöst wird. Wir gehen davon aus, dass es von der Linie geworfen wird
Möglicherweise stellen Sie jedoch fest, dass es später im Code ausgelöst wird, wenn Sie versuchen, eine Ausgabe in den Ausgabestream durchzuführen, nachdem Sie versucht haben, die Weiterleitung durchzuführen. Wenn es aus der obigen Zeile kommt, bedeutet dies, dass Sie irgendwo vor dieser Zeile entweder:
Viel Glück!
quelle
Dies liegt daran, dass Ihr Servlet versucht, auf ein nicht mehr vorhandenes Anforderungsobjekt zuzugreifen. Die Forward- oder Include-Anweisung eines Servlets stoppt die Ausführung des Methodenblocks nicht. Es wird wie bei jeder anderen Java-Methode bis zum Ende des Methodenblocks oder der ersten return-Anweisung fortgesetzt.
Der beste Weg, um dieses Problem zu beheben, besteht darin, die Seite (auf der Sie die Anforderung weiterleiten möchten) dynamisch gemäß Ihrer Logik festzulegen. Das ist:
und mache den vorwärts nur einmal in der letzten Zeile ...
Sie können dieses Problem auch mithilfe der return-Anweisung nach jedem forward () beheben oder jedes forward () in den if ... else-Block einfügen
quelle
Ich entfernte
Dann hat es bei mir gut funktioniert
quelle
Stoßen...
Ich hatte gerade den gleichen Fehler. Ich habe festgestellt, dass ich
super.doPost(request, response);
beim Überschreiben derdoPost()
Methode sowie beim expliziten Aufrufen des Konstrukts der Oberklasse aufgerufen habeSobald ich das auskommentiert habe
super.doPost(request, response);
doPost()
Aussage von innen auskommentierte, funktionierte sie perfekt ...Unnötig zu erwähnen, dass ich die
super()
Best Practices erneut lesen muss : pquelle
Sie sollten return hinzufügen Anweisung , während Sie den Flow weiterleiten oder umleiten.
Beispiel:
wenn vorwärts,
wenn umleiten,
quelle
Nach der Rücklaufmethode können Sie dies einfach tun:
Es wird den aktuellen Bereich brechen.
quelle