RequestDispatcher.forward()与RequestDispatcher.include()的区别

4
我注意到,虽然RequestDispatcher.forward(request, response)可能会抛出IllegalStateException(如果响应已提交),但RequestDispatcher.include(request, response)不会抛出IllegalStateException(即使在响应之前已提交)。
我已经在Tomcat 6.0.20上验证了这一点。
我知道include()方法没有声明可以抛出IllegalStateException,但这仍然是一个事后的想法。
你有任何关于为什么servlet-api被设计成这样的想法吗?在我看来,如果响应已经提交,就不应该允许进一步的转发/包含。
2个回答

4

如果Include像Forward一样抛出IllegalStateException,那么它就没有用处。常见的用例是在servlet中编写页面的一部分,然后从另一个资源中包含其他部分。因此,响应很可能已经启动或提交。

如果您查看实现,Include不关心原始响应的状态,因为它使用全新的封装响应。从包含的资源返回后,来自封装响应的正文将附加到原始响应中。而forward使用相同的响应,因此必须不被触及。


3

include指令只是为响应添加更多信息,无论它是否已提交都没有关系。forward(和redirect)只需要一个空白和干净的响应,因为它将被目标专用。


在这种情况下,这就引出了一个问题,“已提交的响应”是什么意思?根据我的理解,已提交的响应是指其OutputStream已被刷新。那么,为什么include()和forward()对于已提交的响应会有不同的行为呢?(即使响应已提交,include()也不会抛出异常)。感谢您的回复。 - divesh premdeep
2
include 只是将数据添加到当前响应中。forward/redirect 需要一个空白响应。你现在明白了吗?一旦响应提交,就没有任何返回点了。字节已经发送到客户端。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接