servlet可以將發(fā)送給自己的某個(gè)請(qǐng)求轉(zhuǎn)發(fā)給另外一個(gè)URL地址,這個(gè)地址可以是html、jsp、servlet或是其他的http地址。 servlet的請(qǐng)求轉(zhuǎn)發(fā)有三種方式:
1.inclue方法,應(yīng)用代碼為request.getRequestDispatcher("/url").include(request, response),其中URL地址是某個(gè)http地址。include轉(zhuǎn)發(fā)時(shí),地址欄沒(méi)有改變,是原來(lái)的地址,這個(gè)過(guò)程是在服務(wù)器端完成,Servlet和被包含的頁(yè)面同時(shí)被輸出。
2.forward方法,request.getRequestDispatcher("/url").forward(request, response),地址欄也不會(huì)改變,同樣是在服務(wù)器端完成,但僅輸出被轉(zhuǎn)發(fā)的URL中的內(nèi)容。
3.sendRedirect,只是客戶重新發(fā)起一個(gè)請(qǐng)求,第二個(gè)請(qǐng)求指向其參數(shù)url。一般稱做重定向,客戶端的地址欄將改變?yōu)閡rl值,是由客戶端發(fā)起的第二次請(qǐng)求。參數(shù)中要寫(xiě)明具體的url地址,因?yàn)楫?dāng)客戶端再次發(fā)送請(qǐng)求時(shí),會(huì)直接請(qǐng)求web服務(wù)器根目錄。要是要轉(zhuǎn)發(fā)的一個(gè)html地址,它在WEB-INF文件夾下,那么要從servlet轉(zhuǎn)發(fā)到這個(gè)
html地址,必須加上當(dāng)前的web路勁名,這個(gè)路勁名可以通過(guò)request.getContextPath()獲得,那么該轉(zhuǎn)發(fā)代碼可以為response.sendRedirect(request.getContextPath()+"/login.html");
注意:重定向是瀏覽器向服務(wù)器重新發(fā)出請(qǐng)求,但轉(zhuǎn)發(fā)相當(dāng)于把request的范圍擴(kuò)大,例如: 在a界面有個(gè)連接<a href="b.jsp?id=1">,在b界面可以通過(guò)request.getAttribute("id")獲得, 在b界面也有個(gè)連接<a href="c.jsp?name="123">,則在界面用request.getAttribute("id")就取不到值。這是每個(gè)連接就像一個(gè)重定向,相當(dāng)于重新創(chuàng)建了一個(gè)request,當(dāng)b->c時(shí),a->b的request已經(jīng)結(jié)束了。 接下來(lái),在c的界面前加<jsp:forward page="d.jsp"/> ,那么變量name在c、d都有效,所以在d想取到參數(shù)name的值,不必要把參數(shù)值放到session里來(lái)擴(kuò)大他的范圍。 |
|
來(lái)自: 擎天豬mpnlajkd > 《Servlet》