在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
下面是流程圖
本人知識有限,如有錯誤,望指出
此文系原創,轉載請聲明出處。