Servlet3.0新特性---异步支持
1.servlet2.5中,页面发送一次请求,是顺序执行,即使在servlet里的service中开启一个线程,线程处理后的结果是无法返回给页面的,servlet执行完毕后,response就关闭了,无法将后台更新数据即时更新到页面端
2.现在后台“推”是怎么实现的
? ?2.1定时发送请求,页面有刷新,不好友
? ?
? ?2.2Ajax 轮询,然后通过js更新页面数据
? ? 相比前者虽然友好,访问量太大时,服务器会增加压力,小型应用可以考虑用
? ?2.3反向Ajax(Comnet)
? ? ? 利用Http1.1长连接的特性,也是通过轮询,但是每次发送请求不会立即返回,而是等待服务器有数据时才返回或者没有等到数据而连接超时返回,相比于ajax轮询,减少了服务端压力,但一个缺点,不是所有浏览器都支持。
3.servlet3.0中提供了异步支持,当数据返回页面后,request并没有关闭,当服务器端有数据更新时,就可以推送了
4.更多关于web异步,请参考这边文章http://blog.csdn.net/cenwenchu79/article/details/5703430?
5.测试servlet3.0异步
??SecondServlet.java
package com.darren.servlet;import java.io.IOException;import java.io.PrintWriter;import java.util.Date;import javax.servlet.AsyncContext;public class MyThread implements Runnable {private AsyncContext asyncContext;public MyThread(AsyncContext asyncContext) {this.asyncContext = asyncContext;}public void run() {PrintWriter out = null;try {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}out = asyncContext.getResponse().getWriter();out.println("myTask starts:"+new Date()+"<br>");out.flush();out.print("myTask ends:"+new Date()+"<br>");out.flush();asyncContext.complete();} catch (IOException e) {e.printStackTrace();}finally{/*if(null != out){out.close();out = null;}*/}}}
?
主要是这个对象AsyncContext,参考J2EE6 API吧http://docs.oracle.com/javaee/6/api/
?