? ?1. 請(qǐng)求重定向方法是sendRedirect(),那么request請(qǐng)求在重定向過程中生存期是多久呈队,有幾個(gè)request請(qǐng)求,一個(gè)還是兩個(gè)慨灭?
? ?2. 請(qǐng)求轉(zhuǎn)發(fā)朦乏,getRequestDispather(),那么請(qǐng)求轉(zhuǎn)發(fā)過程中request請(qǐng)求生存期是多久氧骤,有幾個(gè)request請(qǐng)求呻疹?
重定向過程和實(shí)現(xiàn)
1->? request.setAttribute("demo",demo);
2->? response.sendRedirect("/2.jsp");
? ? 客戶端發(fā)送一個(gè)請(qǐng)求,由服務(wù)器確定要處理請(qǐng)求的Servlet筹陵,處理時(shí)執(zhí)行到sendRedirect()方法刽锤,由于該方法是response響應(yīng)對(duì)象調(diào)用的方法,所以直接給客戶端發(fā)送響應(yīng)朦佩,客戶端會(huì)看到地址欄出現(xiàn):http://localhost:8080/webItem/2.jsp并思。在此過程中request的屬性demo到請(qǐng)求重定向至2.jsp時(shí)就不存在了,客戶端需要在2.jsp頁面重新向服務(wù)器提交請(qǐng)求语稠。前面的請(qǐng)求和后面重新提交的請(qǐng)求是互不干擾宋彼、獨(dú)立的兩個(gè)請(qǐng)求弄砍,那么在前面請(qǐng)求(第一行)設(shè)置的屬性demo(setAttribute())在后面2.jsp重新提交的請(qǐng)求里就獲取不到。
從1.jsp經(jīng)過該Servlet處理請(qǐng)求输涕,重定向到2.jsp音婶,可以看到,2.jsp頁面中沒有拿到demo的數(shù)據(jù)莱坎。
2.jsp頁面代碼:
請(qǐng)求轉(zhuǎn)發(fā)過程和實(shí)現(xiàn)
request.setAttribute("demo",demo);? ?
request.getRequestDispatcher("/2.jsp").forward(request, response);
??? Servlet的dopost方法處理客戶端發(fā)送過來的請(qǐng)求衣式,執(zhí)行到請(qǐng)求轉(zhuǎn)發(fā)forward()時(shí),是將當(dāng)前請(qǐng)求和響應(yīng)對(duì)象一起轉(zhuǎn)發(fā)給2.jsp頁面檐什,整個(gè)流程是在服務(wù)器端完成碴卧,并且是在同一個(gè)請(qǐng)求里面完成的。因此Servlet和Jsp是共享了同一個(gè)request厢汹,那么在Servlet中設(shè)置的所有數(shù)據(jù)螟深,在JSP中都能獲取,所以在2.jsp中能夠獲取demo的值烫葬,顯示給客戶端界弧。請(qǐng)求轉(zhuǎn)發(fā)過程是一個(gè)request和一個(gè)response。
??? 當(dāng)請(qǐng)求轉(zhuǎn)發(fā)給2.jsp搭综,客戶端顯示獲取到了數(shù)據(jù)小薇和10kg垢箕,但從下圖的地址欄中看出,請(qǐng)求轉(zhuǎn)發(fā)是在服務(wù)器端進(jìn)行的兑巾,所以客戶端根本不清楚到底轉(zhuǎn)發(fā)了幾次条获,當(dāng)服務(wù)器Servlet把請(qǐng)求轉(zhuǎn)發(fā)到Jsp時(shí),客戶端只看到顯示的結(jié)果蒋歌,卻不知道結(jié)果是由Servlet產(chǎn)生帅掘。
延伸——Servlet向JSP傳值
??? 前面例子傳值使用的是request對(duì)象的setAttribute方法,然而這種傳值方式在請(qǐng)求轉(zhuǎn)發(fā)時(shí)有效堂油,并且數(shù)據(jù)只能在同為一個(gè)請(qǐng)求時(shí)可行修档,所以不適用于不同的多個(gè)請(qǐng)求之間的傳值。所以不同的多個(gè)請(qǐng)求之間的傳值使用session更合適府框,session設(shè)置屬性和屬性值后吱窝,無論是請(qǐng)求重定向還是請(qǐng)求轉(zhuǎn)發(fā),都能在JSP中獲取到屬性值迫靖。
??? 以請(qǐng)求重定向?yàn)槔合浚褂胹ession傳值:
??? 下圖中地址瀏覽器中出現(xiàn)2.jsp的路徑,顯示使用了請(qǐng)求重定向系宜,但文本框里出現(xiàn)了demo值照激。因此可以說使用session傳值無論是重定向還是轉(zhuǎn)發(fā)都可行。