一.异步处理

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. 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作

    这里要说的是Hibernate的关联关系的级联操作,使用cascade属性控制. 依旧用部门和员工举例.多个员工相应一个部门(多对一关联关系) 员工类:Employee.java package cn ...

  2. 代码转换工具 Java to C#

    http://www.tangiblesoftwaresolutions.com/ (Java 2 C#) http://www.tangiblesoftwaresolutions.com/Produ ...

  3. Mac系统下配置JDK及MAVEN环境变量配置

    1. 启动终端Terminal 2.进入当前用户的home目录 输入cd ~ 3.临时授权,sudo su: 输入密码(密码不显示): 4.创建.bash_profile 输入touch .bash_ ...

  4. Django学习之项目结构优化

    其实就是采用包结构,比如: 目录models,包含__init__.py,a.py,b.py 然后将model class写在a和b中,但是这样的话,导入时就要改变了! from models imp ...

  5. AFNet3.0上传图片

    很多iOS应用都会遇到需要上传图片的情况,比如修改个人资料时需要上传自己的头像,最近我也遇到了这种情况,首先参考之前写过的AFNetWorking3.0处理请求头和请求内容. 我们在上述博客的基础之上 ...

  6. PHP 关掉浏览器还会执行代码

    ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $int ...

  7. Chromium浏览器组件设计意图

    在文章開始之前.我要叽歪几句,一上来就看Chrome的代码.简直晕头转向,摸来摸去莫不着头脑,好不easy看了一点点代码.却犹如瞎子摸象.无法众观全局.以下这篇小文,简介当中一个重要的模块--Comp ...

  8. 整理的一些java中常使用jar包以及说明

    slf4j:Simple Logging Facade for Java SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于 ...

  9. AsyncTask机制学习

    其内容可以参考http://blog.csdn.net/webgeek/article/details/17298237 ,首先创建一个AsyncTask类 class GetFaceDetectTa ...

  10. ios --图片文字组合头像那点事

    /** 图片文字组合头像那点事 @param string 昵称 @param imageSize 图片尺寸 @param imageColor 图片颜色 @return 返回的 图片 */ + (U ...