Javaweb中請求轉發和重定向的區別

請求轉發:

request.getRequestDispatcher().forward();

重定向:

response.sendRedirect();

例如:

請求轉發:

request.getRequestDispatcher("/student_list.jsp").forward(request,response);

重定向:

response.sendRedirect(request.getContextPath + “/student_list.jsp”)

轉發過程:客戶端首先發送一個請求到服務器,服務器匹配Servlet,並指定執行。當這個Servlet執行完後,它要調用getRequestDispacther()方法,把請求轉發給指定的Servlet_list.jsp,整個流程都是在服務端完成的,而且是在同一個請求裏面完成的,因此Servlet和jsp共享同一個request,在Servlet裏面放的所有東西,在student_list.jsp中都能取出來。因此,student_list.jsp能把結果getAttribute()出來,getAttribute()出來後執行完把結果返回給客戶端,整個過程是一個請求,一個響應。

重定向過程:客戶端發送一個請求到服務器端,服務器匹配Servlet,這都和請求轉發一樣。Servlet處理完之後調用了sendRedirect()這個方法,這個方法是response方法。所以,當這個Servlet處理完後,看到response.sendRedirect()方法,立即向客戶端返回個響應,響應行告訴客戶端你必須再重新發送一個請求,去訪問student_list.jsp,緊接着客戶端收到這個請求後,立刻發出一個新的請求,去請求student_list.jsp,在這兩個請求互不干擾、相互獨立,在前面request裏面setAttribute()的任何東西,在後面的request裏面都獲得不了。因此,在sendRedirect()裏面是兩個請求,兩個響應。

Forward是在服務器端的跳轉,就是客戶端一個請求給服務器,服務器直接將請求相關參數的信息原封不動的傳遞到該服務器的其他jsp或Servlet去處理。而sendRedirect()是客戶端的跳轉,服務器會返回客戶端一個響應報頭和新的URL地址,原來的參數信息如果服務器沒有特殊處理就不存在了,瀏覽器會訪問新的URL所指向的Servlet或jsp,這可能不是原來服務器上的webService了。

總結:
1、轉發是在服務器端完成的,重定向是在客戶端發生的;
2、轉發的速度快,重定向速度慢;
3、轉發是同一次請求,重定向是兩次請求;
4、轉發地址欄沒有變化,重定向地址欄有變化;
5、轉發必須是在同一臺服務器下完成,重定向可以在不同的服務器下完成。

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