1.servlet2.5中,页面发送一次请求,是顺序执行,即使在servlet里的service中开启一个线程,线程处理后的结果是无法返回给页面的,servlet执行完毕后,response就关闭了,无法将后台更新数据即时更新到页面端

2.现在后台“推”是怎么实现的
   2.1定时发送请求,页面有刷新,不好友
   
   2.2Ajax 轮询,然后通过js更新页面数据
    相比前者虽然友好,访问量太大时,服务器会增加压力,小型应用可以考虑用

   2.3反向Ajax(Comnet)
      利用Http1.1长连接的特性,也是通过轮询,但是每次发送请求不会立即返回,而是等待服务器有数据时才返回或者没有等到数据而连接超时返回,相比于ajax轮询,减少了服务端压力,但一个缺点,不是所有浏览器都支持。

3.servlet3.0中提供了异步支持,当数据返回页面后,request并没有关闭,当服务器端有数据更新时,就可以推送了


5.测试servlet3.0异步
  SecondServlet.java


Servlet3.0新特性---异步支持_服务器


1. package
2.   
3. import
4. import
5. import
6.   
7. import
8. import
9. import
10. import
11. import
12. import
13. import
14. import
15.   
16.   
17. /**
18.  * servlet3.0默认是不支持异步的通过asyncSupported=true,打开
19.  * 
20.  */
21. @WebServlet(name="SecondServlet",urlPatterns={"/secondServlet"},asyncSupported=true)  
22. public class SecondServlet extends
23.   
24. @Override
25. protected void
26. throws
27. null;  
28.           
29. "text/html");  
30. try
31.             out = resp.getWriter();  
32. "servlets starts:"+new Date()+"<br>");  
33.             out.flush();  
34.               
35.             AsyncContext asyncContext = req.startAsync();  
36.               
37.               
38.           
39. /**
40.              * AsyncListener为什么没有适配器呢?需要各个厂家实现?
41.              */
42. new
43.   
44. public void onComplete(AsyncEvent asyncEvent) throws
45. //将流在这里关闭
46.                     asyncEvent.getSuppliedResponse().getWriter().close();  
47. "asynContext finished....");  
48.                 }  
49.   
50. public void onError(AsyncEvent arg0) throws
51. // TODO Auto-generated method stub
52.                       
53.                 }  
54.   
55. public void onStartAsync(AsyncEvent arg0) throws
56. // TODO Auto-generated method stub
57.                       
58.                 }  
59.   
60. public void onTimeout(AsyncEvent arg0) throws
61. // TODO Auto-generated method stub
62.                       
63.                 }  
64.                   
65.             });  
66.               
67.               
68.               
69. new Thread(new
70.               
71. "servlets ends:"+new Date()+"<br>");  
72.             out.flush();  
73.               
74. finally
75.               
76. /**
77.              * 一开是在这里关闭了,关了,后面就用不成了 :)
78.              * 
79.              */
80.               
81. /*if(null != out){
82.                 out.close();
83.                 out = null;
84.             }*/
85.         }  
86.           
87.     }  
88. }


  MyThread.java


Servlet3.0新特性---异步支持_服务器



    1. package
    2.   
    3. import
    4. import
    5. import
    6.   
    7. import
    8.   
    9. public class MyThread implements
    10.   
    11. private
    12.       
    13.       
    14. public
    15. this.asyncContext = asyncContext;  
    16.     }  
    17.   
    18.   
    19. public void
    20.           
    21. null;  
    22.           
    23. try
    24. try
    25. 10000);  
    26. catch
    27.                 e.printStackTrace();  
    28.             }  
    29.             out = asyncContext.getResponse().getWriter();  
    30. "myTask starts:"+new Date()+"<br>");  
    31.             out.flush();  
    32.               
    33.               
    34. "myTask ends:"+new Date()+"<br>");  
    35.             out.flush();  
    36.             asyncContext.complete();  
    37.               
    38. catch
    39.             e.printStackTrace();  
    40. finally{  
    41.               
    42. /*if(null != out){
    43.                 out.close();
    44.                 out = null;
    45.             }*/
    46.         }  
    47.     }  
    48.   
    49. }