I had a JSP file with a c:redirect tag that would forward along a user to another page.
<!-- 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>
The old implementation of the command object is needs updating (where I come in). The way I’m doing so is by creating a generic “search result” object which contains an instance of that old object (for now). I get that instance through a property in that generic class, so my code is now this:
<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>
Each of those three tries all result in IllegalStateExceptions of some sort. Why does this change cause the exception, especially considering that the lines involved — the redirect, not the changed/bound class instances — are causing the problem?
Back-end changes were made accordingly, referencing the property within my new encompassing “generic” class to satisfy the old functionality. I know this works because all related functionality, beside what I’m writing about, works.
Research online indicates:
– I can’t redirect/forward after a submission has already been submitted. Then how was I able to do it before?
– Attempt to flush an already-cleared buffer causes this. What changed that makes it cleared now as opposed to the older (first) implementation?
– The size of the page’s buffer needs to be bigger. THIS is one I don’t understand and would really love for the stackoverflow community to address; I can see my new class causing size changes that would need changes to be dealt with.
——- ANOTHER ANSWER! ——-
First and foremost, ALWAYS SET UP THE SITUATION IN THE CODE as described by the marked answer. However… if you’re stuck and don’t want to do that, here’s a quick fix: javascript!
<script type="text/javascript">
location='./yourPageToGoTo.html'
</script>
JSP is part of the response. You’re attempting to change the response destination in a JSP instead of in a controller. If you do this halfway in a JSP, then it’s too late, because the HTTP response headers may already have been sent (the response is then in committed state). This is a point of no return and an illegal state for changing the response. It’s too late then. Any attempt will result in the servletcontainer to throw
IllegalStateException: response already committed.To fix this, you need to put this piece code in the very top of JSP file and pray that the response hasn’t already been committed at that point (which will usually happen after writing about 2KB of data to the response, depending on the servletcontainer config). However, JSP is still the wrong place for the job, you should rather do this in the controller, before forwarding the response to the JSP (or to instruct from within the model the controller somehow to do the job, when you’re using a MVC framework).