您好,登錄后才能下訂單哦!
小編給大家分享一下JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
請(qǐng)求轉(zhuǎn)發(fā)是指,服務(wù)器收到請(qǐng)求后,從一次資源跳轉(zhuǎn)到另一個(gè)資源的操作。
請(qǐng)求轉(zhuǎn)發(fā)的特點(diǎn)
1.瀏覽器地址欄不會(huì)發(fā)生變化
2.他們一次請(qǐng)求,服務(wù)器完成轉(zhuǎn)發(fā)操作
3.共享Request域中的數(shù)據(jù)
4.可以轉(zhuǎn)發(fā)到WEB-INF目錄下
5.不可以訪問(wèn)工程以外的資源
舉個(gè)例子:
1.一個(gè)公司有多個(gè)部門(mén),其中部門(mén)1(Servlet1)向客戶(hù)提供了自己能夠提供的服務(wù),但是還有一部分服務(wù)自己提供不了,需要其他部門(mén)的服務(wù);
2.所以部門(mén)1(Servlet1)將客戶(hù)的文件蓋一個(gè)章,證明部門(mén)1已經(jīng)提供了服務(wù),然后將其轉(zhuǎn)交(請(qǐng)求轉(zhuǎn)發(fā))到部門(mén)2(Servlet2);
3.部門(mén)2檢查部門(mén)1是否蓋過(guò)章了,如果蓋過(guò)章就繼續(xù)向客戶(hù)提供服務(wù)…;
4.直到所有服務(wù)都處理完,將客戶(hù)需要的數(shù)據(jù)提供給客戶(hù)(即,將數(shù)據(jù)轉(zhuǎn)發(fā)給客戶(hù)端**[轉(zhuǎn)發(fā)到某個(gè)頁(yè)面]**);
package servlet; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Servlet1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.servlet1先獲取請(qǐng)求參數(shù),看看servlet1需要做的事 String username = request.getParameter("username"); System.out.println(username); //.....部門(mén)1提供自己的服務(wù) //2.servlet1設(shè)置一個(gè)參數(shù)證明servlet1轉(zhuǎn)發(fā)的請(qǐng)求(部門(mén)1蓋一個(gè)章) request.setAttribute("key1", "servlet1"); //3.查詢(xún)servlet2的路徑,(部門(mén)1將其轉(zhuǎn)交給部門(mén)1) RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2"); //4.把請(qǐng)求和響應(yīng)轉(zhuǎn)發(fā)給servlet2 dispatcher.forward(request, response); } }
package servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Servlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //部門(mén)2查看客戶(hù)需要的服務(wù) System.out.println("Servlet2查看參數(shù): "+request.getParameter("username")); //部門(mén)2查看部門(mén)1有沒(méi)有蓋章,判斷是否繼續(xù)服務(wù) System.out.println("Servlet2查看是否有Servlet1的證明: "+request.getAttribute("key1")); //部門(mén)2處理完自己的服務(wù), System.out.println("Servlet處理自己的業(yè)務(wù)"); } }
注意
1.這時(shí)候如果我們將Servlet2放在WEB_INF下,那么我們就無(wú)法直接訪問(wèn)servlet2了;
2.但是我們可以通過(guò)請(qǐng)求轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn)訪問(wèn)servlet2;
思考:登錄功能和這種請(qǐng)求轉(zhuǎn)發(fā)方法類(lèi)似,我們無(wú)法跳過(guò)登錄界面直接訪問(wèn)系統(tǒng),所有我們可以用這種請(qǐng)求轉(zhuǎn)發(fā)的方法來(lái)實(shí)現(xiàn);
請(qǐng)求重定向:是指客戶(hù)端發(fā)送請(qǐng)求,然后服務(wù)器告訴客戶(hù)端,我給你一個(gè)地址,你去新的地址訪問(wèn)(之前的地址可能已經(jīng)被廢棄,或者之前的地址[Servlet]無(wú)法滿(mǎn)足需求);
第一種方案
// 設(shè)置響應(yīng)狀態(tài)碼 302 ,表示重定向,(已搬遷) resp.setStatus(302); // 設(shè)置響應(yīng)頭,說(shuō)明 新的地址在哪里 resp.setHeader("Location", http://localhost:8080);
第二種方案(推薦使用)
resp.sendRedirect(http://localhost:8080);
請(qǐng)求重定向的特點(diǎn)
1.瀏覽器的地址欄會(huì)發(fā)生變化
2.瀏覽器發(fā)送了兩次請(qǐng)求,而不是像調(diào)用request的getRequestDispatcher("/a/b/c.html").forward(request, response)方法實(shí)現(xiàn)的;所以一共創(chuàng)建了兩個(gè)request對(duì)象
3.兩個(gè)request對(duì)象不能共享域數(shù)據(jù)
4.重定向不能訪問(wèn)WEB-INF里的資源,因?yàn)閮纱握?qǐng)求都是客戶(hù)端發(fā)起的,客戶(hù)端無(wú)法直接訪問(wèn)到WEB-INF里的資源
5.可以訪問(wèn)工程外的資源(比如說(shuō)調(diào)轉(zhuǎn)的百度等等)
什么時(shí)候使用請(qǐng)求重定向?
1.瀏覽會(huì)記錄最后一次請(qǐng)求的所有數(shù)據(jù),客戶(hù)端可以通過(guò)刷新頁(yè)面的方法,重新發(fā)起最后一次請(qǐng)求;
2.而我們?cè)谡?qǐng)求轉(zhuǎn)發(fā)或請(qǐng)求重定向之前,總會(huì)處理一些業(yè)務(wù);此時(shí),如果當(dāng)本次業(yè)務(wù)是對(duì)數(shù)據(jù)庫(kù),本地文件的增刪改操作時(shí),就需要使用請(qǐng)求重定向;
為什么呢?
因?yàn)椋@時(shí)如果我們使用請(qǐng)求轉(zhuǎn)發(fā)(整個(gè)處理業(yè)務(wù)過(guò)程就只是一次請(qǐng)求),瀏覽就會(huì)記錄我們這次請(qǐng)求(操作數(shù)據(jù)庫(kù)),一旦客戶(hù)端刷新頁(yè)面,就會(huì)執(zhí)行(操作數(shù)據(jù)庫(kù))的請(qǐng)求,這時(shí)很?chē)?yán)重的bug,我們要避免,所有就要用到請(qǐng)求重定向;
1.因?yàn)槲覀兠看尾僮魍陻?shù)據(jù)庫(kù),都會(huì)跳轉(zhuǎn)到首頁(yè),或者數(shù)據(jù)展示的頁(yè)面,所以這時(shí)我們使用請(qǐng)求重定向跳轉(zhuǎn)到這個(gè)頁(yè)面(實(shí)際是跳轉(zhuǎn)到某個(gè)Servlet查詢(xún)數(shù)據(jù)庫(kù)中的記錄,這個(gè)Servlet再跳轉(zhuǎn)到數(shù)據(jù)展示的頁(yè)面);
2.此時(shí)瀏覽器記錄的最后一次請(qǐng)求就是查詢(xún)數(shù)據(jù)庫(kù)中記錄的請(qǐng)求了,這時(shí)我們刷新頁(yè)面,也只是查詢(xún)數(shù)據(jù),不再是對(duì)數(shù)據(jù)庫(kù)的增刪改了;
看完了這篇文章,相信你對(duì)“JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別有哪些”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。