gpt4 book ai didi

spring - 什么可能导致 JSP/Spring 中出现这种 IllegalStateException 差异?

转载 作者:行者123 更新时间:2023-12-04 06:40:06 25 4
gpt4 key购买 nike

我有一个带有 c: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。 为什么此更改会导致异常,特别是考虑到所涉及的行——重定向,而不是更改/绑定(bind)的类实例——导致问题?

相应地进行了后端更改,在我的新包含“通用”类中引用该属性以满足旧功能。我知道这是可行的,因为除了我所写的内容之外,所有相关功能都可以使用。

网上研究表明:
- 提交后我无法重定向/转发。那我以前是怎么做到的呢?
- 尝试刷新已清除的缓冲区会导致此问题。与旧的(第一个)实现相比,是什么改变使它现在被清除了?
- 页面缓冲区的大小需要更大。这是一个我不理解的问题,并且非常希望 stackoverflow 社区能够解决这个问题;我可以看到我的新类导致需要处理更改的大小更改。

-------- 另一个答案! --------

首先,始终按照标记答案的描述在代码中设置情况。但是......如果你被卡住并且不想这样做,这里有一个快速修复:javascript!
<script type="text/javascript">
location='./yourPageToGoTo.html'
</script>

最佳答案

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

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

关于spring - 什么可能导致 JSP/Spring 中出现这种 IllegalStateException 差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4362718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com