2010-12-06 3 views
2

У меня был JSP-файл с тегом c: redirect, который пересылал бы пользователя по другой странице.Что может быть причиной этого несоответствия IllegalStateException в 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> 

Старая реализация объекта команды нуждается в обновлении (где я вхожу). То, как я это делаю, - это создать общий объект «результат поиска», который содержит экземпляр этого старого объекта (пока). Я получаю этот экземпляр через свойство в этом обобщенном классе, так что мой код теперь это:

<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> 

Каждый из этих трех попыток всего результат в IllegalStateExceptions некоторого рода. Почему это изменение вызывает исключение, особенно учитывая, что связанные строки - перенаправление, а не экземпляры измененных/связанных классов - вызывают проблему?

Соответствующие изменения были сделаны соответствующим образом, ссылаясь на свойство в моем новом охватывающем «универсальном» классе, чтобы удовлетворить старые функции. Я знаю, что это работает, потому что все связанные функции, помимо того, о чем я пишу, работают.

Исследования онлайн показывают: - Я не могу перенаправить/переслать после отправки. Тогда как я мог это сделать раньше? - Попытка очистить уже очищенный буфер вызывает это. Что изменилось, что делает его очищенным сейчас, в отличие от более старой (первой) реализации? - Размер буфера страницы должен быть больше. ЭТО - это тот, который я не понимаю, и мне очень понравится сообщество stackoverflow. Я вижу, как мой новый класс вызывает изменения размера, которые потребуются для изменения.

------- ДРУГОЙ ОТВЕТ! -------

Прежде всего, ВСЕГДА НАСТРОЙИТЕ СИТУАЦИЮ В КОДЕ, как описано отмеченным ответом. Однако ... если вы застряли и не хотите этого делать, вот быстро исправить: javascript!

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

«IllegalStateExceptions of some sort» - не полезный отчет об ошибке. Трассировки стека и тексты исключений полезны, не игнорируйте их. – skaffman 2010-12-06 08:23:56

ответ

3

JSP - часть ответа. Вы пытаетесь изменить назначение ответа в JSP вместо контроллера. Если вы делаете это на полпути в JSP, то уже слишком поздно, потому что заголовки HTTP-ответа могут уже отправляться (ответ тогда находится в , зафиксированном). Это точка невозврата и незаконное состояние для изменения ответа. Слишком поздно. Любая попытка приведет к тому, что servletcontainer выкинет IllegalStateException: response already committed.

Чтобы исправить это, вам нужно поместить этот фрагментарный код в самый верх JSP-файла и молиться, чтобы ответ еще не был зафиксирован в этой точке (что обычно происходит после записи около 2 Кбайт данных в ответ , в зависимости от конфигурации servletcontainer). Тем не менее, JSP по-прежнему не подходит для работы, вы должны сделать это в контроллере, до, перенаправляя ответ JSP (или инструктируя из модели контроллер как-то выполнять работу, когда вы используя структуру MVC).