深入理解Servlet3.0異步請求
阿新 • • 發佈:2017-11-27
連接 三部曲 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異步請求