IT兄弟連 JavaWeb教程 Servlet轉發
- 2019 年 10 月 5 日
- 筆記
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/ITXDL123/article/details/90089715
Servlet對象由Servlet容器創建,並且Servlet對象的service()方法也由容器調用,一個Servlet對象可否直接調用另一個Servlet對象的service()方法呢?答案是否定的,因為一個Servlet對象無法獲得另一個Servlet對象的引用。
Web應用在響應客戶端的一個請求時,有可能響應過程很複雜,需要多個Web項目組件共同協作,才能生成響應結果。儘管一個Servlet對象無法直接調用另一個Servlet對象的service()方法,但Servlet規範為Web組件之間的協作提供了兩種途徑。
● 請求轉發:Servlet(源組件)先對客戶請求做一些預處理,然後把請求轉發給其他Web組件(目標組件)來完成包含生成響應結果在內的後續操作。
● 包含:Servlet(源組件)把其他Web組件(目標組件)生成的響應結果包含到自身的響應結果中。
請求轉發與包含具有以下共同特點:
源組件和目標組件處理的都是同一個客戶請求,源組件和目標組件共享一個ServletRequest對象和ServletResponse對象。
目標組件都可以為Servlet、JSP或HTML文檔。
都依賴javax.servlet.RequestDispatcher接口。
javax.servlet.RequsetDispatcher接口表示請求分發器,它有兩個方法。
● forward()方法:把請求轉發給目標組件,該方法的聲明如下:
public void forward(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
● include()方法:包含目標組件的響應結果,該方法的聲明如下:
public void include(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
當Servlet源組件調用RequestDispatcher和forward()或include()方法時,都要把當前的ServletRequest對象和ServletResponse對象作為參數傳給forward()或include()方法。這使得源組件和目標組件共享同一個ServletRequest對象和ServletResponse對象。
Servlet可通過兩種方式得到RequestDispatcher對象:
● 調用ServletContext的getRequestDispatcher(String path)方法,path參數指定目標組件的路徑。
● 調用HttpServletRequest的getRequestDispathcer(String path)方法,path參數指定目標組件的路徑。
以上兩種方式的區別在於,前者的path參數必須為絕對路徑,而後者的path參數既可以為絕對路徑,也可以為相對路徑。所謂絕對路徑就是以"/"開頭的路徑,"/"表示當前Web應用的URL入口,所謂相對路徑,就是指相對於當前源組件的路徑,不以符號"/"開頭。