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

服务端在把response提交到客户端之前,会使用一个缓冲区,并向该缓冲区内写入响应头和状态码,然后将所有内容flush(flush包含两个步骤:先将缓冲区内容发送至客户端,然后将缓冲区清空)。

这就标志着该次响应已经committed(提交)。


对于当前页面中已经committed(提交)的response:

就不能再使用这个response向缓冲区写任何东西  。(原文这里可能有错误

不可以再进行send***这类发送响应内容的操作(因为响应已经提交给客户端),

可以使用set***这类设置响应内容的函数(设置后无效,因为响应已经提交给客户端),

实测可以继续进行页面内容的输出(--此处存疑--不能理解--实测(执行response.getWriter().close()后会导致后续输出无效,但不会爆异常)),

实测可以进行request.getRequestDispatcher(“”).include(request, response);,

实测不可以进行request.getRequestDispatcher(“”).forward(request, response);(会抛出IllegalStateException异常Cannot forward after response has been committed),

(注:以为JSP中,response是一个JSP页面的内置对象,所以同一个页面中的response.XXX()是同一个response的不同方法,只要其中一个已经导致了committed,那么其它类似方式的调用都会导致 IllegalStateException异常)。


导致 response 状态变为 committed 的原因:

send***这类方法:向客户端发送状态码或重定向会直接提交响应。

刷新缓存:当response对象缓存区满时,或者使用response对象的flushbuffer方法会刷新response对象的缓存导致响应提交。

转发:将未提交的response通过forward转发可能会在转发目标的处理流程内被提交(include转发不会)。

forward指令和include指令很相似,它们都采用方法来导入目标。

执行forward指令时,response必须未提交,目标获得的response与原Servlet中同一个(ResponseFacade对象)。原先存放在response对象中的内容将会自动被清除,目标可以直接发出响应,之后程序流程回到原Servlet转发处继续执行,但是原Servlet似乎连页面内容都不可输出了。

而执行include指令时,目标获得的response与原Servlet中不是同一个(被换成了一个ApplicationHttpResponse对象,让目标无法对源请求做出实质响应,但是该对象进行提交操作后会导致原Servlet中的response对象也变为已提交,但仍然可以进行页面输出)。原Servlet把目标产生的响应的内容部分包含到自身响应的内容中,目标改变响应消息的状态码和响应头的语句执行结果将被忽略(即被调用的Servlet的响应只有内容部分会并入原Servlet的响应的内容部分中)。

关于forward和include的详细分析不在此处深究。


关于JSP中的flushBuffer

每一个JSP页面都有一个缓冲区,默认的缓冲区大小为8KB,如果缓冲区被占满的话,web服务器就会自动将response 进行commit,然后清空缓冲区(即flush)。

JSP内置对象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" %>


文参考:https://www.cnblogs.com/ismallboy/p/6785328.html

转载于:https://www.cnblogs.com/Leroscox/p/8305141.html

Servlet中response对象Commit状态的分析相关推荐

  1. response java_java中response对象用法实例分析

    本文实例讲述了java中response对象用法.分享给大家供大家参考,具体如下: 动作元素用于运行时在服务器端结束当前页面的执行,并从当前页面转向指定页面. 使用response对象的setHead ...

  2. jsp九大内置对象与servlet中java对象

    jsp九大内置对象 request对象 : getParameter(String name)获取表单提交的数据 getParamegerNames() 获取客户端提交的所有参数名 getAttrib ...

  3. (转)Hibernate框架基础——在Hibernate中java对象的状态

    http://blog.csdn.net/yerenyuan_pku/article/details/52760627 在Hibernate中java对象的状态 Hibernate把对象分为4种状态: ...

  4. 【Servlet】response对象给用户返回数据

    response对象学习 * response对象学习:* 作用:* 用来响应数据到浏览器的一个对象* 使用:* 设置响应头* setHeader(String name,String value); ...

  5. python中response对象的属性,python爬虫response对象及通用代码框架

    ** - 1.Response对象的属性 ** 属性 说明 r.status_code HTTp请求的返回状态,200表示连接成功,404表示失败 r.text HTTp响应内容的字符串形式,即url ...

  6. servlet中response中文乱码

    在servlet中,通过response向浏览器写中文,会出现乱码,那么response向浏览器写数据一共有两种方式 1.getOutputStream.write();字节流 2.PrintWrit ...

  7. python中response对象的方法_Response对象的常用属性

    response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现. response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片. ...

  8. python中response对象的方法_响应对象response

    响应对象response flask提供了Response最为视图最终返回的数据,但在代码编写过程中,我们通常很少直接使用Response对象,下面是几个常见的视图返回数据的方式 from flask ...

  9. python中response对象的方法_django HttpResponse对象 - 刘江的django教程

    HttpResponse对象 阅读: 32804 评论:3 HttpResponse类定义在django.http模块中. HttpRequest对象是浏览器发送过来的请求数据的封装,HttpResp ...

最新文章

  1. access里面的表达式运用_Access表达式解析
  2. JavaScript重难点解析1(数据类型——var、let、const区别,类型补充,“===”、“typeof”、“instanceof”区别,Symbol数据类型)
  3. Ubuntu下一个好用的MySQL客户端tora
  4. 性能测试场景设计--混合业务场景下的脚本比例控制
  5. 2016河北省职称计算机考试试题及答案,2016年最新河北省职称计算机考试试题及答案..doc...
  6. 计算机视觉与人的视觉
  7. 常用JSON工具类JsonUtil封装
  8. G.7xx 音频压缩标准
  9. 为高效学习神器 Anki 部署一个专属同步服务器
  10. WinHTTP 会话概览
  11. Java 后端开发学习型网站汇总
  12. 有关傅里叶变换及其反变换的问题
  13. 爬虫奇遇记——标签去哪儿
  14. Effective C++ 条款20_宁以 pass-by-reference-to-const 替换 pass-by-value_不止于此
  15. STM32 NVIC
  16. 讨论:响一声就挂吸费电话频遭投诉 回拨话费被扣数百
  17. PTA 基础编程题 题解
  18. Python的起源和发展
  19. Eclipse各个版本及区别
  20. 播音提示器软件设计与实现

热门文章

  1. linux下升级 OpenSSH
  2. 好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题...
  3. 菜鸟学SSH(八)——Hibernate对象的三种状态
  4. httping 2.2.1 发布,测试 HTTP 连接的工具
  5. spring boot configuration annotation processor not found in classpath问题解决
  6. java利用intellij进行类型推断
  7. ImportError: cannot import name ‘python_2_unicode_compatible‘
  8. 网易云出现undefined symbol: fribidi_get_par_embedding_levels_ex
  9. 列名或所提供值的数目与表定义不匹配_关于功放与音箱的功率如何匹配
  10. [NOI2018]冒泡排序