關於java中sendRedirect,forward和include區別


在javaWeb中頁面跳轉一般有三種形式,sendRedirect,forward和include,三者有什么區別呢?

我先進行說明,再以一個小例子說明

一、sendRedirect

使用方式

response.sendRedirect();

服務器根據邏輯,發送一個狀態碼,告訴瀏覽器去請求指定的地址,把需要的參數放在轉發的地址里面。由於是一次新的申請,原先的request就不能讀取了,可以使用session代替,或者使用include,和forward代替

二、forward

使用方式

request.getRequestDispatcher("/first.jsp").forward(request, response);

頁面會是first.jsp的內容,地址欄不變

可以使用設置屬性

三、include

使用方式

request.getRequestDispatcher("/first.jsp").include(request, response);

頁面會同時包含當前頁面和first.jsp的內容

可以使用設置屬性

 

下面是一個例子

index.jsp

<%@ page language="java" contentType="text/html; charset=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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>index.jsp 頁面</h1>
<a href="first.jsp">first.jsp</a><br/>
<a href="first.jsp?id=123456">first.jsp帶id123456</a><br/>
<a href="second.jsp">second.jsp</a><br/>
<a href="second.jsp?id=123456">second.jsp帶id123456</a><br/>
<a href="third.jsp">third.jsp</a><br/>
<a href="third.jsp?id=123456">third.jsp帶id123456</a><br/>

可以獲取id為:<%=request.getParameter("id") %>
</body>
</html>

first.jsp

<%@ page language="java" contentType="text/html; charset=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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>first.jsp 頁面</h1>
提交的ID:<%=request.getParameter("id")%>
 <% 
 		response.sendRedirect(request.getContextPath()+"/index.jsp");
 		System.out.println("first.jsp有訪問過了");
 %>
</body>
</html>

second.jsp

<%@ page language="java" contentType="text/html; charset=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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>second.jsp 頁面</h1>

<%

	request.getRequestDispatcher("/index.jsp").forward(request, response);
%>
提交的ID:<%=request.getParameter("id")%>

</body>
</html>

third.jsp

<%@ page language="java" contentType="text/html; charset=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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>third.jsp 頁面</h1>
提交的ID:<%=request.getParameter("id")%>
<%
	request.getRequestDispatcher("/fourth.jsp").include(request, response);
	request.getRequestDispatcher("/index.jsp").include(request, response);


%>
<hr>

</body>
</html>

fourth.jsp 

<%@ page language="java" contentType="text/html; charset=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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>fourth.jsp 頁面</h1>
<hr>
</body>
</html>

接下來運行服務器(使用的是TomCat8.0)

訪問項目

點擊第一個鏈接

 

頁面沒有變化,但是控制台有輸出,表示訪問過了

我們試着傳一個參數過去id=123456

不能獲取id,說明是瀏覽器重新發出的一個請求,request已經被銷毀,這個是一個新的request

下面放上流程圖

點擊第三個連接

頁面沒有變化,但是地址欄發生變化

我們傳一個參數進去

有了,可以顯示id,說明是同一個request

下面放上流程圖

因為forward是服務器內部跳轉,會帶着request一起到下一個頁面,所以id可以獲得

接着點擊第五條鏈接

頁面發生變化,同時包含了,third.jsp和fourth.jsp的內容

我們傳一個參數

可以獲得request

下面是流程圖

本人知識有限,如有錯誤,望指出

此文系原創,轉載請聲明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM