更新時(shí)間:2021-09-06 12:34:47 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1472次

請(qǐng)求轉(zhuǎn)發(fā): xxServlet收到請(qǐng)求,然后直接轉(zhuǎn)發(fā)給yyServlet,然后yyServlet返回給客戶端。整個(gè)過(guò)程中,客戶端發(fā)出一個(gè)請(qǐng)求,收到一個(gè)響應(yīng)。

重定向:xxServlet收到請(qǐng)求,然后發(fā)出一個(gè)響應(yīng)給客戶端,客戶端立即又發(fā)送一個(gè)請(qǐng)求訪問(wèn)xxServlet中給的URL,即yyServlet的路徑,然后yyServlet給客戶端一個(gè)響應(yīng)。整個(gè)過(guò)程中,客戶端發(fā)出兩個(gè)請(qǐng)求,收到兩個(gè)響應(yīng)。
請(qǐng)求轉(zhuǎn)發(fā):利用RequestDispather接口中的forward方法實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)。
請(qǐng)求重定向:利用HttpServletResponse的sendRedirect方法實(shí)現(xiàn)請(qǐng)求重定向。
(1)請(qǐng)求轉(zhuǎn)發(fā)
RequestDispather實(shí)例對(duì)象是由Servlet引擎創(chuàng)建的,它用于包裝一個(gè)要被其他資源調(diào)用的資源,(例如Servlet,HTML文件,JSP文件等),并可以通過(guò)其中的方法將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給所包裝的資源。
示例代碼如下:
forwardTest.html
<!DOCTYPE html>
<html>
<head>
<title>forwardTest.html</title>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<a href="http://localhost:8080/MyWebProject/forwardServlet">forward</a>
</body>
</html>
forwardServlet.java
package forwardTest;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class forwardServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
System.out.println("forwardServlet's doGet");
String path="testServlet";
//1.調(diào)用HttpServletRequest的getRequestDispatcher()方法,調(diào)用時(shí)需要傳入轉(zhuǎn)發(fā)的地址;
RequestDispatcher requestDispatcher=request.getRequestDispatcher(path);
//2.調(diào)用HttpServletRequest的forward(request,response)方法進(jìn)行請(qǐng)求的轉(zhuǎn)發(fā);
requestDispatcher.forward(request,response);
}
}
testServlet.java
package forwardTest;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class testServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
System.out.println("testServlet's doGet");
}
}
運(yùn)行forwardTest.html后,點(diǎn)擊超鏈接,控制臺(tái)輸出:

可以看出, forwardServlet收到客戶端的請(qǐng)求后,調(diào)用HttpServletRequest的getRequestDispatcher()方法,利用forward(request,response)方法進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),將請(qǐng)求直接轉(zhuǎn)發(fā)給testServlet,testServlet將響應(yīng)返回給客戶端。達(dá)到了請(qǐng)求轉(zhuǎn)發(fā)的目的。
(2)請(qǐng)求重定向
redirectServlet.java
package forwardTest;
import java.io.IOException;
//import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class redirectServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("redirectServlet's doGet");
String path="testServlet";
response.sendRedirect(path);
}
}
執(zhí)行請(qǐng)求的重定向,直接調(diào)用response.sendRedirect(path)方法,path為重定向的地址。
本質(zhì)區(qū)別:請(qǐng)求的轉(zhuǎn)發(fā)只發(fā)出了一次請(qǐng)求,而重定向則發(fā)出了兩次請(qǐng)求。在瀏覽器的開(kāi)發(fā)工具中可以看到請(qǐng)求的次數(shù):


具體的區(qū)別體現(xiàn)在:
(1)請(qǐng)求的轉(zhuǎn)發(fā):地址欄是初次發(fā)出請(qǐng)求的地址。
請(qǐng)求的重定向:地址欄不是初次發(fā)出請(qǐng)求的地址,為最后響應(yīng)的地址。
(2)請(qǐng)求轉(zhuǎn)發(fā):在最終的Servlet中,request和中轉(zhuǎn)的那個(gè)request是同一個(gè)對(duì)象。
請(qǐng)求的重定向:在最終的Servlet中,request和中轉(zhuǎn)的那個(gè)request不是同一個(gè)對(duì)象。
(3)請(qǐng)求轉(zhuǎn)發(fā):只能轉(zhuǎn)發(fā)給當(dāng)前web應(yīng)用的資源。
請(qǐng)求的重定向:可以重定向到任何資源。
(4)請(qǐng)求的轉(zhuǎn)發(fā):/代表的是當(dāng)前web應(yīng)用的根目錄。
請(qǐng)求的重定向:/代表的是當(dāng)前web站點(diǎn)的根目錄。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"JavaWeb重定向和請(qǐng)求的轉(zhuǎn)發(fā)",希望對(duì)大家有幫助,想了解更多可查看JavaWeb教程。動(dòng)力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)