响应已经提交

时间:2013-06-25 03:03:03

标签: java jsp struts illegalstateexception

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

function chkArea(){

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

现在当我提交取消时,我在用户界面中收到以下消息,

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中看到任何错误。什么似乎是错的?有什么建议吗?

2 个答案:

答案 0 :(得分:4)

首先,问题不在您的示例 1 中的JSP或JS中。问题出在你的servlet获得“... / abcHandler.do?operation=view;”时所做的事情。请求。

问题在于您尝试执行需要更改HTTP响应标头的内容...在标头发送后。这就是异常/消息所说的内容。 (一旦servlet框架开始编写响应,响应就会“提交”。当某些东西打开servlet输出流/编写器时,通常触发...准备写入回应机构。)

为了给您一个正确的诊断,以及如何解决特定问题的合理建议,我们需要查看处理上述请求的Servlet / JSP代码。

“非法评估为空的网址”消息有点难以置信。它可能发生在IllegalStateException之前或之后。

(一种可能性是你的JSP代码试图用一些意外null的'url'属性来做某事,即触发异常。然后容器的错误处理程序试图设置不同的响应状态...和 失败,因为响应已经提交。)

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


1 - 实际上,你错过了url初始化的结束语...但我认为这只是一个转录错误。

答案 1 :(得分:0)

当您从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