請求轉發作業原理
方式1:
由瀏覽器發出請求到Web服務器,Web服務器再將得到的資訊傳給Web容器,Web容器根據請求找到第一個資源(大部分為頁面),由于第一個資源并不能完成所有請求需求,請求由第一個請求轉向第二個資源進行處理,以此類推,當所有的資源處理完請求后,由最后一個資源將處理結果相應給Web容器,Wed容器將處理 結果交由Web服務,再由服務器將最終結果相應給客戶端(瀏覽器),基于這一原理也叫權利的暫時移交,如圖:

方式2:
由瀏覽器發出請求到Web服務器,Web服務器再將得到的資訊傳給Web容器,Web容器根據請求找到第一個資源(大部分為頁面),由于第一個資源并不能完成所有請求需求,請求由第一個請求轉向第二個資源進行處理,以此類推,當最后一個資源處理完畢之后,再將處理結果按照逆向傳遞給上一個資源,最終由第一個資源將處理結果相應給Web容器,Wed容器將處理 結果交由Web服務,再由服務器將最終結果相應給客戶端(瀏覽器),基于這一原理也叫權利的暫時移交,如圖:

實體1:request范圍存放資料
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//向request范圍中添加屬性
request.setAttribute("info", "這是request范圍中的資料");
request.setAttribute("username", "張三123");
%>
<!-- 請求轉發 -->
<jsp:forward page="demo03.jsp"></jsp:forward>
</body>
</html>
實體2:接收request范圍中的資料
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 請求轉發(服務端跳轉)能獲取request范圍中的值
請求轉發:客戶端端只發起過一次HTTP請求,如果訪問的一個資源無法完成整個請求回應,則在服務器端
進行跳轉,跳轉之后請求中的資料不會丟失,只有所有的資源共同完成請求后,再相應,所以一次請求中
可以獲取request范圍中的資料
-->
info:<%=request.getAttribute("info") %><br/>
username:<%=request.getAttribute("username") %><br/>
</body>
</html>
運行結果:
info:這是request范圍中的資料
username:張三123
重定向作業原理
重定向(Redirect)就是通過各種方法將各種網路請求重新定個方向轉到其它位置(如:網頁重定向、域名的重定向、路由選擇的變化也是對資料報文經由路徑的一種重定向),如圖:

實體3:request范圍存放資料
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//向request范圍中添加屬性
request.setAttribute("info", "這是request范圍中的資料");
request.setAttribute("username", "張三123");
%>
<!-- a標簽跳轉屬于重定向 -->
<a href="demo03.jsp">跳轉到demo03</a>
</body>
</html>
實體4:接收request范圍中的資料
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--重定向(客戶端的跳轉),不能獲取request范圍中的值
重定向:客戶端發起http請求后,如果服務端的一個資源無法完成整個請求回應,則需要客戶端再次發起請求(相當于多次請求)
在發起請求后可能之前的資料不存在了,所以重定向后資料丟失-->
info:<%=request.getAttribute("info") %><br/>
username:<%=request.getAttribute("username") %><br/>
</body>
</html>
運行結果:
info:null
username:null
請求轉發與重定向的區別:
請求轉發:
- 是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;服務器內部轉發,整個程序處于同一個請求當中,
- 可以理解是服務器端行為,客戶端發起一次請求,這個請求在整個服務器端可以被多次傳遞,但都是由服務器端的處理程式傳遞給另一個處理程式,客戶端不需要發起二次請求,無論這個請求經歷過多少個處理程式,始終都是同一個請求,也就意味著,這個請求中的資料經歷過的每一個處理程式都可以使用,在同一個請求中request范圍中的資料不會丟失,
重定向: - 當使用了重定向跳轉頁面后,在其客戶端路徑欄顯示的應該是其重定向的路徑,客戶端是可以觀察到頁面地址變化的,重定向是客戶端至少做了兩次訪問請求的,
- 可以理解為是客戶端行為,客戶端發起一次請求,服務器端給出一次回應,但這個回應包含下一次客戶端需要訪問的服務器端處理程式的地址,客戶端再次發起請求,將會得到處理結果,也就意味著重定向客戶端至少發起兩次請求,兩次請求程序中request范圍中的資料丟失,
應用場景
- 前端發送請求到后臺的方式(重定向):
1)瀏覽器地址輸入鏈接,
2)a標簽 < a href=“URL 地址”>跳轉< /a>
3)form表單 < form action=“URL地址” method=“get/post”>
< input type=“submit” value=“跳轉”/>
</ form>
4)通過js的BOM操作 window.location.href=“http://www.baidu.com”;
5)AJAX異步請求, - 后端請求轉發和重定向的使用:
1)請求轉發:
req.getRequestDispatcher(servlet或者jsp的請求路徑).forward(req,resp);
2)URL重定向:
resp.sendRedirect("/day47/views/student.jsp");
====================================================================================================
自己也是最近才開始寫文章,看到大家都分享自己的經驗給別人,我也是受益者之一,做人不能只懂的索取而不去回饋,所以也將自己學習的知識分享給大家,我不能保證每個問題都講的是對的,畢竟我也是個學習者,如果有地方寫得不對或理解有誤的,也希望大家給指出,我當非常感謝,撰寫程序也不易,也希望大家給個贊,關注下本人,這也能激勵我繼續分享,
====================================================================================================
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/263836.html
標籤:其他
上一篇:原生JS回傳頂部
下一篇:前后端專案不分離(中-2)
