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、請求地址:既可以把當前網站內部的資原始檔地址傳送給瀏覽器(/網站名/資原始檔名);也可以把其他網站資原始檔地址傳送給瀏覽器(
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介面