三分鐘看圖學習 快速理解javaweb中轉發和重定向

前言:

用最通俗易懂的例子和風趣幽默的圖片,帶你領略java的語言之美

大家在學javaweb的時候,有個很重要的知識點,就是通過轉發和重定向來實現我們的共享信息與頁面跳轉。那為什麼需要跳轉和數據共享?

  1. 跳轉:需要做責任分離(Servlet擅長寫代碼即處理業務邏輯,jsp擅長展示頁面)通過後台經過代碼的邏輯處理後跳轉到對應的顯示界面。如:點擊登錄按鈕,經過後台代碼驗證跳轉到登錄成功或者失敗的界面;
  2. 共享:Http是無狀態的,我們跳轉的時候數據無法傳遞,因此需要做數據共享;

我們先看下轉發和重定向在代碼中是如何應用的

轉發的方式:

req.getRequestDispatcher("要跳轉的路徑").forward(request, response);

重定向跳轉的方式:

resp.sendRedirect("要跳轉的路徑");

請求轉發(RequestDispatcher)的過程:

客戶首先發送一個請求到服務器端,服務器端發現匹配的servlet,並指定它去執行,當這個servlet執行完之後,它要調用getRequestDispacther()方法,把請求轉發給指定的jsp頁面,整個流程都是在服務器端完成的。

而且是在同一個請求裏面完成的,因此servlet和jsp共享的是同一個request,在servlet裏面放的所有東西,在jsp中都能取出來,因此,jsp能把結果getAttribute()出來,getAttribute()出來後執行完把結果返回給客戶端。整個過程是一個請求,一個響應。

重定向(sendRedirect)的工作原理:

客戶發送一個請求到服務器,服務器匹配servlet,這都和請求轉發一樣,servlet處理完之後調用了sendRedirect()這個方法,這個方法是response的方法,所以,當這個servlet處理完之後,看到response.senRedirect()方法,立即向客戶端返回這個響應,響應行告訴客戶端你必須要再發送一個請求,去訪問jsp頁面。

緊接着客戶端收到這個請求後,立刻發出一個新的請求,去請求jsp頁面,這裡兩個請求互不干擾,相互獨立,在前面request裏面setAttribute()的任何東西,在後面的request裏面都獲得不了。可見,在sendRedirect()裏面是兩個請求,兩個響應。

我們再用一張圖片快速理解轉發和重定向

轉發和重定向大家都知道他們的區別是不同的請求次數,地址欄中的地址是否發生變化,是否能訪問web-inf下面的資源和能否訪問外部資源。最重要的一點是是否能共享數據,很多人對此表示疑惑,轉發是如何實現數據共享或者重定向為什麼不支持數據共享的。

下面我們對圖片進行舉例解析

我向班長借是15元錢,班長說沒有(其實是不想借我),班長說小王有,讓我去向小王借錢。沒辦法我只能去找小王借錢,小王很大方直接借我100,說不夠再找他。其實這裡這就是我們講的重定向,大家可以看到,我們是發送了兩次請求的,一次是和班長借錢一次是和小王借錢。

而轉發不同的是我去找班長借錢,班長雖然沒有錢,但是班長說我去給你借錢去,班長去找小王借錢,並把借到的錢給我。相對我來說我只發了一次請求,是發送給班長的,而班長把請求進行了轉發,但是班長和小王都是在本次請求中的。

那何為數據共享呢,大家可以看到,我向班長發送了一個15元的請求數據,班長把15元的請求數據轉發給小王。最後我還錢的時候,我是直接把錢還給班長的,班長再把這一百元發送給小王,而不是我直接還給小王。

班長相當於中間人,起到的作用就是數據的共享和交互。而重定向為什麼不能實現數據共享呢?

首先我向班長發送借錢請求,班長說沒有,請求到這裡就結束了,並沒有發生數據的共享,而我和小王借錢只是簡單的數據交互,不是數據的共享因為和班長沒有任何關係。

這就是我對重定向和轉發內容的總結,希望可以幫助大家理解。