我观察到,虽然RequestDispatcher.forward(request,response)可以抛出IllegalStateException(如果提交了响应),RequestDispatcher.include(request,response)不会抛出IllegalStateException(即使之前已提交响应)
我已经在Tomcat 6.0.20上验证了这一点。
我知道include()方法没有声明可以抛出IllegalStateException,但它仍然是一个想法。
为什么servlet-api以这种方式设计的任何想法?恕我直言,如果已经提交了答复,则不允许进一步转发/包括。
答案 0 :(得分:4)
如果包含像Forward这样的IllegalStateException,则包含将无用。常见的用例是在servlet中编写页面的一部分,然后包含另一个资源的其他部分。因此,响应很可能已经开始或已经提交。
如果查看实现,Include不关心原始响应的状态,因为它使用全新的包装响应。从包含的资源返回后,包装响应的主体将附加到原始响应。虽然forward使用相同的响应,但它必须不受影响。
答案 1 :(得分:3)
包含只是将更多信息添加到响应中。它是否已经提交并不重要。前进(和重定向)只需要一个空白和干净的响应,因为它将由目标专门使用。