反向Ajax基本概念
阿新 • • 發佈:2019-01-12
- 反向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