一.异步处理

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 的新特性之三对异步处理的支持的更多相关文章

  1. servlet3.0 的新特性之二注解代替了web.xml配置文件

    servlet3.0 的新特性: 注解代替了 web.xml 文件 支持了对异步的处理 对上传文件的支持 1.注解代替了配置文件 1.删除了web.xml 文件 2. 在Servlet类上添加@Web ...

  2. php5.3到php7.0.x新特性介绍

    <?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...

  3. paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较

    paip.php 5.0 5.3 5.4  5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...

  4. NodeJS 框架 Express 从 3.0升级至4.0的新特性

    NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...

  5. 相比于python2.6,python3.0的新特性。

    这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. ...

  6. MySQL 8.0 InnoDB新特性

    MySQL 8.0 InnoDB新特性 1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3. ...

  7. Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性

    Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性 1.1. Jquery1.12  jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.h ...

  8. [PHP] 从PHP 5.6.x 移植到 PHP 7.0.x新特性

    从PHP 5.6.x 移植到 PHP 7.0.x 新特性: 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array ...

  9. C# 6.0/7.0 的新特性

    转眼C#语言都已经迭代到7.0版本了,很多小伙伴都已经把C# 7.0 的新特性应用到代码中了,想想自己连6.0的新特性都还很少使用,今天特意搜集了一下6.0和7.0的一些新特性,记录一下,方便查阅. ...

随机推荐

  1. spring实现定时任务

    今天在项目里需要实现一个定时任务,每隔3个小时将过滤的广告通过邮件上报给运营一次.考虑了一下,从实现的技术上可以有三种做法: 1.Java自带的java.util.Timer类,这个类允许调度一个ja ...

  2. javascript学习笔记(三)

    1.与命名空间相关的方法以及属性 2.任何支持style特性的HTML元素在Javascript中都有一个对应的style属性.这个属性是CSSStyleDecalration的实例, 包含着通过HT ...

  3. MySQL学习总结(一)下载与安装

    关于数据库这块平时用的也就是Oracle和SQL Server,关于别的数据库也就是耳闻,但从没有用过.所以,最近一直都在学习使用MySQL数据库,这个教程也是通过记录博客,增加学习的印象. 关于My ...

  4. 应用phpexcel导出excel文件后打不开的问题解决方法

    应用phpexcel导出excel文件后打不开,提示“文件格式或文件扩展名无效,请确定文件未损坏,并且文件扩展名与文件的格式匹配”. 试了以下方法: 1.首先区分文件格式是2003,还是2007. 参 ...

  5. MongoDB安装、CURD增改查删操作、应用场景

    NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".非关系型的数据存储 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 ...

  6. Android JNI和NDK学习(01)--搭建NDK开发环境(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3095013.html 本文主要介绍“JNI”.“Android NDK”以及 ...

  7. 28. Implement strStr()【easy】

    28. Implement strStr()[easy] Implement strStr(). Returns the index of the first occurrence of needle ...

  8. [: ==: unary operator expected 解决方法

    之前在写脚本时遇到了这样的错误 “[: ==: unary operator expected” 这是由于做判断的变量值为空导致的. 谷歌出解决方案: 在变量之后加任意字符.例如,要判断变量un是否为 ...

  9. iOS开发多线程篇 11 —自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  10. python 转化文件编码 utf8

    使用visual studio最大的一个问题就是文件编码问题,当文件中有中文时,visual studio 会默认为区域编码,也就是gb2312,如果想跨平台或者不用vs编译的话,就会因为编码问题导致 ...