首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Servlet3.0 异步处理

一、什么是异步处理

在服务器没有结束响应之前,浏览器是看不到任何的响应内容,只能是在转圈圈,只有响应结束是,浏览器才能显示结果。比如:

@WebServlet(name = "DemoServlet",urlPatterns = "/Demo3Servlet")public class Demo3Servlet extends HttpServlet { protected void doGet(HttpServletRequest request,HttpServletResponse response) { response.getWriter().write("JAVA"); try { Thread.sleep(3000); } catch (InterruptedException e) { } response.getWriter().write("开发"); }}

在浏览器并不会先输出“JAVA”,然后在输出“开发”,而是等待3S之后,一起输出”JAVA 开发”。

如果想做到先输出‘JAVA”,然后在输出“开发”,那要怎么做呢。。。。请继续往下看。。。。

异步处理登场~~~~

在服务器开始响应之后,就可以先输出内容,不需要等待服务器响应结束。

二、实现异步处理的步骤

废话不多说,线上代码吧。

运行结果:

注意:

(1)通过request获取异步上下文AsyncContext。

(2)给上下文一个Runnable(任务)对象,然后启动它。

(3)配置servlet支持异步响应

@WebServlet(name = "DemoServlet",urlPatterns = "/Demo3Servlet",asyncSupported=true)

(4)为了防止乱七八糟错误,加上

response.setContentType("text/html;charset=utf-8"); //设置返回数据类型和字符集

(5)由于咱们开启的是子线程(任务),主线程并不知道咱们的任务啥时候完成,所以,任务结束的时候我们需要通知主线程(Tomcat)

as.complete(); //告诉Tomcat子线程已经执行结束

三、坑

(1)如果项目中有过滤器Filter,那么过滤器也需要支持异步处理

@WebFilter(urlPatterns = {"/*"},asyncSupported = true)

或者

AFilter

com.scm.filter.AFilter

true

AFilter

/*

(2)IE 下没效果

因为在IE浏览器,当的内容小于512B的时候,没发正常的输出,那怎么办呢。在正在执行我们的代码之前,来一个循环,随便输出大小为512B的内容。

for (int i= 0;i

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171226G0Y43B00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券