我观察到虽然 RequestDispatcher.forward(request, response) 可以抛出 IllegalStateException(如果响应已提交),但 RequestDispatcher.include(request, response) 不会抛出 IllegalStateException(即使之前已提交响应) .
我已经在 Tomcat 6.0.20 上验证过了。
我知道 include() 方法没有声明可以抛出 IllegalStateException,但这仍然是事后的想法。
关于为什么这样设计 servlet-api 的任何想法?恕我直言,如果已提交响应,则不应允许进一步转发/包含。
最佳答案
如果像 Forward 一样抛出 IllegalStateException,Include 就没有用了。常见的用例是在 servlet 中编写页面的一部分,然后包含来自另一个资源的其他部分。因此响应很可能已经开始或已提交。
如果您查看实现,Include 不关心原始响应的状态,因为它使用全新的包装响应。从包含的资源返回后,包装响应的正文将附加到原始响应。转发使用相同的响应,因此它必须保持不变。
关于tomcat - RequestDispatcher.forward() 与 RequestDispatcher.include(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1880669/