servlet 3.0 的新特性之三对异步处理的支持
一.异步处理
1. 什么是异步处理
原来,在服务器没有结束响应之前,浏览器是看不到响应内容的!只有响应结束时,浏览器才能显示结果!
现在异步处理的作用:在服务器开始响应后,浏览器就可以看到响应内容,不用等待服务器响应结束!
2. 实现异步的步骤
* 得到AsyncContext,它异步上下文对象
AsyncContext ac = request.startAsync(request,response);
* 给上下文一个Runnable对象,启动它!(给上下文一个任务,让它完成!)
ac.start(new Runnable() {
public void run() {
...
}
});
注意:
* @WebServlet(urlPatterns="/AServlet", asyncSupported=true) //激活异步处理
* resp.setContentType("text/html;charset=utf-8"); //解决页面中文显示乱码问题
* IE如果不能正常输出,这说明响应体大小不足512B,那你需要多输出点废话!
* AsyncContext#complete():通知Tomcat我们异步线程已经执行结束了!这让Tomcat才会及时的断开与浏览器的连接!
实例:
Aservlet.java
/** * 添加WebServlet注解 *asyncSupported=true : 表示激活异步处理请求,servlet 默认是关闭的 */ @WebServlet(urlPatterns="/AServlet", asyncSupported=true) public class AServlet extends HttpServlet { // public static void main(String[] args) { // System.out.println("hello"); // new Thread() { // public void run() { // // } // }.start(); // // System.out.println("不知道上面的线程是否结束!"); // } public void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8");
// 支持IE!如果输出不足512B,没有异步效果! for(int i = 0; i <= 512; i++) { resp.getWriter().print("a"); } resp.getWriter().flush();
/* * 1. 得到异步上下文对象 */ final AsyncContext ac = req.startAsync(req, resp);
/* * 2. 给上下文对象一个Runnable对象,让它执行这个任务 */ ac.start(new Runnable() { public void run() { println("现在马上开始<br/>", resp); sleep(2000); for(char c = 'A'; c <= 'Z'; c++) { println(c+"", resp); sleep(250); }
/** * 通知Tomcat我们已经执行结束了!,如果不告诉tomcat ,那么请求处理完成之后, * tomcat依旧会保持和浏览器的接连一会儿,不会立即断开 */ ac.complete(); } }); }
//想客户端页面打印 信息 public void println(String text, HttpServletResponse resp) { try { resp.getWriter().print(text); resp.getWriter().flush(); } catch (IOException e) { } }
//将 sleep 方法提取处理,单独处理异常 public void sleep(long ms) { try { Thread.sleep(ms); } catch (InterruptedException e) { } } } |