Java Web 回顧總結(五) - HttpServlet - Request - 重定向 與 請求轉發

request實現請求轉發:

servlet api 提供了 一個 RequestDispatcher 接口,俗稱 請求分派器

它定義瞭如下兩個 請求轉發 方法:
public void forward(ServletRequest request, ServletResponse response)
public void include(ServletRequest request,ServletResponse response)

獲取RequestDispatcher實例的方式主要有兩種:

調用ServletContext接口提供的getRequestDispatcher(String url)方法。
調用ServletRequest接口提供的getRequestDispatcher(String url)方法。

url爲要轉發 過去 的 本應用內 url

RequestDispatcher

例:

        // 返回指定 屬性的 值 作爲對象,如果沒有給定名稱的屬性,則返回null
        if(request.getAttribute("lol")!=null) {
            System.out.println("該請求中無此參數");
            // 添加  一個 請求 參數
            request.setAttribute("lol", "haha");
        }
        else if (request.getAttribute("lol").toString()=="haha") {
            System.out.println("我會重置此參數的值");
            // 重置  該請求參數
            request.setAttribute("lol", "wawa");
        } 
        else {
            System.out.println("其他情況我會刪除 該參數");
            // 刪除 該參數
            request.removeAttribute("lol");
        }
        // 獲取全部屬性
        Enumeration<String> enumeration = request.getAttributeNames();

        //將 該請求 實現轉發
        request.getRequestDispatcher("./Demon").forward(request, response);

request對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉發。

request對象同時也是一個域對象,開發人員通過request對象在實現轉發時,把轉發前 修改後的 數據 可以 通過request對象 帶給其它web資源處理。

request中 的數據對象進行操作:

setAttribute()      //若無此屬性 在此請求中存儲  ,若有 屬性在請求之間重置。
getAttribute()      // 獲取該屬性 的值 ,並作爲 對象(object) 處理
removeAttribute()   // 移出該屬性
getAttributeNames() // 獲取全部屬性 的名稱 作爲 枚舉類型 使用

注意

  1. forward方法用於將請求轉發到RequestDispatcher對象封裝的資源。
  2. 如果在調用forward方法之前,在Servlet程序中寫入的部分內容已經被傳送到了客戶端
    forward方法拋出IllegalStateException異常。
  3. 如果在調用forward方法之前向Servlet引擎的緩衝區 response 中寫入了內容
    只要寫入到緩衝區中的內容還沒有被真正輸出到客戶端,forward方法就可以被正常執行
    除已寫入到HttpServletResponse response對象中的 響應頭字段信息 保持有效 外 , 轉發前 其它寫入到輸出緩衝區中的 內容將被清空,

請求重定向(402)和請求轉發的區別

請求轉發:
一個web資源收到客戶端請求後,通知服務器去調用另外一個web資源進行處理
請求重定向
一個web資源收到客戶端請求後,通知瀏覽器去訪問另外一個web資源

通過HttpServletResponse.sendRedirect()方法 實現

可重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。
但不進行處理

路徑區別

HttpServletResponse.sendRedirect方法的相對URL以/開頭,它是相對於整個WEB站點的根目錄
創建RequestDispatcher對象時指定的相對URL以/開頭,它是相對於當前WEB應用程序的根目錄

如同 www.pan.baidu.comwww.pan.baidu.com/disk/的區別

調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由 初始的URL 地址變成重定向的 目標URL
調用RequestDispatcher.forward 方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變

HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;
RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行爲。
RequestDispatcher.forward方法的調用者與 被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;
HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於 兩個獨立的訪問請求和響應過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章