【问题标题】:Response has aready been committed响应已经提交
【发布时间】:2013-06-21 17:27:41
【问题描述】:

我有一个取消按钮,用于刷新值。现在我已将它们转换为刷新或重新加载页面并移至只读页面。所以改取消按钮来调用这样的函数,

function chkArea(){

        var url='<c:out value="${model.contextPath}"/>/abcHandler.do?operation=view;
        document.forms[0].action=url;
        document.forms[0].submit();
    }

现在,当我提交取消时,我在 UI 中收到以下消息,

java.lang.IllegalStateException: Response has already been committed    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.EvermindHttpServletResponse.resetBuffer(EvermindHttpServletResponse.java:1892)    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.ServletRequestDispatcher.unprivileged_forward(ServletRequestDispatcher.java:249)  at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.ServletRequestDispatcher.access$100(ServletRequestDispatcher.java:51) at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.ServletRequestDispatcher$2.oc4jRun(ServletRequestDispatcher.java:193) at oracle.oc4j.security.OC4JSecurity.doPrivileged(OC4JSecurity.java:284)........

控制台显示如下错误:

javax.servlet.ServletException: The "url" attribute illegally evaluated to "null" or "" in &lt;import&gt;
    at com.evermind.server.http.EvermindPageContext.handlePageThrowable(EvermindPageContext.java:899)
    at com.evermind.server.http.EvermindPageContext.handlePageException(EvermindPageContext.java:816)

我在 JS 或 JSP 中看不到任何错误。似乎有什么问题?有什么建议吗?

【问题讨论】:

  • 对于 Google 员工:如果您使用的是 externalContext.redirect(),请尝试在其周围设置此条件:if (!externalContext.isResponseCommitted()) { }(这就是我收到此异常的原因。)

标签: java jsp struts illegalstateexception


【解决方案1】:

首先,问题不在于您的示例中的 JSP 或 JS1。问题在于您的 servlet 在获得“.../abcHandler.do?operation=view;”时会做什么请求。

问题是您正在尝试做一些需要更改 HTTP 响应标头的事情……在标头发送后。这就是异常/消息所说的。 (一旦 servlet 框架开始写入响应,就会“提交”响应。这通常会在 something 打开 servlet 输出流/写入器时触发...准备写入响应正文。)

为了给你一个正确的诊断,以及如何解决这里的具体问题的明智建议,我们需要查看处理上述请求的 Servlet/JSP 代码。

“url 被非法评估为 null”消息有点难以放置。它可能发生在 IllegalStateException 之前或之后。

(一种可能性是您的 JSP 代码正在尝试使用某些意外为 null 的“url”属性执行某些操作,这会触发异常。然后容器的错误处理程序正在尝试设置不同的响应状态.. . 并且 那个 失败了,因为响应已经提交了。)

总之,如果没有更多信息,就无法弄清楚根源问题是什么;即代码。


1 - 实际上,您缺少 url 初始化的结束引号......但我认为这只是一个转录错误。

【讨论】:

    【解决方案2】:

    当您在 jsp 的输出流上写入然后再次对其执行一些操作时,会出现此错误。这会导致IllegalStateException。当响应已经提交时,您不应执行任何操作。通过提交,我的意思是响应被发送回客户端。一个常见的场景是

     OutputStream stream = response.getOutPutStream();
      stream.write("something here");
      stream.flush();
     RequestDispatcher rd = request.getRequestDispatcher("someFile.jsp");
       rd.forward(request, response); // You can't do this because stream is already written
    

    【讨论】:

    • 是的,所以我尝试了 autoflush="true"。即使这样也会出现同样的错误。
    • 确保你的 jsps 中没有类似上面的代码
    • 我没有上面的任何东西。我的动作类只是转发到一个 JSP。
    • stream.flush() 导致响应被提交。所以我觉得你的autoflush = true 无济于事。它会增加问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2016-03-08
    • 2018-11-30
    • 2018-09-16
    • 2012-08-25
    相关资源
    最近更新 更多