response、請求轉發和重定向
阿新 • • 發佈:2018-12-09
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(伺服器)