Что может быть причиной этого несоответствия IllegalStateException в JSP / Spring? - PullRequest
2 голосов
/ 06 декабря 2010

У меня был JSP-файл с тегом ac: redirect, который перенаправлял пользователя на другую страницу.

<!-- 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. Почему это изменение вызывает исключение, особенно учитывая, что задействованные строки - редирект, а не экземпляры измененного / связанного класса - вызывают проблему?

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

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

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

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

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

1 Ответ

3 голосов
/ 06 декабря 2010

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

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

...