1. 程式人生 > >深入理解Servlet3.0異步請求

深入理解Servlet3.0異步請求

連接 三部曲 col 超時時間 lis 深入 class ner http

異步請求的基礎概念

異步請求最直接的用法就是處理耗時業務,Http協議是單向的,只能客戶端拉不能服務器主推.

異步請求的核心原理主要分為兩大類:1.輪詢.2長連接

輪詢:就是定時獲取返回結果.

長連接:客戶端請求服務器後,連接不關閉,只有異步請求處理完成後才關閉連接.

Servlet3.0對異步請求的支持

  在Servlet3.0對異步請求的支持非常簡單,只需要在請求的過程中調用request的startAsync即可,返回值為AsyncContext.AsyncContext為異步請求容器,它的作用就是保存與異步請求相關的所有信息,類似Servlet中的ServletContext.需要註意的是多次調用startAsync返回的是同一個AsyncContext.

public interface AsyncContext {
    String ASYNC_REQUEST_URI = "javax.servlet.async.request_uri";
    String ASYNC_CONTEXT_PATH = "javax.servlet.async.context_path";
    String ASYNC_PATH_INFO = "javax.servlet.async.path_info";
    String ASYNC_SERVLET_PATH = "javax.servlet.async.servlet_path";
    String ASYNC_QUERY_STRING 
= "javax.servlet.async.query_string"; ServletRequest getRequest(); ServletResponse getResponse();//獲取response boolean hasOriginalRequestAndResponse(); void dispatch();//用於將請求發往新地址(發往原來的地址) void dispatch(String var1);//用於將請求發往新地址(發往指定的地址) void dispatch(ServletContext var1, String var2);//
用於將請求發往新地址(發往指定應用的指定地址) void complete();//用於通知容器,請求已經處理完成. void start(Runnable var1);//用於啟動實際處理線程 void addListener(AsyncListener var1);//用於添加監聽器 void addListener(AsyncListener var1, ServletRequest var2, ServletResponse var3); <T extends AsyncListener> T createListener(Class<T> var1) throws ServletException; void setTimeout(long var1);//設置超時時間 long getTimeout(); }

Servlet3.0處理異步請求三部曲

1.配置Servlet時將async-supported設置為true.

2.在servlet處理方法中調用Request的startAsync方法啟動異步處理.

3.使用上面返回的AsyncContext處理異步請求.

配置web.xml

  <servlet>
    <servlet-name>WorkServlet</servlet-name>
    <servlet-class>controller.WorkSerlet</servlet-class>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>WorkServlet</servlet-name>
    <url-pattern>/work</url-pattern>
  </servlet-mapping>

深入理解Servlet3.0異步請求