1. 程式人生 > >response、請求轉發和重定向

response、請求轉發和重定向

response響應物件
提供的方法:
void addCookie(Cookie cookie); 伺服器向客戶端增加cookie物件
void sendRedirect(String location) throws IOException; 頁面跳轉的一種方式(重定向)
void setContentType(String type); 設定服務端響應的編碼(設定服務端tomcat的型別)


示例:登入介面
login.jsp -> check.jsp -> success.jsp

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <form action= "check.jsp" method="post">
   		使用者名稱:<input type="text" name="uname"><br/>
   		密碼:<input type="password" name="upwd"><br/>
   		<input type="submit" value = "登陸"><br/>
   
   </form>

</body>
</html>

check.jsp(重定向跳轉):

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("uname");
	String pwd = request.getParameter("upwd");
	if(name.equals("zs")&&pwd.equals("abc")){//假設zs 密碼abc
		response.sendRedirect("success.jsp");
	}
	else{//登陸失敗
		out.print("使用者名稱或者密碼有誤!");
		
	}

%>

</body>
</html>

success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	登入成功!<br/>
	歡迎您:
	<%
		String name = request.getParameter("uname");
		out.print(name);
	
	%>

</body>
</html>

執行如下:
在這裡插入圖片描述


在這裡插入圖片描述


這說明重定向確實是跳轉了,但是資料(名字)卻丟失了。

我現在將重定向改成請求轉發:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("uname");
	String pwd = request.getParameter("upwd");
	if(name.equals("zs")&&pwd.equals("abc")){//假設zs 密碼abc
		//response.sendRedirect("success.jsp"); 頁面跳轉 重定向 導致資料丟失
		//換成頁面跳轉:請求轉發 可以獲取到資料,並且位址列沒有改變(仍然保留轉發時的介面)
		request.getRequestDispatcher("success.jsp").forward(request,response);
	}
	else{//登陸失敗
		out.print("使用者名稱或者密碼有誤!");
		
	}

%>

</body>
</html>

在這裡插入圖片描述


可以看到現在頁面是成功了,但是位址列沒有改變。

請求轉發和重定向的區別:

請求轉發 重定向
位址列是否改變 不變(check.jsp) 改變(success.jsp)
是否保留第一次請求時的資料 保留 不保留
請求的次數 1 2
跳轉發生的位置 服務端 客戶端發出的第二次跳轉

轉發:
張三(客戶端)->[服務視窗A(服務端)->服務視窗B]

重定向:
張三(客戶端)->服務視窗A(伺服器)->去找B
張三(客戶端)->服務視窗B(伺服器)