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入口,所謂相對路徑,就是指相對於當前源組件的路徑,不以符號"/"開頭。