1.response :響應(yīng)對象
提供的方法:
void addCookie( Cookie cookie ); 服務(wù)端向客戶端增加cookie對象
void sendRedirect(String location ) throws IOException; :頁面跳轉(zhuǎn)的一種方式(重定向)
void setContetType(String type):設(shè)置服務(wù)端響應(yīng)的編碼(設(shè)置服務(wù)端的contentType類型)
示例:登陸
login.jsp -> check.jsp ->success.jsp
| 請求轉(zhuǎn)發(fā) | 重定向 | |
---|
地址欄是否改變 | 不變(check.jsp) | 改變(success.jsp) | |
是否保留第一次請求時的數(shù)據(jù) | 保留 | 不保留 | –4種范圍對象 |
請求的次數(shù) | 1 | 2 | |
跳轉(zhuǎn)發(fā)生的位置 | 服務(wù)端 | 客戶端發(fā)出的第二次跳轉(zhuǎn) | |
?
轉(zhuǎn)發(fā)、重定向:
轉(zhuǎn)發(fā):
張三(客戶端) -> 【 服務(wù)窗口 A (服務(wù)端 ) -> 服務(wù)窗口B 】
重定向:
張三(客戶端) -> 服務(wù)窗口 A (服務(wù)端 ) ->去找B
張三(客戶端) -> 服務(wù)窗口 B (服務(wù)端 ) ->結(jié)束
2.session(服務(wù)端)
Cookie(客戶端,不是內(nèi)置對象):Cookie是由 服務(wù)端生成的 ,再發(fā)送給客戶端保存。相當于 本地緩存的作用: 客戶端(hello.mp4,zs/abc)->服務(wù)端(hello.mp4;zs/abc)
作用:提高訪問服務(wù)端的效率,但是安全性較差。
Cookie:name=value
javax.servlet.http.Cookie
public Cookie(String name,String value)
String getName():獲取name
String getValue():獲取value
void setMaxAge(int expiry);最大有效期 (秒)
服務(wù)端準備Cookie:
? response.addCookie(Cookie cookie)
頁面跳轉(zhuǎn)(轉(zhuǎn)發(fā),重定向)
客戶端獲取cookie: request.getCookies();
a.服務(wù)端增加cookie :response對象;客戶端獲取對象:request對象
b.不能直接獲取某一個單獨對象,只能一次性將 全部的cookie拿到
通過F12可以發(fā)現(xiàn) 除了自己設(shè)置的Cookie對象外,還有一個name為 JSESSIONID的cookie
建議 cookie只保存 英文數(shù)字,否則需要進行編碼、解碼
<%@ 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>
<%
//客戶端獲取cookie
Cookie[] cookies= request.getCookies();
for(Cookie cookie:cookies){
out.print(cookie.getName()+"----"+cookie.getValue()+"<br/>");
}
%>
</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>
<%
//服務(wù)端
Cookie cookie1 = new Cookie("name","zx");
Cookie cookie2 = new Cookie("pwd","abc");
response.addCookie(cookie1);
response.addCookie(cookie2 );
//頁面跳轉(zhuǎn)到客戶端(轉(zhuǎn)發(fā),重定向)
response.sendRedirect("result.jsp");
%>
</body>
</html>
3.使用Cookie實現(xiàn) 記住用戶名 功能
<%@ 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>
<%!//登陸
String uname;
%>
<%
boolean falg=false;
Cookie [] cookies= request.getCookies();
for(Cookie cookie: cookies ){
if(cookie.getName().equals("uname")){
uname=cookie.getValue();
falg=true;
}
}
if(!falg){
out.print("cookie失效");
}else{
out.print("cookie"+uname);
}
%>
<form action="check.jsp" method="post">
用戶名:<input type="text" name="uname" value="<%=(uname==null?"":uname) %>"><br/>
密碼:<input type="password" name="upwd"><br/>
提交:<input type="submit" value="登陸"><br/>
</form>
</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");
//將用戶名放到Cookie里面
Cookie cookie = new Cookie("uname", name); //建議 cookie只保存 英文數(shù)字,否則需要進行編碼、解碼
cookie.setMaxAge(10) ;
response.addCookie(cookie);
response.sendRedirect("A.jsp");
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www./TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
4.session :會話
a.瀏覽網(wǎng)站:開始-關(guān)閉
b.購物: 瀏覽、付款、退出<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
Insert title here <% request.setCharacterEncoding("utf-8"); String name = request.getParameter("uname"); String pwd = request.getParameter("upwd"); //將用戶名放到Cookie里面 Cookie cookie = new Cookie("uname", name); //建議 cookie只保存 英文數(shù)字,否則需要進行編碼、解碼 cookie.setMaxAge(10) ; response.addCookie(cookie); response.sendRedirect("A.jsp"); %> c.電子郵件:瀏覽、寫郵件、退出 開始-結(jié)束
5.session機制:
客戶端第一次請求服務(wù)端時,(jsessionid-sessionid)服務(wù)端會產(chǎn)生一個session對象(用于保存該客戶的信息);
并且每個session對象 都會有一個唯一的 sessionId( 用于區(qū)分其他session);
服務(wù)端由會 產(chǎn)生一個cookie,并且 該cookie的name=JSESSIONID ,value=服務(wù)端sessionId的值;
然后 服務(wù)端會在 響應(yīng)客戶端的同時 將該cookie發(fā)送給客戶端,至此 客戶端就有了 一個cookie(JSESSIONID);
因此,客戶端的cookie就可以和服務(wù)端的session一一對應(yīng)(JSESSIONID - sessionID)
客戶端第二/n次請求服務(wù)端時:服務(wù)端會先用客戶端cookie種的JSESSIONID 去服務(wù)端的session中匹配sessionid,如果匹配成功(cookie jsessionid和sesion sessionid),說明此用戶 不是第一次訪問,無需登錄;
例子:
客戶端: 顧客(客戶端)
服務(wù)端: 存包處 - 商場(服務(wù)端)
顧客第一次存包:商場 判斷此人是 之前已經(jīng)存過包(通過你手里是否有鑰匙)。
如果是新顧客(沒鑰匙) ,分配一個鑰匙 給該顧客; 鑰匙 會和 柜子 一一對應(yīng);
第二/n次 存包:商場 判斷此人是 之前已經(jīng)存過包(通過你手里是否有鑰匙)
如果是老顧客(有鑰匙),則不需要分配;該顧客手里的鑰匙 會 和柜子 自動一一對應(yīng)。
6.session:
a. session存儲在服務(wù)端(同一次會話共享,比如瀏覽同一個網(wǎng)頁)
b. session是在 同一個用戶(客戶)請求時 共享
c. 實現(xiàn)機制:第一次客戶請求時 產(chǎn)生一個sessionid 并復(fù)制給 cookie的jsessionid 然后發(fā)給客戶端。最終 通過session的sessionid-cookie的jsessionid
7.session方法:
String getId() :獲取sessionId
boolean isNew() :判斷是否是 新用戶(第一次訪問)
void invalidate():使session失效 (退出登錄、注銷)
void setAttribute()
Object getAttribute();
void setMaxInactiveInterval(秒) :設(shè)置最大有效 非活動時間
int getMaxInactiveInterval():獲取最大有效 非活動時間 比如你設(shè)置的是一小時,在這期間你一直在瀏覽該頁面,不會有影響,但是如果你去吃個飯回來,會讓你重新登陸。
示例:
登錄
客戶端在第一次請求服務(wù)端時,如果服務(wù)端發(fā)現(xiàn) 此請求沒有 JSESSIONID,則會創(chuàng)建一個 name=JSESIONID的cookie 并返回給客戶端
Cookie:
a.不是內(nèi)對對象,要使用必須new
b.但是,服務(wù)端會 自動生成一個(服務(wù)端自動new一個cookie) name=JSESIONID的cookie 并返回給客戶端
8.cookie和session的區(qū)別:
| session | cookie |
---|
保存的位置 | 服務(wù)端 | 客戶端 |
安全性 | 較安全 | 較不安全 |
保存的內(nèi)容 | Object | String |
9.appliation 全局對象
String getContextPath() 虛擬路徑
String getRealPath(String name): 絕對路徑(虛擬路徑 相對的絕對路徑)
10.JSP9大內(nèi)置對象
pageContext JSP頁面容器
request 請求對象
session 會話對象
appliation 全局對象
response 響應(yīng)對象
config 配置對象(服務(wù)器配置信息)
out 輸出對象
page 當前JSP頁面對象(相當于java中的this)
exception 異常對象
11.四種范圍對象(小1->大4)
| | |
---|
2request | 請求對象 | 同一次請求有效 |
3session | 會話對象 | 同一次會話有效 |
4appliation | 全局對象 | 全局有效(整個項目有效) |
1pageContext | JSP頁面容器 (page對象) | 當前頁面有效 |
以上4個對象共有的方法:
Object getAttribute(String name):根據(jù)屬性名,或者屬性值
void setAttribute(String name,Object obj) :設(shè)置屬性值(新增,修改)
setAttribute(“a”,“b”) ;//如果a對象之前不存在,則新建一個a對象 ;
如果a之前已經(jīng)存在,則將a的值改為b
void removeAttribute(String name):根據(jù)屬性名,刪除對象
a.pageContext
pageContext 當前頁面有效 (頁面跳轉(zhuǎn)后無效)
<%=pageContext.getAttribute("hello") %>
b.request
request 同一次請求有效;其他請求無效 (請求轉(zhuǎn)發(fā)后有效;重定向后無效)
response.sendRedirect("rq1.jsp");
request.getRequestDispatcher("rq1.jsp").forward(request, response);
c.session
session 同一次會話有效 (無論怎么跳轉(zhuǎn),都有效;關(guān)閉/切換瀏覽器后無效 ; 從 登陸->退出 之間 全部有效)
session.setAttribute("hello", "word");
response.sendRedirect("ss1.jsp");
d.application
application
全局變量;整個項目運行期間 都有效 (切換瀏覽器 仍然有效);關(guān)閉服務(wù)、其他項目 無效
->多個項目共享、重啟后仍然有效 :JNDI
1.以上的4個范圍對象,通過 setAttribute()復(fù)制,通過getAttribute()取值;
2.以上范圍對象,盡量使用最小的范圍。因為 對象的范圍越大,造成的性能損耗越大。
12.源碼如何關(guān)聯(lián)
1.進入官網(wǎng),下載對應(yīng)版本源碼
官網(wǎng)(https://www./)
Tomcat官網(wǎng)(https://tomcat./download-90.cgi)
下載源代碼
然后導(dǎo)入即可!