多個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接口