溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別有哪些

發(fā)布時(shí)間:2021-06-08 14:31:42 來(lái)源:億速云 閱讀:142 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別有哪些,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

什么是請(qǐng)求轉(zhuǎn)發(fā)?

請(qǐng)求轉(zhuǎn)發(fā)是指,服務(wù)器收到請(qǐng)求后,從一次資源跳轉(zhuǎn)到另一個(gè)資源的操作。

JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別有哪些

請(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ù)");
    }
}

JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別有哪些

注意

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)求重定向?

請(qǐng)求重定向:是指客戶(hù)端發(fā)送請(qǐng)求,然后服務(wù)器告訴客戶(hù)端,我給你一個(gè)地址,你去新的地址訪問(wèn)(之前的地址可能已經(jīng)被廢棄,或者之前的地址[Servlet]無(wú)法滿(mǎn)足需求);

JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別有哪些

第一種方案

// 設(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è)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI