码迷,mamicode.com
首页 > 其他好文 > 详细

servlet 3.0 的新特性之三对异步处理的支持

时间:2016-05-02 18:24:45      阅读:144      评论:0      收藏: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) {

????????}

????}

}

?

????????????????

servlet 3.0 的新特性之三对异步处理的支持

标签:

原文地址:http://www.cnblogs.com/Prozhu/p/5452703.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!