代码胜于解释:
在我的 servlet :
中...
this.getServletContext
.getRequestDispatcher("..../foo.jsp")
.forward(request, response); // (1)
// (2)
this.getServletContext
.getRequestDispatcher("..../bar.jsp")
.forward(request, response); // (3)
...
如果我调用与此servlet相关的url,我会收到以下错误:
“提交响应后无法转发”
因为(1)设置jsp使用,(3)尝试设置另一个jsp。 (注意:我知道这是一个不好的例子,但这是提供一个最小的代码)。
我想要的是“停止”servlet在(1)之后处理任何进一步的指令:
我该怎么做?
答案 0 :(得分:0)
一个简单的解决方案就是拥有这样的东西:
this.getServletContext.getRequestDispatcher("..../foo.jsp")
.forward(request, response);
if(!response.isCommitted()) {
this.getServletContext.getRequestDispatcher("..../bar.jsp")
.forward(request, response);
}
来自Java docs:
布尔
isCommited()
:返回一个布尔值,指示响应是否已提交。一个 已提交的响应已有其状态码和标头 写入。
或者,如果如上所述,第一个代码块依赖于具有有限权限的用户:
if (isUserRestricted()) {
this.getServletContext.getRequestDispatcher("..../foo.jsp")
.forward(request, response);
} else {
this.getServletContext.getRequestDispatcher("..../bar.jsp")
.forward(request, response);
}
答案 1 :(得分:0)
好的,首先当响应被激活或关闭时转发请求时会导致异常,例如关闭PrintWriter或刷新ServletOutputStream并在之后转发。您可以在Request Dispatcher中使用include而不是forward,该方法调用资源但返回给调用者。因此,我建议您使用if条件来检查是否要转发请求,或者刷新响应。