getRequestDispatcher()
getRequestDispatcher() 包含兩個方法,分別是請求轉發和請求包含。
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");
rd.forward(request, response); // 請求轉發
rd.include(request, response); // 請求包含
- 請求轉發:當前Servlet可以設置響應頭,由下一個Servlet完成響應體,下一個Servlet輸出響應體后,當前Servlet不可以繼續輸出!(留頭不留體)
- 請求包含:當前Servlet可以設置響應頭,由兩個Servlet共同完成響應體,下一個Servlet輸出響應體后,當前Servlet可以繼續輸出!(留頭又留體)
無論是請求轉發還是請求包含,都在一個請求范圍內!使用同一個request和response。
請求轉發和重定向的區別
- 請求轉發只有一次請求和一次響應,重定向有兩次請求和兩次響應。
- 請求轉發地址不發生改變,重定向會跳轉到后一個請求的地址。
- 請求轉發只能轉發到本項目的其它Servlet,重定向不只能重定向到本項目的其它Servlet,還能重定向到其它項目。
- 請求轉發是服務端行為,只需給出轉發的Servlet路徑,重定向需要給出requestURI,既包含項目名。
請求值傳遞
同一個請求范圍內可以使用request.setAttribute()和request.getAttribute()來相互傳值。前一個Servlet調用setAttribute()保存值,后一個Servlet調用getAttribute()獲取值。