关于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)的数据通过默 ...
随机推荐
- C#中委托实现的异步编程
所谓同步:如果在代码中调用了一个方法,则必须等待该方法所有的代码执行完毕之后,才能回到原来的地方执行下一行代码. 异步:如果不等待调用的方法执行完,就执行下一行代码. 1.0 同步例子: class ...
- cnodejs社区论坛5--话题详情
- ConcurrentHashMap原理分析
当我们享受着jdk带来的便利时同样承受它带来的不幸恶果.通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,而现在的解 ...
- AES .net 、JS 相互加密解密
/// <summary> /// AES加密 /// </summary> public class AES { /// <summary> /// 加密 /// ...
- SharePoint 部署解决方案Feature ID冲突
中文报错: 部署步骤“添加解决方案”中出现错误: 已在此服务器场中安装 ID 为 735efe4e-8b50-4310-b588-c6ae2ba0759f 的功能.请使用强制属性显式地重新安装此功能. ...
- 遍历collection
链接 遍历NSArray 正向遍历 for (id object in array) 反向遍历 for (id object in [array reverseObjectEnumerator]) 如 ...
- 操作系统开发系列—10.内核HelloWorld ●
a.我们先来体验一下在Linux下用汇编编程的感觉,见代码 [section .data] ; 数据在此 strHello db "Hello, world!", 0Ah STRL ...
- iOS9 HTTP 通信报错解决方案
UIWebView *myview = [[UIWebView alloc] initWithFrame:CGRectMake(, , [UIScreen mainScreen].bounds.siz ...
- Android Studio教程--从Github 下载一个Repository
从电脑上彻底删除HelloWorld项目 回到as欢迎页面 复制github中项目的地址 点击clone
- mac 下如何切换jdk的版本
1.打开.bash_profile文件添加一个函数 #add a function for switch idk version.function jdkset() { if [ $# -ne 0 ] ...