zoukankan      html  css  js  c++  java
  • 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) {

            }

        }

    }

     

                    

  • 相关阅读:
    序列化组件
    restful_framework之视图组件
    如何优化MYSQL数据库
    pycharm如何显示工具栏
    cmd常用命令
    pycharm如何回到过去某个时间
    RESTful API设计规范
    MyBatis之传入参数——parameterType(转)
    Spring3事务管理——使用@Transactional 注解(转)
    Eclipse 启动问题:'Initilizing Java Tooling' has encountered a problem(。。。)
  • 原文地址:https://www.cnblogs.com/Prozhu/p/5452703.html
Copyright © 2011-2022 走看看