服務(wù)器端的重定向可以有兩種方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.
HttpServletResponse.sendRedirect()方法將響應(yīng)定向到參數(shù)location指定的、新的URL。location可以是一個(gè)絕對(duì)的URL,如response.sendRedirect("http://java.sun.com")也可以使用相對(duì)的URL。如果location以“/”開(kāi)頭,則容器認(rèn)為相對(duì)于當(dāng)前Web應(yīng)用的根,否則,容器將解析為相對(duì)于當(dāng)前請(qǐng)求的URL。這種重定向的方法,將導(dǎo)致客戶(hù)端瀏覽器的請(qǐng)求URL跳轉(zhuǎn)。從瀏覽器中的地址欄中可以看到新的URL地址,作用類(lèi)似于上面設(shè)置HTTP響應(yīng)頭信息的實(shí)現(xiàn)。
RequestDispatcher.forward()方法將當(dāng)前的request和response重定向到該RequestDispacher指定的資源。這在實(shí)際項(xiàng)目中大量使用,因?yàn)橥瓿梢粋€(gè)業(yè)務(wù)操作往往需要跨越多個(gè)步驟,每一步驟完成相應(yīng)的處理后,轉(zhuǎn)向到下一個(gè)步驟。比如,通常業(yè)務(wù)處理在Servlet中處理,處理的結(jié)果轉(zhuǎn)向到一個(gè)JSP頁(yè)面進(jìn)行顯示。這樣看起來(lái)類(lèi)似于Servlet鏈的功能,但是還有一些區(qū)別。一個(gè)RequestDispatcher對(duì)象可以把請(qǐng)求發(fā)送到任意一個(gè)服務(wù)器資源,而不僅僅是另外一個(gè)Servlet。 include()方法將把Request Dispatcher資源的輸出包含到當(dāng)前輸出中。
注意,只有在尚未向客戶(hù)端輸出響應(yīng)時(shí)才可以調(diào)用forward()方法,如果頁(yè)面緩存不為空,在重定向前將自動(dòng)清除緩存。否則將拋出一個(gè)IllegalStateException異常。