`
quanhy5
  • 浏览: 59039 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

response that is already committed 粘粘更健康

 
阅读更多
[/size]异常一:java.lang.IllegalStateException:Cannot   forward   a   response   that   is   already   committed
异常二:IllegalStateException:response already commited
异常三:IllegalStateException:getOutputStream() has already been called for this request


前言:

  response是服务端对客户端请求的一个响应,其中封装了响应头、状态码、内容(也就是最终要在浏览器上显示的HTML代码或者其他数据格式)等,

  服务端在把response提交到客户端之前,会使用一个缓冲区,并向该缓冲区内写入响应头和状态码,然后将所有内容flush(flush包含两个步骤:先将缓冲区内容发送至客户端,然后将缓冲区清空)。这就标志着该次响应已经committed(提交)。对于当前页面中已经committed(提交)的response,就不能再使用这个response向缓冲区写任何东西  (注:以为JSP中,response是一个JSP页面的内置对象,所以同一个页面中的response.XXX()是同一个response的不同方法,只要其中一个已经导致了committed,那么其它类似方式的调用都会导致 IllegalStateException异常)。



对于异常一:

问题描述:

在执行一段代码后,最后执行request.getRequestDispatcher(跳转页面URL).forward(resquest,response)进行页面跳转时,报了此错

问题原因:

1.在forwar之前,response就已经commit到浏览器端了。

导致response commit的原因包括:forward, redirect, flushBuffer

2.前两个原因都是指在forward之前就已经进行了页面跳转动作(forward, redirect)。

至于flushBuffer,每一个JSP页面都有一个缓冲区,默认的缓冲区大小为8KB,如果缓冲区被占满的话,web服务器就会自动将response 进行commit,然后清空缓冲区(即flush),所以再进行页面跳转的时候就会报response已经被commit了。

内置对象out相关方法

public abstract void clear() throws java.io.IOException 清除缓冲区中的内容。如果缓冲区已经被刷新,clear()方法将抛出IOException异常
public abstract void clearBuffer() throws java.io.IOException 清除缓冲区中的当前内容。这个方法和clear()方法的区别是,如果缓冲区已经被刷新,这个方法不会抛出IOException异常
public abstract void close() throws java.io.IOException 刷新缓冲区,关闭输出流。注意,我们在编写JSP页面时,不需要显式地去调用这个方法,因为在JSP容器所生成的代码中会自动包含对close()方法的调用。

public abstract void flush() throws java.io.IOException 刷新缓冲区,两个步骤:1,提交response  2.清空缓冲区
public int getBufferSize()  获得缓冲区大小,同response.getBufferSize()相同
public abstract int getRemaining() 获得缓冲区中未使用的字节数
public boolean isAutoFlush() 判断out对象是否是自动刷新
<%@ page autoFlush="true" %> <%--Default--%>

内置对象response相关方法

response.isCommitted() 确认response是否已经committed
response.flushbuffer(); 同out.flush相同



解决方法:

增大缓冲区大小:     

<%@ page buffer="10kb" %>
[/size]
分享到:
评论

相关推荐

    Cannot forward after response has been committed

    "Cannot forward after response has been committed" 是一个在Java Web开发中常见的错误,通常与Servlet、Filter或控制器逻辑有关。这个错误表明服务器已经完成了对HTTP响应的处理,并将其发送到客户端,然后试图...

    Efficient Proofs that a Committed Number Lies in an Interval.pdf

    与以往的方法相比,该方法不仅更有效率(计算和传输的数据量较少),而且更为精确(能够准确地证明数字属于指定的区间而非更大区间)。此技术在多种应用领域如电子现金、群组签名、公开可验证的秘密共享等中具有重要...

    HP-dos-AMDbrand.GHO

    HP部分笔记本,重写BIOS或更换主板后,开机提示“WANING!!-Machine is not in committed state!”屏幕出现"主机处于未定义状态"警告。

    a project model for the FreeBSD Project.7z

    During the Core elections in 2002, Mark Murray stated “I am opposed to a long rule-book, as that satisfies lawyer-tendencies, and is counter to the technocentricity that the project so badly needs.”...

    response jsp 中的重要知识点

    `resetBuffer()`可以清空缓冲区,`isCommitted()`检查是否已提交响应。 9. **关闭响应** 一旦响应被提交,就不能更改。但可以通过`reset()`来清除所有设置,使响应回到初始状态。然而,一旦客户端开始接收数据,就...

    微软内部资料-SQL性能优化3

    If a match is found, it knows that resource is already locked. Some of the resources have “sub-resources.” The followings are sub-resources displayed by the sp_lock output: Database Lock Sub-...

    servlet2.4doc

    A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. Filters perform filtering in the ...

    HttpWebRequest出错.Section=ResponseHeader Detail=CR

     Section=ResponseHeader Detail=CR 后面必须是 LF The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 主体意思是微软没有容忍不符合RFC 822...

    微软内部资料-SQL性能优化2

    A reference to an invalid page (a page that is not in your working set) is referred to as a page fault. Assuming the page reference does not result in an access violation, a page fault can be either ...

    temboard-master_python_Committed_

    【标题】"temboard-master_python_Committed_" 指向的是一个与 PostgreSQL 数据库管理和监控相关的项目,其中可能包含了使用 Python 编写的工具或模块。"Committed" 在这里很可能是指 PostgreSQL 的事务隔离级别之一...

    55 Read Committed隔离级别是如何基于ReadView机制实现的?l.pdf

    在探讨数据库事务隔离级别时,Read Committed(简称RC)是一个重要的概念。RC隔离级别意味着,当事务运行期间,如果别的事务对数据进行修改并且提交了,当前事务是可以读取到这些修改后的数据的。然而,这也导致了不...

    Beginning ASP.NET for Visual Studio 2015

    Over 38 million websites are currently using ASP.NET, and the new upgrade is already leading to increased adoption. Programmers need to master v6 to remain relevant as web development moves forward. ...

    svn关键词BASE, HEAD, COMMITTED, PREV的深入理解.rar

    在版本控制系统Subversion(简称svn)中,有四个关键词经常被使用:BASE、HEAD、COMMITTED和PREV,它们是用来追踪文件和目录在不同版本状态的关键。这些关键词对于理解和操作svn仓库至关重要,尤其是在进行协同开发...

    Committed - Test Version-crx插件

    语言:English (United States) 管理您的NewTab中的每周目标和Todos *警告* 这是一个不稳定的版本,用于测试未发布的功能。 稳定版本:https://chrome.google.com/webstore/detail/commited-newtab-todo-和/...

    解决Struts2中下载文件时点击取消按钮后台报错问题

    在读取文件并写入输出流的过程中,我们检查`ServletResponse`是否已提交(`isCommitted()`)以及`ServletOutputStream`是否已被关闭(`isClosed()`)。如果任一条件满足,就立即跳出循环,避免不必要的数据传输和...

    中关村在线

    PER_TIME_IN_GC_COUNTER_009_HELP=% Time in GC is the percentage of elapsed time that was spent in performing a garbage collection (GC) since the last GC cycle. This counter is usually an indicator of ...

    行业-55 Read Committed隔离级别是如何基于ReadView机制实现的?l.rar

    理解这一机制有助于我们更好地设计和优化数据库事务,以满足不同场景下的需求。在实际应用中,根据业务特性选择合适的隔离级别至关重要,因为不同的隔离级别在并发性能和数据一致性之间有不同的权衡。

Global site tag (gtag.js) - Google Analytics