文章目錄
-
- 9.1、擷取一個RequestDispatcher
-
- 9.1.1、在請求分發器路徑查詢字元串
- 9.2、使用一個請求分發器
- 9.3、包含方法
-
- 9.3.1、 Included的請求參數
- 9.4、轉發方法
-
- 9.4.1、查詢字元串
- 9.4.2、forward 請求參數
- 9.5、 錯誤處理
- 9.6、擷取一個異步上下文資訊
- 9.7、分發方法
-
- 9.7.1、查詢字元串參數
- 9.7.2、Dispatched請求參數
9.1、擷取一個RequestDispatcher
- 一個對象實作了RequestDispatcher 接口,這個對象可以通過ServletContext如下方法獲得
- getRequestDispatcher 如果能比對就是轉發到對應servlet處理,否則傳回這個内容的路徑
- getNamedDispatcher 如果能比對就是轉發到對應servlet處理,否則傳回null
- 相關路徑問題
9.1.1、在請求分發器路徑查詢字元串
- 示例代碼
-
String path = "/raisins.jsp?orderno=5"; RequestDispatcher rd = context.getRequestDispatcher(path); rd.include(request, response);
9.2、使用一個請求分發器
- servlet調用,可以通過執行include和forward的方法
- 容器提供者應確定将請求分發到目标servlet與原始請求在同一JVM的同一線程中進行。
9.3、包含方法
- RequestDispatcher接口的include的方法可以随時調用,include方法的目标servlet可以通路請求對象的所有内容,但是對響應對象的使用受到的限制比較多
- 它隻能将資訊寫入響應對象的ServletOutputStream或Writer并通過寫入超出響應緩沖區末尾的内容或通過顯示調用ServletResponse接口的flushBuffer方法來送出響應,除了HttpServletRequest.getSession()和HttpServletRequest.getSesion(boolean)方法外,它無法設定頭部資訊或者調用任何影響響應頭的方法,設定的頭資訊的任何嘗試添加都是會被忽略,并且如果需要送出響應,則會抛出IllegalStateException
- 如果預設Request.include()請求servlet資源不存在,這個預設servlet需要抛出FileNotFoundException, 如果這個異常沒有被捕獲和處理,那麼這個響應不會送出,這個狀态code可能設定500.
9.3.1、 Included的請求參數
- 除了通過使用getNamedDispatcher方法獲得的Servlet之外,已經由另一個Servlet使用RequestDispatcher的include方法調用的servlet可以通路其調用路徑
- 通過getAttribute方法擷取屬性
- javax.servlet.include.request_uri
- javax.servlet.include.context_path
- javax.servlet.include.servlet_path
- javax.servlet.include.path_info
- javax.servlet.include.query_string
9.4、轉發方法
- 當且僅當沒有輸出送出給用戶端時,調用Servlet才能調用RequestDispatcher接口的forward方法,如果響應緩沖區中存在尚未送出的輸出資料,則必須在調用目标servlet的service方法之前清除内容,如果已送出響應,則必須抛出IllegalStateException.暴露給目标servlet的請求對象的路徑元素必須反射用于擷取RequestDispatcher的路徑。
- 如果RequestDispatcher.forward()的目标中發生錯誤,則異常可能會通過所有調用的篩選器和Servlet傳播回,并最終傳播回容器
9.4.1、查詢字元串
- 聚合查詢條件
9.4.2、forward 請求參數
- 通過getAttribute方法擷取屬性
- javax.servlet.include.request_uri
- javax.servlet.include.context_path
- javax.servlet.include.servlet_path
- javax.servlet.include.path_info
- javax.servlet.include.query_string
9.5、 錯誤處理
- 抛出ServletException或IOException異常會傳播到其他被調用者servlet中
9.6、擷取一個異步上下文資訊
- 可以通過startAsync方法之一從ServletRequest中獲得實作AsynContext接口的對象,一旦有了AsyncContext,就可以使用它通過complete()方法完成請求處理,也可以使用下面介紹的一種排程方法。
9.7、分發方法
- 可以通過AsyncContext擷取分發對象
- dispatch(path) path 是一個字元串參數,是在ServletContext中描述參數,這個路徑是相對于ServletContext的根目錄,并且以‘/’ 開頭
- dispatch(servletContext, path) path 是一個字元串參數,servletContext是給定servletContext參數,是在ServletContext中描述參數,這個路徑是相對于ServletContext的根目錄,并且以‘/’ 開頭
- dispatch() 異步方法
9.7.1、查詢字元串參數
- 聚合查詢參數
9.7.2、Dispatched請求參數
- 通過getAttribute方法擷取屬性
- javax.servlet.include.request_uri
- javax.servlet.include.context_path
- javax.servlet.include.servlet_path
- javax.servlet.include.path_info
- javax.servlet.include.query_string