請求轉發和請求包含的區別
這個問題是非常重要的,是高校的期末考試和公司面試中經常出現的問題,請求轉發,和請求包含,
二者的共同特點:
*這兩種都是一個請求跨多個Servlet(可以共享request的域屬性)
*多個Servlet在一個請求中共享一個Request物件,比如說就是:在AServlet.setAttribuet()方法執行之後,可以在BServlet.getAttribute();
二者的區別:
*請求轉發可以這樣理解:如果ASerlet轉發到BServlet 中,那麼這個請求就交給bServlet來處理,ASevlet就不要插手了。
*請求包含,例如:AServlet包含BServlet,那麼這兩個Servlet共同處理請求
二者的聯絡:
請求轉發和請求包含都需要一個相同的物件,RequestDispatcher,
RequestDispatcherrd = request.getRequestDispatcher(“path”),這個方法的引數是你要轉發或者包含的Servlet的<url-patting>,
rd.forword(request,response)//請求轉發,
(給下一個Servlet傳遞引數request和response,如果Aservlet已經請求Bservlet ,那麼Aservlet就不要在繼續執行響應了,否則的結果就是伺服器並不會把Aservlet請求之後使得資料發出,並且把資料清空。)
rd.include(request,response)//請求包含
請求:
如果Aservlet請求BServlet那麼A中最好不要在新增響應體,否則導致的結果即是兩種,但是新增響應頭是可以的(就是“留頭不留體”)
*資料被清空,不會發送到客戶端。
*資料已提交但是在轉發時出現異常。
包含:
簡稱留頭又留體,由兩個Servlet共同完成響應。
!!!請求轉發(請求包含)於重定向之間的區別:
1:請求轉發是一個請求,但是重定向是兩個請求。
2:請求轉發只能是一種請求方式,要麼是Get要麼是Post ,但是重定向的第二個請求一定是Get。
3:請求轉發的位址列並不會發生變化,但是重定向的會變化,因為它是兩個請求。
4:請求轉發只能在本應用下的資源,但是重定向卻可以跨應用,比如重定向到百度的主頁。