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