Servlet中response对象Commit状态的分析
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状态的分析相关推荐
- response java_java中response对象用法实例分析
本文实例讲述了java中response对象用法.分享给大家供大家参考,具体如下: 动作元素用于运行时在服务器端结束当前页面的执行,并从当前页面转向指定页面. 使用response对象的setHead ...
- jsp九大内置对象与servlet中java对象
jsp九大内置对象 request对象 : getParameter(String name)获取表单提交的数据 getParamegerNames() 获取客户端提交的所有参数名 getAttrib ...
- (转)Hibernate框架基础——在Hibernate中java对象的状态
http://blog.csdn.net/yerenyuan_pku/article/details/52760627 在Hibernate中java对象的状态 Hibernate把对象分为4种状态: ...
- 【Servlet】response对象给用户返回数据
response对象学习 * response对象学习:* 作用:* 用来响应数据到浏览器的一个对象* 使用:* 设置响应头* setHeader(String name,String value); ...
- python中response对象的属性,python爬虫response对象及通用代码框架
** - 1.Response对象的属性 ** 属性 说明 r.status_code HTTp请求的返回状态,200表示连接成功,404表示失败 r.text HTTp响应内容的字符串形式,即url ...
- servlet中response中文乱码
在servlet中,通过response向浏览器写中文,会出现乱码,那么response向浏览器写数据一共有两种方式 1.getOutputStream.write();字节流 2.PrintWrit ...
- python中response对象的方法_Response对象的常用属性
response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现. response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片. ...
- python中response对象的方法_响应对象response
响应对象response flask提供了Response最为视图最终返回的数据,但在代码编写过程中,我们通常很少直接使用Response对象,下面是几个常见的视图返回数据的方式 from flask ...
- python中response对象的方法_django HttpResponse对象 - 刘江的django教程
HttpResponse对象 阅读: 32804 评论:3 HttpResponse类定义在django.http模块中. HttpRequest对象是浏览器发送过来的请求数据的封装,HttpResp ...
最新文章
- access里面的表达式运用_Access表达式解析
- JavaScript重难点解析1(数据类型——var、let、const区别,类型补充,“===”、“typeof”、“instanceof”区别,Symbol数据类型)
- Ubuntu下一个好用的MySQL客户端tora
- 性能测试场景设计--混合业务场景下的脚本比例控制
- 2016河北省职称计算机考试试题及答案,2016年最新河北省职称计算机考试试题及答案..doc...
- 计算机视觉与人的视觉
- 常用JSON工具类JsonUtil封装
- G.7xx 音频压缩标准
- 为高效学习神器 Anki 部署一个专属同步服务器
- WinHTTP 会话概览
- Java 后端开发学习型网站汇总
- 有关傅里叶变换及其反变换的问题
- 爬虫奇遇记——标签去哪儿
- Effective C++ 条款20_宁以 pass-by-reference-to-const 替换 pass-by-value_不止于此
- STM32 NVIC
- 讨论:响一声就挂吸费电话频遭投诉 回拨话费被扣数百
- PTA 基础编程题 题解
- Python的起源和发展
- Eclipse各个版本及区别
- 播音提示器软件设计与实现
热门文章
- linux下升级 OpenSSH
- 好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题...
- 菜鸟学SSH(八)——Hibernate对象的三种状态
- httping 2.2.1 发布,测试 HTTP 连接的工具
- spring boot configuration annotation processor not found in classpath问题解决
- java利用intellij进行类型推断
- ImportError: cannot import name ‘python_2_unicode_compatible‘
- 网易云出现undefined symbol: fribidi_get_par_embedding_levels_ex
- 列名或所提供值的数目与表定义不匹配_关于功放与音箱的功率如何匹配
- [NOI2018]冒泡排序