一、什么是异步处理
在服务器没有结束响应之前,浏览器是看不到任何的响应内容,只能是在转圈圈,只有响应结束是,浏览器才能显示结果。比如:
@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
领取专属 10元无门槛券
私享最新 技术干货