2

我有一个带有 ac:redirect 标记的 JSP 文件,它会沿着用户转发到另一个页面。

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

1 回答 1

3

JSP 是响应的一部分。您试图在 JSP 中而不是在控制器中更改响应目标。如果您在 JSP 中半途执行此操作,则为时已晚,因为 HTTP 响应标头可能已经发送(此时响应处于已提交状态)。这是一个不归路,也是改变响应的非法状态。那时为时已晚。任何尝试都会导致 servletcontainer 抛出IllegalStateException: response already committed

要解决此问题,您需要将这段代码放在 JSP 文件的最顶部,并祈祷此时尚未提交响应(这通常会在将大约 2KB 的数据写入响应后发生,具体取决于servlet 容器配置)。但是,JSP 仍然是该工作的错误位置,您应该在控制器中执行此操作,然后将响应转发给 JSP(或在模型中指示控制器以某种方式完成工作,当您使用MVC 框架)。

于 2010-12-06T11:35:56.220 回答