Servlet請求轉(zhuǎn)發(fā)與重定向

RequestDispatcher實現(xiàn)請求轉(zhuǎn)發(fā)

當(dāng)一個 Web 資源收到客戶端的請求后,如果希望服務(wù)器通知另外一個資源處理請求,那么這時可以通過 RequestDispatcher 接口的實例對象實現(xiàn)。ServletRequest 接口中定義了一個獲取 RequestDispatcher 對象的方法,如表 1 所示。

獲取 RequestDispatcher 對象的方法

方法聲明 功能描述
RequestDispatcher getRequestDispatcher (String path) 返回封裝了某條路徑所指定資源的 RequestDispatcher 對象。其中,參數(shù) path 必須以“/”開頭,用于表示當(dāng)前 Web 應(yīng)用的根目錄。需要注意的是,WEB-INF 目錄中的內(nèi)容對 RequestDispatcher 對象也是可見的。因此,傳遞給 getRequestDispatcher(String path) 方法的資源可以是 WEB-INF 目錄中的文件

獲取到 RequestDispatcher 對象后,最重要的工作就是通知其他 Web 資源處理當(dāng)前的 Servlet 請求,為此,RequestDispatcher 接口定義了兩個相關(guān)方法,如表 2 所示。

RequestDispatcher 接口的方法

方法聲明 功能描述
forward(ServletRequest request,ServletResponse response) 該方法用于將請求從一個 Servlet 傳遞給另一個 Web 資源。在 Servlet 中,可以對請求做一個初步處理,然后通過調(diào)用這個方法,將請求傳遞給其他資源進(jìn)行響應(yīng)。需要注意的是,該方法必須在響應(yīng)提交給客戶端之前被調(diào)用,否則將拋出 IllegalStateException 異常
include(ServletRequest request,ServletResponse response) 該方法用于將其他的資源作為當(dāng)前響應(yīng)內(nèi)容包含進(jìn)來

請求轉(zhuǎn)發(fā)

在 RequestDispatcher 接口中,forward() 方法可以實現(xiàn)請求轉(zhuǎn)發(fā),include() 方法可以實現(xiàn)請求包含,本節(jié)將以請求轉(zhuǎn)發(fā)為例,講解 forward() 方法的使用。

在 Servlet 中,如果當(dāng)前 Web 資源不想處理請求,則可以通過 forward() 方法將當(dāng)前請求傳遞給其他的 Web 資源進(jìn)行處理,這種方式稱為請求轉(zhuǎn)發(fā)。請求轉(zhuǎn)發(fā)的工作原理如圖 1 所示。

從圖 1 中可以看出,當(dāng)客戶端訪問 Servlet1 時,可以通過 forward() 方法將請求轉(zhuǎn)發(fā)給其他 Web 資源,其他 Web 資源處理完請求后,直接將響應(yīng)結(jié)果返回到客戶端。

了解了 forward() 方法的工作原理后,下面通過案例演示 forward() 方法的使用。在 servletDemo02 項目的 com.mengma.request 包中創(chuàng)建一個名為 RequestForwardServlet 的 Servlet 類,該類使用 forword() 方法將請求轉(zhuǎn)發(fā)到一個新的 Servlet 頁面,如下所示。

forward()方法的工作原理

圖 1 forward() 方法的工作原理

HttpServletResponse .sendRedirect()實現(xiàn)重定向(頁面跳轉(zhuǎn))

在某些情況下,針對客戶端的請求,一個 Servlet類可能無法完成全部工作。這時,可以使用請求重定向完成這一工作。

請求重定向指 Web 服務(wù)器接收到客戶端的請求后,可能由于某些條件的限制,不能訪問當(dāng)前請求 URL 所指向的 Web 資源,而是指定了一個新的資源路徑,讓客戶端重新發(fā)送請求。

為了實現(xiàn)請求重定向,HttpServletResponse 接口定義了一個 sendRedirect() 方法,該方法用于生成 302 響應(yīng)碼和 Location 響應(yīng)頭,從而通知客戶端重新訪問 Location 響應(yīng)頭中指定的 URL,sendRedirect() 方法的完整語法如下所示:

public void sendRedirect(java.lang.String location) throws java.io.IOException

在上述方法代碼中,參數(shù) location 可以使用相對 URL,Web 服務(wù)器會自動將相對 URL 翻譯成絕對 URL,再生成 Location 頭字段。

sendRedirect() 方法的工作原理如圖 1 所示。

圖 1 sendRedirect()方法的工作原理

在圖 1 中,當(dāng)客戶端訪問 Servlet1 時,由于在 Servlet1 中調(diào)用了 sendRedirect() 方法將請求重定向到 Servlet2,因此,瀏覽器收到 Servlet1 的響應(yīng)消息后,立刻向 Servlet2 發(fā)送請求,Servlet2 對請求處理完畢后,再將響應(yīng)消息回送給客戶端瀏覽器并顯示。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容