2010-12-06 7 views
2

J'avais un fichier JSP avec une balise c: redirect qui redirigeait le long d'un utilisateur vers une autre page.Qu'est-ce qui pourrait causer cette différence IllegalStateException dans JSP/Spring?

<!-- Yes, I know this loop is probably unnecessary, but I'm not fluent in jsp and have determined it is not the problem. :) --> 
<c:if test="${cmd.numberOfResults == 1}"> 
    <c:forEach items="${cmd.matches}" var="someVar"> 
     <c:redirect url="/loadThatResultInfo.html"/> 
    </c:forEach> 
</c:if> 

L'ancienne implémentation de l'objet de commande doit être mise à jour (là où j'interviens). La façon dont je le fais est en créant un objet générique "resultat de recherche" qui contient une instance de cet ancien objet (pour l'instant). Je reçois cette instance par une propriété dans cette classe générique, donc mon code est maintenant ceci:

<c:if test="${cmd.genericSearchObject.numberOfResults == 1}"> 
    <c:forEach items="${cmd.genericSearchObject.matches}" var="acct"> 
     <jsp:forward page="/loadThatResultInfo.html"/> <!-- new try! --> 
     <c:redirect url="/loadThatResultInfo.html"/> <!-- old try... --> 
     <% response.sendRedirect("/loadThatResultInfo.html"); %> <! new try! --> 
    </c:forEach> 
</c:if> 

Chacun de ces trois essais tout résultat dans IllegalStateExceptions de quelque sorte. Pourquoi cette modification entraîne-t-elle l'exception, en particulier si l'on considère que les lignes concernées - la redirection, et non les instances de classes modifiées/liées - sont à l'origine du problème?

Les modifications back-end ont été apportées en conséquence, référençant la propriété dans ma nouvelle classe englobante "generic" pour satisfaire l'ancienne fonctionnalité. Je sais que cela fonctionne parce que toutes les fonctionnalités connexes, à côté de ce que j'écris, fonctionne.

La recherche en ligne indique: - Je ne peux pas rediriger/transférer après qu'une soumission a déjà été soumise. Alors, comment étais-je capable de le faire avant? - La tentative de vidage d'un tampon déjà effacé provoque cela. Qu'est-ce qui a changé, qui l'efface maintenant par opposition à l'ancienne (première) mise en œuvre? - La taille du tampon de la page doit être plus grande. C'EST un que je ne comprends pas et aimerais vraiment pour la communauté de stackoverflow pour adresser; Je peux voir ma nouvelle classe causer des changements de taille qui auraient besoin de changements à traiter.

------- UNE AUTRE RÉPONSE! Tout d'abord, TOUJOURS ÉTABLIR LA SITUATION DANS LE CODE comme décrit par la réponse marquée. Cependant ... si vous êtes coincé et ne voulez pas faire cela, voici une solution rapide: javascript!

<script type="text/javascript"> 
    location='./yourPageToGoTo.html' 
</script> 
+2

Les traces de pile et les textes d'exception sont utiles, ne les ignorez pas. – skaffman

+0

Merci pour votre contribution, skaffman. C'est pourquoi j'avais inclus la dernière partie de ma réponse, étant que j'étais capable de changer la trace de la pile plusieurs fois en fonction de laquelle de ces explications je me suis concentré. Ne vous inquiétez pas si cela ne vous suffit pas; BalusC l'a apparemment trouvé suffisant. – Danny

Répondre

3

JSP fait partie de la réponse. Vous tentez de modifier la destination de la réponse dans un JSP au lieu d'un contrôleur. Si vous le faites à mi-chemin dans une JSP, il est trop tard, car les en-têtes de réponse HTTP peuvent déjà avoir été envoyés (la réponse est alors état). C'est un point de non-retour et un état illégal pour changer la réponse. Il est trop tard alors. Toute tentative aboutira à ce que le servletcontainer lance IllegalStateException: response already committed. Pour corriger cela, vous devez placer ce code pièce dans le haut du fichier JSP et prier que la réponse n'ait pas déjà été validée à ce moment-là (ce qui arrive généralement après avoir écrit environ 2 Ko de données dans la réponse) , en fonction de la configuration du servletcontainer). Cependant, JSP est toujours le mauvais endroit pour le travail, vous devriez plutôt le faire dans le contrôleur, avant en transmettant la réponse à la JSP (ou d'indiquer à l'intérieur du modèle le contrôleur en quelque sorte pour faire le travail, quand vous êtes en utilisant un framework MVC). "IllegalStateExceptions de quelque sorte" n'est pas un rapport d'erreur utile.

Questions connexes