Servlet之重定向、請求轉發


多個Servlet之間調用規則

1、前提條件:某些來自於瀏覽器發送請求,往往需要服務端中多個Servlet協同處理。但是瀏覽器一次只能訪問一個Servlet,用戶需要手動通過瀏覽器發起多次請求才能得到服務。這樣增加用戶獲得服務難度,導致用戶體驗變差。
2、提高用戶使用感受規則,無論本次請求涉及到多少個Servlet,用戶只需要手動通知瀏覽器發起一次請求即可。
3、多個Servlet之間調用規則:
a、重定向解決方案
b、請求轉發解決方案

重定向

概述

1、用戶手動通知瀏覽器訪問OneServlet,OneServlet工作完畢后。
2、將TwoServlet地址寫入到響應頭Location屬性中,導致Tomcat將302狀態碼寫入到狀態行,交給瀏覽器(Location:TwoServlet)。
3、瀏覽器收到響應包,讀取到了302狀態碼,立刻自動根據響應頭中Location中的地址發起第二次請求,訪問TwoServlet。
(TwoServlet二次請求是瀏覽器自動發送的。)
在這里插入圖片描述

實現命令:

response.sendRedirect("請求地址");
將地址寫入到響應包中響應頭的location屬性中。
對於response.sendRedirect("String location")中的location,如果不以“/”開頭,表示相對於當前源組件的路徑;如果以“/”開頭,表示相對於當前服務器根路徑的URL;如果以“http://”開頭,表示一個完整的Internet上的路徑。

代碼示例

在這里插入圖片描述
在這里插入圖片描述
啟動服務器,在地址欄輸入Http://localhost:8080/myWeb/one
在這里插入圖片描述
地址欄發生變化,one變為two。
在這里插入圖片描述
控制台輸出:
在這里插入圖片描述

特征

1、請求地址:既可以把當前網站內部的資源文件地址發送給瀏覽器(/網站名/資源文件名);也可以把其他網站資源文件地址發送給瀏覽器(http://ip地址:端口號/網站名/資源文件名)。
2、請求次數瀏覽器至少發送兩次請求,但是只有第一次請求是用戶手動發送。后續請求都是瀏覽器自動發送的。
3、請求方式:重定向解決方案中,通過地址欄通知瀏覽器發起下一次請求,因此通過重定向解決方案調用的資源文件接收的請求方式一定是GET方式。

缺點及其它特性

1、重定向解決方案需要在瀏覽器與服務器之間進行多次往返,大量時間消耗在往返次數上,增加用戶等待服務時間
在這里插入圖片描述
2、地址欄改變跳轉導致客戶端跳轉。
3、不能保留request屬性(兩次請求,地址改變了,客戶端跳轉,不同的request)。
4、所有代碼執行完之后再跳轉,跳轉語句后的代碼還是會執行,除非在后面加上return。
5、通過對URL地址的重寫傳遞參數。(如:response.sendRedirect("hh.jsp? id=aaa")

請求轉發

概述

1、用戶第一次通過手動方式要求瀏覽器訪問OneServlet。
2、OneServlet工作完畢后,通過當前的請求對象代替瀏覽器向Tomcat發送請求,申請調用TwoServlet(OneServlet調用forward()方法,在服務端將請求轉發給TwoServlet)。
3、Tomcat在接收到這個請求之后,自動調用TwoServlet來完成剩余任務(由TwoServlet做出響應)。
在這里插入圖片描述
4、請求方式:在請求轉發過程中,瀏覽器只發送一個了個Http請求協議包。參與本次請求的所有Servlet共享同一個請求協議包,因此這些Servlet接收的請求方式與瀏覽器發送的請求方式保持一致。

實現命令

請求對象代替瀏覽器向Tomcat發送請求
1、通過當前請求對象生成資源文件申請報告對象(獲取請求轉發器對象)。
RequestDispatcher report = request.getRequestDispatcher("/資源文件名");
(一定要以"/"開頭)
2、將報告對象轉發給Tomcat(轉發請求)。
report.forward(當前請求對象, 當前響應對象)

大概代碼

OneServlet(xml:/one):

doGet{
	System.out.println("這是OneServlet。");
	RequestDispatcher report = request.getRequestDispatcher("/two");
	report.forward(request, response);
}

TwoServlet(xml:/two):

doGet{
	System.out.println("這是TwoServlet。");
}

在地址欄輸入:..../one,回車后,地址欄沒有發生變化。
Server的Output顯示:
這是OneServlet。
這是TwoServlet。

優點

1、無論本次請求涉及到多少個servlet,用戶只需要手動通過瀏覽器發送一次請求。
2、servlet之間調用發生在服務端計算機上,節省服務端與瀏覽器之間往返次數,增加處理服務速度。
3、地址欄不改變跳轉,服務端跳轉,服務器之間內部跳轉,相同的request,可傳參。
4、執行到跳轉語句后無條件立刻跳轉,之后的代碼不再被執行。
注意:使用forward跳轉的話,一定要在跳轉之前釋放掉全部的資源。
5、使用forward時,request設置的屬性依然能保留在下一個頁面。

間接請求轉發

1、間接轉發方式,有時也叫重定向,一般用於避免用戶非正常訪問。
2、例如:
用戶在沒有登錄的情況下訪問后台資源,servlet可以將該HTTP請求重定向到登錄界面,讓用戶登錄后再訪問。
3、代碼示例

doGet{
	response.sendRedirect("資源的URl");
}

多個Servlet之間數據共享實現方案

數據共享:OneServlet工作完畢后,將產生數據交給TwoServlet來使用。

Servlet規范中提供四種數據共享方案

1、ServletContext接口
2、Cookie類
3、HttpSession接口
4、HttpServletRequest接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM