天天看點

Servlet請求分發(第九篇)

文章目錄

    • 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

繼續閱讀