java.lang.IllegalStateException: Ne peut pas (avant | sendRedirect | créer une session) après la réponse a été commis
Cette méthode lève
java.lang.IllegalStateException: Ne peut pas en avant après la réponse a été commis
et je suis incapable de repérer le problème. Toute aide?
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);
}
- Il est difficile de le voir comme ça, mais il semble que vous avez déjà envoyer sur la sortie avant de votre avance. Pourriez vous s'il vous plaît d'impression de ce code et de vérifier si vous n'avez pas de filtre en place ?
Vous devez vous connecter pour publier un commentaire.
Un malentendu commun parmi les partants, c'est qu'ils pensent que l'appel d'un
forward()
,sendRedirect()
, ousendError()
serait comme par magie de sortie et de "sauter" de la méthode de bloc, par les présentes, en ignorant le reste du code. Par exemple:Donc c'est effectivement pas vrai. Ils le font certainement pas de se comporter différemment de toutes les autres méthodes de Java (attendez-vous de
System#exit()
bien sûr). Lorsque lesomeCondition
dans l'exemple ci-dessus esttrue
et vous êtes donc appelforward()
aprèssendRedirect()
ousendError()
sur la même requête/réponse, puis la chance est grand que vous obtiendrez l'exception:Si le
if
déclaration appelle unforward()
et vous êtes ensuite appelersendRedirect()
ousendError()
, puis au dessous exception sera levée:Pour corriger cela, vous devez soit ajouter un
return;
déclaration après... ou d'introduire un bloc else.
À naildown la cause racine dans votre code, il suffit de chercher pour n'importe quelle ligne qui appelle une
forward()
,sendRedirect()
ousendError()
sans sortir de la méthode de bloquer ou de sauter le reste du code. Cela peut être à l'intérieur de la même servlet avant la ligne de code, mais aussi dans une servlet ou un filtre qui a été appelé avant la servlet particulier.En cas de
sendError()
, si votre seul but est de définir le statut de la réponse, utilisezsetStatus()
à la place.Une autre cause probable est que la servlet écrit à la réponse tout un
forward()
sera appelé, ou qui a été appelé dans la même méthode.La réponse de la taille de la mémoire tampon par défaut dans la plupart des serveur de 2KB, donc si vous écrivez plus de 2 KO, puis il sera commis et
forward()
échoue de la même façon:Solution est évidente, il suffit de ne pas écrire la réponse dans la servlet. C'est la responsabilité de la JSP. Vous venez de définir un attribut de la demande comme
request.setAttribute("data", "some string")
, puis l'imprimer en JSP comme${data}
. Voir aussi nos Servlets page wiki pour apprendre à utiliser les Servlets le droit chemin.Voir aussi:
Sans rapport avec à votre problème concret, votre code JDBC est une fuite de ressources. Correctif ainsi. Pour des conseils, voir aussi Combien de fois devrait-Connection, Statement et ResultSet être fermé dans JDBC?
break;
? Cela signifie que le code a été à l'intérieur de certainesfor
ouwhile
boucle dans laquelle leforward()
a été appelé à plusieurs reprises au cours de la boucle (qui est donc incorrect, vous devez d'appel qu'une seule fois APRÈS la boucle --ou pour se débarrasser de la boucle, comme c'est apparemment pas nécessaire).forward()
appel alors qu'il ne devrait pas faire ça. JSF, dont je suis familier avec, est-ce que cela, sauf si vous explicitement appelFacesContext#responseComplete()
. Cette question (que j'ai trouvé à l'aide de mots-clés "graal empêcher de rendre réponse") peut être utile: stackoverflow.com/questions/5708654/...forward()
appel alors qu'il ne devrait pas faire ça. La solution est fonctionnellement évident: dites-lui de ne pas le faire. Il avait à savoir aucune idée de ce que vous avez par programmation pris en charge le travail Graal était censé faire: de la manipulation de la réponse. Techniquement, je n'ai aucune idée de comment dire Graal que. Mais je sais que beaucoup d'autres frameworks MVC prend en charge ce (chargé de ne pas manipuler la réponse par lui-même), comme JSF, Spring MVC, Wicket, etc. Je serais surpris si ce qui est impossible dans Graal.même l'ajout d'une instruction de retour soulève cette exception, pour qui seule solution, c'est ce code:
En général, vous voyez cette erreur après que vous avez déjà fait une redirection, puis essayez à la sortie de certains de davantage de données dans le flux de sortie. Dans le cas où j'ai vu cela dans le passé, il est souvent l'un des filtres qui essaie de rediriger la page, et puis encore avant dans la servlet. Je ne vois rien immédiatement de mal avec la servlet, de sorte que vous voudrez peut-être essayer d'avoir un coup d'oeil à tous les filtres que vous avez en place.
Modifier: Certains plus d'aider à diagnostiquer le problème...
La première étape pour diagnostiquer ce problème est de déterminer exactement où l'exception est levée. Nous supposons qu'il est en train d'être levée par la ligne
Mais vous pourriez trouver que c'est d'être jeté plus loin dans le code, là où vous êtes en essayant de sortie vers le flux de sortie après que vous avez essayé de faire l'avant. S'il est en provenance de la ligne ci-dessus, cela signifie que quelque part avant de cette ligne, vous devez soit:
Bonne chance!
C'est parce que votre servlet est en train d'essayer d'accéder à une demande d'objet qui n'existe même plus..
Une servlet à aller de l'avant ou de l'instruction include n'interrompt pas l'exécution de la méthode bloc. Il continue à la fin de la méthode du bloc ou de la première instruction de retour, tout comme toute autre méthode de java.
La meilleure façon de résoudre ce problème il suffit de régler la page (où vous supposez à transmettre la demande) de manière dynamique selon votre logique. Qui est:
et de ne les transmettre qu'une seule fois à la dernière ligne...
vous pouvez également résoudre ce problème à l'aide de l'instruction return après chaque forward() ou mettre chaque forward() dans le bloc if...else
J'ai enlevé
Puis il a travaillé très bien pour moi
Bosse...
J'ai juste eu le même message d'erreur. J'ai remarqué que j'étais en invoquant
super.doPost(request, response);
lors de la substitution de ladoPost()
la méthode comme référence explicitement le constructeur de la superclasseDès que j'ai commenté le
super.doPost(request, response);
de l'intérieurdoPost()
déclaration qu'il a parfaitement fonctionné...Inutile de dire, j'ai besoin de re-lire sur
super()
meilleures pratiques :pVous devez ajouter retour déclaration alors que vous êtes en train d'envoyer ou de rediriger le flux.
Exemple:
si forwardind,
si la redirection,
Après le retour de l'avant méthode, vous pouvez simplement faire ceci:
Il va se casser la portée actuelle.