1.加載web應(yīng)用資源文件
this.getServletContext().getRequestDispatcher(path);
req.getRequestDispatcher(path);
這兩句在Servlet中是等價(jià)的。
在servlet中,只要是路徑就要寫/
却汉。
思考:目標(biāo)資源是給誰(shuí)使用的。
1)給服務(wù)器使用的荷并。
/
表示在當(dāng)前web應(yīng)用的根目錄合砂。
2)給瀏覽器使用的。
/
表示在webapps的目錄下。
/**
* 1.轉(zhuǎn)發(fā)翩伪。給服務(wù)器使用
*/
this.getServletContext().getRequestDispatcher(path);
req.getRequestDispatcher(path);
/**
* 2.請(qǐng)求的重定向微猖。給瀏覽器使用
*/
resp.sendRedirect(path);
/**
* 3.html的超鏈接。給瀏覽器使用缘屹。
*/
resp.getWriter().write(
"<html>"
+"<body>"
+"<a href='path'>超鏈接</a>"
+"</body>"
+"</html>"
);
/**
* 4.html頁(yè)面中的form表單提交地址凛剥。給瀏覽器使用。
*/
resp.getWriter().write(
"<html>"
+"<body>"
+"<form action=''path></form>"
+"</body>"
+"</html>"
);
注意:
.
代表當(dāng)前路徑轻姿。相對(duì)于java命令運(yùn)行的目錄犁珠。
..
代表上一級(jí)路徑。
使用web應(yīng)用下加載資源文件的方法
1)getRealPath讀取
this.getServletontext().getRealPath("/");
2.cookie入門
會(huì)話管理入門:
軟件中的一次會(huì)話:打開(kāi)瀏覽器->訪問(wèn)一些服務(wù)器內(nèi)容->關(guān)閉瀏覽器
登錄場(chǎng)景:
打開(kāi)瀏覽器->瀏覽到登錄頁(yè)面->輸入用戶名和密碼->訪問(wèn)到用戶主頁(yè)->修改密碼互亮,修改收貨地址...
在此處登錄會(huì)話過(guò)程中產(chǎn)生的數(shù)據(jù)(用戶會(huì)話數(shù)據(jù))如何保存下來(lái)呢犁享?
購(gòu)物場(chǎng)景:
打開(kāi)瀏覽器->瀏覽商品列表->加入購(gòu)物車(把商品的信息保存下來(lái))->關(guān)閉瀏覽器
打開(kāi)瀏覽器->直接進(jìn)入購(gòu)物車->查看到上次加入購(gòu)物車的商品->下訂單
問(wèn)題:在購(gòu)物會(huì)話過(guò)程中,如何保存商品信息豹休?炊昆?
會(huì)話管理:管理瀏覽器客戶端 和 服務(wù)器端之間會(huì)話過(guò)程中產(chǎn)生的數(shù)據(jù)。
域?qū)ο螅簩?shí)現(xiàn)資源之間的數(shù)據(jù)共享威根。
request,context
context是所有用戶公有的資源凤巨,會(huì)覆蓋數(shù)據(jù)。
request來(lái)保存數(shù)據(jù)的話洛搀,要使用轉(zhuǎn)發(fā)技術(shù)來(lái)跳轉(zhuǎn)頁(yè)面敢茁,那么久只有整個(gè)網(wǎng)站都使用轉(zhuǎn)發(fā)技術(shù)了,這個(gè)不可以留美。
解決方法彰檬,可以使用session的域?qū)ο髞?lái)保存會(huì)話數(shù)據(jù)。
3.會(huì)話技術(shù)
1)Cookie技術(shù): 會(huì)話數(shù)據(jù)保存在瀏覽器客戶端独榴。
2)Session技術(shù): 會(huì)話數(shù)據(jù)保存在服務(wù)器端僧叉。
Cookie技術(shù)
特點(diǎn):會(huì)話數(shù)據(jù)保存在瀏覽器客戶端。
技術(shù)核心:Cookie類棺榔,用于存儲(chǔ)會(huì)話數(shù)據(jù)瓶堕。
a) 構(gòu)造Cookie對(duì)象
Cookie(name, value)
b)
setPath(uri) 設(shè)置cookie的有效訪問(wèn)路徑
setMaxAge(expiry) 設(shè)置cookie 的有效時(shí)間
setValue(newValue) 設(shè)置cookie的值
c) 發(fā)送cookie到瀏覽器端(cookie是保存在瀏覽器的)
response.addCookie(Cookie cookie): 發(fā)送cookie
d) 服務(wù)器接受cookie
request.getCookie(): 接受cookie
在Servlet中:
// 1.創(chuàng)建cookie對(duì)象
Cookie cookie = new Cookie("name","eric");
Cookie cookie1 = new Cookie("email", "liao.malin@youpude.cn");
// 2.把cookie數(shù)據(jù)發(fā)送到瀏覽器(通過(guò)響應(yīng)頭發(fā)送: set-cookie名稱)
resp.addCookie(cookie);
resp.addCookie(cookie1);
// 3.接受瀏覽器發(fā)送的cookie信息
Cookie[] cookies = req.getCookies();
瀏覽器發(fā)送到服務(wù)器的數(shù)據(jù)叫請(qǐng)求。
請(qǐng)求頭:Set-Cookie
響應(yīng)頭:Cookie
Cookie原理
1)服務(wù)器創(chuàng)建cookie對(duì)象症歇,吧會(huì)話數(shù)據(jù)存儲(chǔ)到cookie對(duì)象中郎笆。
new Cookie("name", "value");
2)服務(wù)器發(fā)送cookie信息到瀏覽器
response.addCookie(cookie);
舉例:set-cookie=name=eric(隱藏發(fā)送了一個(gè)set-cookie名稱的響應(yīng)頭)
3)瀏覽器得到服務(wù)器發(fā)送的cookie,然后保存在瀏覽器端。
4)瀏覽器在下次訪問(wèn)服務(wù)器時(shí)忘晤,會(huì)帶著cookie的信息宛蚓。
舉例:cookie:name=eric(隱藏帶著一個(gè)叫cookie名稱的請(qǐng)求頭)
5)服務(wù)器接受到瀏覽器帶來(lái)的cookie信息。
request.getCookies();
Cookie的細(xì)節(jié)
1)setPath(url)
設(shè)置cookie的有效訪問(wèn)路徑设塔。有效路徑值得是cookie的于曉路徑保存在哪兒凄吏,那么瀏覽器在有效路徑下訪問(wèn)服務(wù)器時(shí),就會(huì)帶著cookie信息,否者則不帶cookie信息痕钢。
默認(rèn)情況图柏,也就是不設(shè)置,那么任连,有效路徑在當(dāng)前web應(yīng)用目錄下蚤吹。
-
setMaxAge(int expiry)
設(shè)置cookie 的有效時(shí)間
正整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的緩存目錄(硬盤中),數(shù)值表示保存的時(shí)間随抠。
負(fù)整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的內(nèi)存中裁着。瀏覽器關(guān)閉cookie就丟失了。
零:表示刪除同名的cookie數(shù)據(jù)拱她。cookie1.setMaxAge(20); // 20秒后過(guò)期
時(shí)間從不去調(diào)用這個(gè)cookie開(kāi)始算二驰。cookie1.setMaxAge(-1); // cookie保存在瀏覽器內(nèi)存中。只有關(guān)閉瀏覽器椭懊,才會(huì)沒(méi)有诸蚕。也叫作會(huì)話cookie步势。-1和-1000都一樣氧猬。
cookie1.setMaxAge(0); // 刪除同名的cookie
Cookie數(shù)據(jù)類型
都是字符串。局限性就是只能保存字符串類型坏瘩。
可以保存多個(gè)cookie盅抚,不是無(wú)限制的。瀏覽器只能存放300個(gè)cookie倔矾,每個(gè)站點(diǎn)最多存放20個(gè)cookie妄均,每個(gè)Cookie的大小限制為4kb.
cookie不能保存中文,只能保存英文的哪自。
cookie是在客戶端保存的丰包。
客戶端和服務(wù)端通過(guò):resp.addCookie(cookie)
和req.getCookies();
交互數(shù)據(jù),完成對(duì)話壤巷。
cookie.setValue(lastTime); // cookie更新value
4.Session技術(shù)
session引入的原因
Cookie的局限:
- Cookie只能存字符串類型邑彪,不能保存對(duì)象
2)只能存英文
3)1個(gè)cookie的容量不能超過(guò)4KB
如果要保存非字符串,超過(guò)4KB內(nèi)容胧华,只能使用session技術(shù)寄症。
Session特點(diǎn):
會(huì)話數(shù)據(jù)存在服務(wù)器端.(內(nèi)存中)
Session技術(shù)核心
我們學(xué)HttpSession這個(gè)類就足夠了。
用于保存會(huì)話數(shù)據(jù)矩动。
HttpSession是一個(gè)接口有巧。
創(chuàng)建或者得到session對(duì)象:
getSession()
getSession(boolean create)
設(shè)置session對(duì)象:
setmaxInactieInterval(Int interval) 設(shè)置session的有效時(shí)間
invalidate() 銷毀session對(duì)象
getId() 得到session編號(hào)
保存會(huì)話數(shù)據(jù)到session對(duì)象
setAttribute(name, value) 保存數(shù)據(jù)。 HttpSession也是一個(gè)域?qū)ο蟆?
getAttribute() 獲取數(shù)據(jù)
removeAttribute() 清除數(shù)據(jù)
Session原理
問(wèn)題:服務(wù)器能夠識(shí)別不同的瀏覽者悲没。
前提:在哪個(gè)session域?qū)ο蟊4鏀?shù)據(jù)篮迎,就必須從哪個(gè)域?qū)ο笕〕觥?/p>
代碼解讀:
HttpSession session = request.getSession();
1)創(chuàng)建session對(duì)象,給session對(duì)象分配一個(gè)唯一的ID,叫作JSESSIONID
new HttpSession();
2)把JSESSIONID作為Cookie的值發(fā)送給瀏覽器保存
Cookie cookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)第二次訪問(wèn)的時(shí)候,瀏覽器帶著JSESSIONID的cookie訪問(wèn)服務(wù)器
4)服務(wù)器得到JSESSIONID甜橱,在服務(wù)器的內(nèi)存中搜索是否存放對(duì)應(yīng)編號(hào)的session對(duì)象享言。
if(找到){
return map.get(sessionID);
}
Map<String, HttpSession>
<"s001", s1>
<"s002", s2>
5)如果找到對(duì)應(yīng)編號(hào)的session對(duì)象,直接返回該對(duì)象渗鬼。
6)如果找不到對(duì)應(yīng)編號(hào)的session對(duì)象览露,就會(huì)創(chuàng)建新的session對(duì)象。繼續(xù)走1)的流程譬胎。
結(jié)論:通過(guò)JSESSION的cookie值在服務(wù)器找session對(duì)象差牛。
Session的技術(shù)也需要通過(guò)Cookie來(lái)輔助。
cookie三句代碼堰乔,session只有一句核心代碼response.getSession()
偏化。
req.getSession(true);
等價(jià)于 req.getSession();
Session細(xì)節(jié)
getId() // 得到編號(hào)
setMaxinactiveInterval(int Interval):設(shè)置session的有效時(shí)間。
默認(rèn)是30Min镐侯。如果是負(fù)數(shù)侦讨,那么就是銷毀。
web.xml
中:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
配置session的過(guò)期時(shí)間:以min為單位的苟翻。
總結(jié):
1)會(huì)話管理:瀏覽器和服務(wù)器會(huì)話過(guò)程中的產(chǎn)生的會(huì)話數(shù)據(jù)的管理韵卤。
2)Cookie技術(shù):
new Cookie("name", "value")
response.addCookie(cookie)
request.getCookies();
-
Session技術(shù):
request.getSession();
setAttribute(name, value)
geAttribute(name)