前言:
用最通俗易懂的例子和風趣幽默的圖片,帶你領略java的語言之美
大家在學javaweb的時候,有個很重要的知識點,就是通過轉發和重定向來實現我們的共享信息與頁面跳轉。那為什麼需要跳轉和數據共享?
- 跳轉:需要做責任分離(Servlet擅長寫代碼即處理業務邏輯,jsp擅長展示頁面)通過後台經過代碼的邏輯處理後跳轉到對應的顯示界面。如:點擊登錄按鈕,經過後台代碼驗證跳轉到登錄成功或者失敗的界面;
- 共享: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元的請求數據轉發給小王。最後我還錢的時候,我是直接把錢還給班長的,班長再把這一百元發送給小王,而不是我直接還給小王。
班長相當於中間人,起到的作用就是數據的共享和交互。而重定向為什麼不能實現數據共享呢?
首先我向班長發送借錢請求,班長說沒有,請求到這裡就結束了,並沒有發生數據的共享,而我和小王借錢只是簡單的數據交互,不是數據的共享因為和班長沒有任何關係。
這就是我對重定向和轉發內容的總結,希望可以幫助大家理解。