关于response.getWriter()写回数据的实际发生时间点
只能说自己平时太粗心了,一些细节问题虽然几次路过,都没有注意过,也没有好好想过.
同事负责的一段微信模块的小逻辑,为了防止微信服务器认为没有接收到请求而重发消息,所以再收到微信服务器发回的消息后,马上用response.getwriter()方法写回一个success消息,在这个方法后开始执行费时的业务逻辑.这个看起来好像没问题,逻辑上好像也ok,但是实际执行的效果却是,response.getwriter()方法虽然执行了,但是并没有及时将数据返回给微信服务器,而是等到之后的代码全都执行完了才真正返回数据.
当然解决这个问题的方法多得是,简单的方式业务逻辑直接新起个线程任务执行就好了.但这不是这里讨论的重点.问题是为何这个response.getwriter()方法写回的数据没有及时返回呢?
简单回顾一下servlet的执行流程:
Web浏览器-->发出http请求-->Web容器(首次访问的话创建目标Servlet对象)-->创建请求和响应对象(request和response)
-->调用Servlet的service(ServletResquest,ServletRespons)并且将刚才创建的请求对象和响应对象对象传递给Servlet
-->Servlet程序从请求对象中读取请求信息,将响应信息写入到响应对象当中-->service方法结束,程序返回到web容器
->web容器从相应对象中读取响应信息
->将响应星系生成HTTP消息返回给浏览器
重点在于红字和绿字的部分,简单的说我们的请求和返回依赖的是请求和返回对象,在请求和返回对象没有返回的情况下,实际容器并没有收到我们返回的任何信息.而从servlet的执行流程中也能看出来,实际上请求和响应对象是在servlet的service()方法执行结束后,将所有的请求和返回信息都封装进请求和响应对象中后,才返回给web容器,web容器从这些对象中读取数据才返回给请求方.所以response.getWriter()写回的数据也是仅仅是写入response对象中,在response对象没有真正返回的时候,请求方是接收不到我们的返回信息的.
整理一下servlet流程,这个问题就很好理解了,但是如果没好好想一想,却很容易成为一个当想然的错误理解..
关于response.getWriter()写回数据的实际发生时间点的更多相关文章
- out.print()和response.getWriter().write()区别
1.print()和write()区别: write():表示的是仅支持输入字符类型数据,字符,字符数组和字符串等, print():表示的是将各种数据类型(包括object)的数据通过默认编码换成b ...
- [转]response.getWriter().write()与out.print()的区别
原文地址:http://blog.csdn.net/javaloveiphone/article/details/8133772 1.首先介绍write()和print()方法的区别: (1).w ...
- response.getWriter().write()与out.print()的区别
1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等 (2).print():可以将各种类型(包括Object)的数据通 ...
- Response返回JSON数据到前台页面
转自博文:<Response JSON数据返回>http://blog.csdn.net/anialy/article/details/8665471 简述: 在servlet填充Resp ...
- response.getWriter().write()与out.print()的区别 (转)
来自:http://www.cnblogs.com/zhwl/p/3623688.html 1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字 ...
- response.getWriter().write()与out.print()的区别(转)
1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等 (2).print():可以将各种类型(包括Object)的数据通 ...
- response 输出中文数据 文件下载
使用OutputStream或者PrintWriter向客户端浏览器输出中文数据 package com.xc.response; import java.io.IOException; import ...
- @ResponseBody 与 response.getWriter.write
@responseBody注解的使用 1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通 ...
- response.getWriter().write()与out.print()的区别(转)
1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等 (2).print():可以将各种类型(包括Object)的数据通过默 ...
随机推荐
- 决战大数据之二:CentOS 7 最新JDK 8安装
决战大数据之二:CentOS 7 最新JDK 8安装 [TOC] 修改hostname # hostnamectl set-hostname node1 --static # reboot now 重 ...
- IKONS – 赞!264 款手工打造的免费矢量图标
IKONS 是一套免费的矢量图标集,包含264款手工精心制作的可伸缩的矢量图标,分享给网页设计人员和开发人员.这些图标提供了 SVG.AI.ESP.PSD.CSH 和 PNG 格式.所有的图标都可以免 ...
- 7个你可能不认识的CSS单位
众所周知CSS技术我们虽然很熟悉,在使用的过程却很容易被困住,这让我们在新问题出现的时候变得很不利.随着web继续不断地发展,对于新技术新解决方案的要求也会不断增长.因此,作为网页设计师和前端开发人员 ...
- windows 安装 go语言
下载地址:http://www.cnblogs.com/osfipin/p/4856839.html. 官方教程说明: Windows 对于Windows用户,Go项目提供两种安装选项(从源码安装除外 ...
- css命名书写规范小结。
单行形式书写风格的排版约束 1. 每一条规则的大括号 { 前后加空格 2. 多个selector共用一个样式集,则多个selector必须写成多行形式 3. 每一条规则结束的大括号 } 前 ...
- HTML5 video 和 audio
video 用于在HTML或者XHTML文档中嵌入视频内容 使用 video 元素至少要提供两种视频格式的文件:OGG 和 MP4 OGG:采用 Theora 视频格式和 Vorbis 音频解码器 ( ...
- 优秀的CSS框架---bootstrap
Bootstrap是Twitter推出的一个用于前端开发的开源工具包.它 由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.现在在网上已经有 ...
- animate 实现滑动切换效果
今天和大家分享一下用 animate 实现滑动切换效果的小例子 ------- 来自<一只有梦想的前端小白> 大家都知道jQuery 提供的有一下几种方法能够实现滑动效果: slideDo ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q88-Q91)
Question 88 You are designing a SharePoint 2010 application that stores data in a list named Base L ...
- [Android]基于RxJava、RxAndroid的EventBus实现
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4578699.html Github:https://gith ...