一、forward和include
RequestDispatcher提供兩個(gè)方法forward和include進(jìn)行資源跳轉(zhuǎn)。
不同的是,如果使用forward跳轉(zhuǎn)則其后面的response輸出則不會(huì)執(zhí)行,而用include來跳轉(zhuǎn),則include的servlet執(zhí)行完后,再返回到原來的servlet執(zhí)行response的輸出(如果有)。
實(shí)例:
servlet A
RequestDispatcher disp = request.getRequestDispatcher("B");
disp.forward(request, response);
System.out.println("servlet A completed");
PrintWriter pw = response.getWriter();
pw.println("servlet A")
servlet B
PrintWriter pw = response.getWriter();
pw.println("servlet B");
輸出結(jié)果:
控制臺:servlet A completed
頁面:servlet B
這表示在forward方法后的pw.println("servlet A") 并未執(zhí)行
如果將forward換成include的話,則結(jié)果為:
控制臺:servlet A completed
頁面:servlet B servlet A
這表示include的servlet執(zhí)行完后,再返回到原來的servlet執(zhí)行response的輸出。
注意:如果在servlet B里吧pw給close掉了的話,那servlet A 這里就無法輸出了,則結(jié)果就和第一個(gè)一樣。
二、dispatcher元素
2.4版本的servlet規(guī)范在部屬描述符中新增加了一個(gè)<dispatcher> 元素,這個(gè)元素有四個(gè)可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一個(gè)<filter-mapping> 元素中加入任意數(shù)目的<dispatcher> ,使得filter將會(huì)作用于直接從客戶端過來的request(REQUEST),通過forward過來的request(FORWARD),通過include過來的request(INCLUDE)和通過<error-page> 過來的request(ERROR)。如果沒有指定任何< dispatcher > 元素,默認(rèn)值是REQUEST。
注意:<dispatcher></dispatcher> 必須寫在filter-mapping的最后。dispatcher的前提條件當(dāng)然是要先滿足url-pattern,然后dispatcher有四種可能的屬性:
1、REQUEST
只要發(fā)起的操作是一次HTTP請求,比如請求某個(gè)URL、發(fā)起了一個(gè)GET請求、表單提交方式為POST的POST請求、表單提交方式為GET的GET請求。一次重定向則前后相當(dāng)于發(fā)起了兩次請求,這些情況下有幾次請求就會(huì)走幾次指定過濾器。
2、FOWARD
只有當(dāng)當(dāng)前頁面是通過請求轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)過來的情形時(shí),才會(huì)走指定的過濾器
3、INCLUDE
只要是通過<jsp:include page="xxx.jsp" /> ,嵌入進(jìn)來的頁面,每嵌入的一個(gè)頁面,都會(huì)走一次指定的過濾器。
4、ERROR
假如web.xml里面配置了<error-page></error-page> :
<error-page>
<error-code>400</error-code>
<location>/filter/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/filter/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/filter/error.jsp</location>
</error-page>
意思是HTTP請求響應(yīng)的狀態(tài)碼只要是400、404、500三種狀態(tài)碼之一,容器就會(huì)將請求轉(zhuǎn)發(fā)到error.jsp下,這就觸發(fā)了一次error,走進(jìn)了配置的DispatchFilter。需要注意的是注意一點(diǎn)的是,雖然把請求轉(zhuǎn)發(fā)到error.jsp是一次forward的過程,但是配置成<dispatcher>FORWARD</dispatcher> 并不會(huì)走DispatchFilter這個(gè)過濾器。
這四種dispatcher方式可以單獨(dú)使用,也可以組合使用,配置多個(gè)<dispatcher></dispatcher> 即可。
|