我观察到,虽然RequestDispatcher.forward(request,response)可以抛出IllegalStateException (如果响应已提交),但RequestDispatcher.include(request,response)不会抛出IllegalStateException(即使之前已经提交了响应)。
我已经在Tomcat 6.0.20上验证了这一点。
我知道include()方法并没有声明可以抛出一个IllegalStateException,但它仍然是一个事后的想法。
关于为什么servlet-api是这样设计的,你有什么想法吗?IMHO,如果响应已提交,则不应允许进一步转发/包含。
发布于 2009-12-11 10:34:24
如果Include抛出像Forward一样的IllegalStateException,那么Include将是无用的。常见的用例是在servlet中编写页面的一部分,然后包含来自另一个资源的其他部分。因此,响应很可能已经启动或提交。
如果您查看实现,Include并不关心原始响应的状态,因为它使用了全新的包装响应。从包含的资源返回后,包装响应中的正文被附加到原始响应中。而转发则使用相同的响应,因此它必须保持不变。
发布于 2009-12-11 00:00:33
include只是将更多信息添加到响应中。它是否已经提交并不重要。转发(和重定向)只需要一个空白和干净的响应,因为它将由目标独占使用。
https://stackoverflow.com/questions/1880669
复制相似问题