1. 程式人生 > >反向Ajax基本概念

反向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

在這裡插入圖片描述