关于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)的数据通过默 ...
随机推荐
- Linux学习笔记14-权限基础
权限基础 权限:操作系统限制对资源访问的机制,一般分为读.写.执行.每个文件都拥有特定权限,通过所属用户及所属组来限制哪些用户.组可以对特定文件进行什么样的操作. 每个进程都是以某个用户的身份运行,进 ...
- linux常用命令之文件系统
df df - report file system disk space usage 查看文件系统的使用清空 用法 df [-hi] [path] 选项 -h human readable ,以人类 ...
- FormatJS – 让你的 Web 应用程序国际化
FormatJS 是一个模块化的集合,保护各种 JavaScript 国际化库,例如格式化数字,日期和字符串.它包括一组建立在 JavaScript 的国际内置插件和全行业的国际化标准,再加上一套集成 ...
- php代码美化/格式化 还原 -问题
使用某个PHP代码格式化的工具.源代码: if ($this->_standardize_newlines == TRUE) { if (strpos($str, "\r") ...
- select中无法使用click的处理
今天工作用到了select,想要给option添加click点击事件,可是却没有任何效果,百度了才发现,原来竟然是不支持呀! 众所周知(其实我才知道哎),在IE里, select的option是不支持 ...
- 基于XMPP的IOS聊天客户端程序
简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S S/S多种架构的聊天协议 XMPPServer 基于XMPP协议的服务端(例如eJabber.OpenFire) ...
- 自定义控件设置属性并实时展现并预览在xib中
关键字: // @IBDesignable:实时看到xib设置后的效果 // @IBInspectable:给xib提供设置属性,可以xib中看到此属性 场景: 自定义一个UITextField,并提 ...
- iOS开发200个tips总结(一)
tip 1 : 给UIImage添加毛玻璃效果 func blurImage(value:NSNumber) -> UIImage { let context = CIContext(opti ...
- 【代码笔记】iOS-调用系统震动和声音
代码: RootViewController.m #import "RootViewController.h" #import <AudioToolbox/AudioTool ...
- sdk的目录结构及其功能
sdk的目录结构及其功能 add-ons: 这里面保存着附加库,比如GoogleMaps,当然你如果安装OphoneSDK,这里也会有一些类库在里面. build-tools: 各个版本的sdk编译工 ...