关于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)的数据通过默 ...
随机推荐
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream
一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest { publ ...
- canvas滤镜-刮刮乐
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- paramiko 遭遇socket.error: Socket is closed 错误的解决办法
似乎是connection自己断了解决的办法是在创建conn的时候添加下面这句 conn.keep_this = conn_session 完整代码 def create_a_conn(ip_addr ...
- angular源码分析:图解angular的启动流程
今天做了一些图来说明angular,由于angular实在太复杂了,不知道用什么图表示比较好,所以就胡乱画了一些,希望有人能看得懂. 一.源码文件编译合并顺序图 二.angular.module函数功 ...
- .Net框架2.0和4.0版本对比
.Net版本 2.0 SP2 4.0 操作系统 Windows 2000 SP4以上 Windows XP SP3以上 安装包大小 NetFx20SP2_x86.exe 23.8 MBNetFx20S ...
- ABAP--关于ABAP流程处理的一些命令的说明(stop,exit,return,check,reject)
Stop 命令 使用该命令的程序位置 INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION和GET 事件中 处理说明 1. 当在INITIAL ...
- ArcGIS Server For Linux 10.2.2安装
1.# yum install Xvfb# yum groupinstall "X Window System"# yum install gettext 2./usr/sbi ...
- [javascript svg fill stroke stroke-width points polygon属性讲解] svg fill stroke stroke-width points polygon绘制多边形属性并且演示polyline和polygon区别讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- IDA来Patch android的so文件
在上文中,我们通过分析定位到sub_130C()这个函数有很大可能性是用来做反调试检测的,并且作者开了一个新的线程,并且用了一个while来不断执行sub_130C()这个函数,所以说我们每次手动的修 ...