2013-12-15 36 views
0

代码比解释更被COMMITED以下错误:强制响应在servlet

“无法响应一直致力于向前后”

因为(1)设置jsp使用,(3)尝试设置另一个jsp。 (注意:我知道这是一个不好的例子,但这是提供一个最小的代码)。

我要的是 “停止” 的servlet来处理之后的任何进一步的说明(1):

  • (1)为
  • (2)写的东西说我想要的(1)使用
  • (3)不应理解

我怎么能这样做?

+0

我对你的例子有点困惑 - 如果你总是想要1)被使用,为什么不删除3?如果有条件检查,为什么不把它们都包装在'if/else'块中? – anotherdave

+0

@anotherdave(1)从类的静态方法中调用,以便在用户不打算访问页面时重定向,这样我只需告诉我的团队在他们编码的每个servlet的开始处复制粘贴功能,避免在这里和那里阻塞所有的代码。 – user544262772

回答

0

一个简单的解决办法是有这样的事情:

this.getServletContext.getRequestDispatcher("..../foo.jsp") 
    .forward(request, response); 

if(!response.isCommitted()) { 
    this.getServletContext.getRequestDispatcher("..../bar.jsp") 
     .forward(request, response); 
} 

Java docs

布尔isCommited()

返回boolean值,指示反应一直承诺。一个 承诺的响应已经有其状态代码和标题 书面。


或者,如果你上面说,代码的第一个块是依赖于用户具有有限权限:

if (isUserRestricted()) { 
    this.getServletContext.getRequestDispatcher("..../foo.jsp") 
     .forward(request, response); 
} else { 
    this.getServletContext.getRequestDispatcher("..../bar.jsp") 
     .forward(request, response); 
} 
0

好的,第一的例外是当你将请求转发引起例如关闭PrintWriter或刷新ServletOutputStream,然后转发。您可以在Request Dispatcher中使用include而不是forward来调用资源,但返回给调用者。所以我建议你有一个if条件来检查是否要转发请求,或刷新响应。