只能说自己平时太粗心了,一些细节问题虽然几次路过,都没有注意过,也没有好好想过.

同事负责的一段微信模块的小逻辑,为了防止微信服务器认为没有接收到请求而重发消息,所以再收到微信服务器发回的消息后,马上用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()写回数据的实际发生时间点的更多相关文章

  1. out.print()和response.getWriter().write()区别

    1.print()和write()区别: write():表示的是仅支持输入字符类型数据,字符,字符数组和字符串等, print():表示的是将各种数据类型(包括object)的数据通过默认编码换成b ...

  2. [转]response.getWriter().write()与out.print()的区别

    原文地址:http://blog.csdn.net/javaloveiphone/article/details/8133772 1.首先介绍write()和print()方法的区别:   (1).w ...

  3. response.getWriter().write()与out.print()的区别

    1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等  (2).print():可以将各种类型(包括Object)的数据通 ...

  4. Response返回JSON数据到前台页面

    转自博文:<Response JSON数据返回>http://blog.csdn.net/anialy/article/details/8665471 简述: 在servlet填充Resp ...

  5. response.getWriter().write()与out.print()的区别 (转)

    来自:http://www.cnblogs.com/zhwl/p/3623688.html 1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字 ...

  6. response.getWriter().write()与out.print()的区别(转)

    1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等  (2).print():可以将各种类型(包括Object)的数据通 ...

  7. response 输出中文数据 文件下载

    使用OutputStream或者PrintWriter向客户端浏览器输出中文数据 package com.xc.response; import java.io.IOException; import ...

  8. @ResponseBody 与 response.getWriter.write

    @responseBody注解的使用 1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通 ...

  9. response.getWriter().write()与out.print()的区别(转)

    1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等 (2).print():可以将各种类型(包括Object)的数据通过默 ...

随机推荐

  1. OriDomi – 像折叠纸张一样折叠 DOM 元素

    Web 原本是扁平化的,但是现在你可以折起来.OriDomi 是一个开源的 JavaScript 库,使得 DOM 元素能够实现像纸折一样折叠的效果.在创建你所看到的场景背后,OriDomi 做了大量 ...

  2. 【特别推荐】10款唯美浪漫的婚礼 & 结婚纪念网站模板

    互联网的重要性不言而喻,如今我们的生活已经完全离不开网络.这里给大家分享一组唯美浪漫的结婚邀请网站以及婚礼请柬网站模板,如果你也正想制作这样的网站,相信这些漂亮的网站模板能够带给你很大的帮助,让你快速 ...

  3. CSS之详解:active选择器

    Active的一段话 active的英文解释为"积极的",表现在鼠标上就是点击的意思.关于active选择器最多的示例恐怕就是应用在链接上面的,然而打开链接是一个一瞬间的动作,这不 ...

  4. javascript --- 设计模式之Module模式

    基本用法 先看一下最简单的一个实现,代码如下: var Calculator = function(){ // 这里可以声明私有成员 var eqCtrl = document.getElement( ...

  5. DevExpress更新至13.1.7

    DevExpress下的.NET界面组件 DXperience Universal Suite 最新发布13.1.7版,多个属性的定义方式发生变化,另外还有大量的bug修复.使用DevExpress朋 ...

  6. [Android]官网《Testing Support Library》中文翻译

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5048524.html 翻译自 Android Develope ...

  7. iOS运用fabric记录crash日志过程

    先前运用友盟记录app闪退,发现有些闪退的记录无法明确定位到详细的位置,决定运用fabric进行闪退的记录:网上也有这方面的记录,有些细节的内容不明确,把今天碰到的坑整理记发不一下: 访问官网地址(进 ...

  8. 搭建Maven私服

    最近从SVN下载的代码,在本地构建时出现了诸多问题,部分依赖下载超时,就想起在局域网搭建Maven私服,废话不说了,在测试服务器上建的已经成功,就随便找台机子再练习一遍顺道写个日志.1.前往http: ...

  9. Team Leader炖完石头汤后干嘛

    在万众创业的互联网年代,挖人组建全明星团队过于奢侈.面对水平参差不齐的团队咋办? 命运真是捉弄,半年前在大美团打工时准备做个NABC的教学项目 ,结果自己就被挖到"Competitors 竞 ...

  10. 关于UNPIVOT 操作符

    UNPIVOT 操作符说明 简而言之,UNPIVOT操作符就是取得一个行的数据集合,然后把每一行都转换成多个行数据.为了更好地理解,请看下图: 图1 从上图中,你能发现UNPOVOT操作符,取得了两行 ...