在Servlet中,利用RequestDispatcher對象,可以將請求轉(zhuǎn)發(fā)給另外一個(gè)Servlet或JSP頁面,甚至是HTML頁面,來處理對請求的響應(yīng)。
一,RequestDispatcher接口方法簡介
1,RequestDispatcher對象由Servlet容器來創(chuàng)建,封裝一個(gè)由路徑所標(biāo)識(shí)的服務(wù)器資源。
2,RequestDispatcher接口中定義了二種方法用于請求轉(zhuǎn)發(fā):
forward(ServletRequest,ServletResponse)方法:
將請求轉(zhuǎn)發(fā)給服務(wù)器上另外一個(gè)Servlet,JSP頁面,或者HTML文件 這個(gè)方法必須在響應(yīng)被提交給客戶端之前調(diào)用,否則拋出異常。
方法調(diào)用后在響應(yīng)中的沒有提交的內(nèi)容被自動(dòng)消除。
include(ServletRequest,ServletResponse)方法 :
用于在響應(yīng)中包含其他資源(Servlet,JSP頁面或HTML文件)的內(nèi)容。
即請求轉(zhuǎn)發(fā)后,原先的Servlet還可以繼續(xù)輸出響應(yīng)信息,轉(zhuǎn)發(fā)到的Servlet對請求做出的響應(yīng)將并入原先Servlet的響應(yīng)對象中。
3,forward方法和include方法的區(qū)別:
forward方法調(diào)用后在響應(yīng)中的沒有提交的內(nèi)容被自動(dòng)消除。 include方法使原先的Servlet和轉(zhuǎn)發(fā)到的Servlet都可以輸出響應(yīng)信息。
二,得到RequestDispatcher對象
三種方法可以得到RequestDispatcher對象:
1,利用ServletRequest接口中的getRequestDispatcher(String path)方法。
2,ServletContext接口中g(shù)etNamedDispatcher(String path)和getRequestDispatcher(String path)方法。
ServletRequest接口和ServletContext接口中g(shù)etRequestDispatcher方法區(qū)別:
1,參數(shù)的區(qū)別
參數(shù)雖然都是資源路徑名,ServletContext接口的中參數(shù)路徑必須以“/”開始,是相對于當(dāng)前Servlet上下文根, ServletRequest接口中的參數(shù)路徑不僅可以相對于當(dāng)前Servlet上下文根,還可以相對與當(dāng)前Servlet路徑
2,跨WEB應(yīng)用程序訪問資源
通過ServletContext.getContext()方法獲取另個(gè)WEB應(yīng)用程序的上下文環(huán)境對象來 調(diào)用getRequestDispatcher(String path)方法 將請求轉(zhuǎn)發(fā)到另個(gè)WEB應(yīng)用程序的資源。
還需要在當(dāng)前WEB應(yīng)用程序配置中設(shè)置<context>元素,指定crossContext屬性值為true。
三,ServletResqonse接口中的sendRedirect()方法和forward()方法的區(qū)別
二個(gè)方法都是用于請求轉(zhuǎn)發(fā)的方法,轉(zhuǎn)發(fā)給另外的資源為客戶端服務(wù)。但二者有本質(zhì)的區(qū)別
sendRedirect()方法原理:
1,客戶端發(fā)送請求,Servlet1做出處理。
2,Servlet1調(diào)用sendReadirect()方法,將客戶端的請求 重新定位 到Servlet2。
3,客戶端瀏覽器訪問Servlet2.
4,Servlet2對客戶端瀏覽器做出響應(yīng)。
forward()方法原理:
1,客戶端發(fā)送請求,Servlet1做出處理。
2,Servlet1調(diào)用forward()方法,將請求轉(zhuǎn)發(fā)給Servlet2來處理請求,為客戶端服務(wù)。
3,Servlet2對客戶端瀏覽器做出響應(yīng)。
區(qū)別:
1,定位與轉(zhuǎn)發(fā)
sendRedirect()方法是重新定位到另外一個(gè)資源來處理請求,URL會(huì)重新定位,讓客戶端重新訪問另外一個(gè)資源。 forward()方法是轉(zhuǎn)發(fā)到另外一個(gè)資源來處理請求。URL不會(huì)變化。隱藏了處理對象的變化。
2,處理請求的資源的范圍
sendReadirect()方法可以跨WEB應(yīng)用程序和服務(wù)器重新定位資源來處理請求。 forward()方法只能在應(yīng)用程序內(nèi)部轉(zhuǎn)發(fā)。