强制在servlet中提交响应

时间:2013-12-15 18:34:32

标签: jsp java-ee servlets forward

代码胜于解释:

在我的 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)之后处理任何进一步的指令:

  • (1)已设置
  • (2)写一些话要说我希望(1)被使用
  • (3)不被阅读

我该怎么做?

2 个答案:

答案 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条件来检查是否要转发请求,或者刷新响应。