反向Ajax基本概念

  • 反向AJax严格来讲称之为数据的轮询技术,其主要重要的使用点在于:聊天室,站内的消息提示信息,反向Ajax有一个最为严重的问题,那么就是他的性能消耗非常的大.

在这里插入图片描述

  • 对于反向AJax支持的多线程的处理操作,并不是说用户直接使用多线程的实现即可,以为次线程对象最终要通过控制层打开,所以这个是用需要使用到一个新的类,AsyncContext类.

Servlet使用反向AJax的技术

  • Servlet3.0之后支持Ajax异步处理,需要用到@WebServlet注解,要使用异步处理,必须制定该注解的一个属性
属性名称 类型 作用
asyncSupported boolean 声明 Servlet 是否支持异步操作模式,等价于 <async-supported> 标签。
  • Servlet使用示例如下:
package mao.shu.servlet;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet(urlPatterns = "/reverse",asyncSupported = true)
public class ReverseServlet extends HttpServlet {

}

  • 所需要使用到的方法和对象
startAsync() 通过HttpRequest对象来取得由当前请求,启动的一个反向异步处理,得到AsyncContext对象
AsyncContext 描述一个请求的反向异步处理对象,该对象包含了请求的request对象和响应的response对象
  • 所有的服务要求可以处理反向Ajax操作,可以在处理的过程之中必须明确一点,这个操作处理时一定要有一个多线程的处理类.其次是一个多线程的实现操作,既然是多线程的实现操作就可以通过三个父类实现:Thread,Runnable,Callable

  • 模拟一个异步处理

package mao.shu.servlet;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

@WebServlet(urlPatterns = "reverse",asyncSupported = true)
public class ReverseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("进入Servlet时间:"+new Date());

        //AsyncContext描述一个反向异步处理请求,该对象包含了request和response对象;
        AsyncContext ac = req.startAsync();
        //启动一个子线程,有子线程完成业务操作,主线程退出
        new Thread(new Executor(ac)).start();
        out.println("结束Servlet时间:"+new Date());
        out.flush();

    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }

    //该类职位ReverseServlet类服务,所以直接使用内部类实现
    public  class Executor implements Runnable{
        AsyncContext ac = null;
        public Executor(AsyncContext ac){
            this.ac = ac;
        }
        @Override
        public void run() {
            try{
                //等待5秒,用于模拟业务方法的执行
                Thread.sleep(5000);
                //得到客户端的输出流
                PrintWriter write = this.ac.getResponse().getWriter();
                write.println("业务处理完成时间"+new Date()+".");
                //刷新缓冲区
                write.flush();
                //对客户端完成响应
                this.ac.complete();
            }catch(Exception e){

            }
        }
    }
}

  • 由浏览器访问该Servlet
view-source:http://localhost:8080/AjaxProject/reverse

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43386754/article/details/86234028