servlet中的数据存储
在servlet基礎(chǔ)中,我們:
用以下幾種方式實現(xiàn)數(shù)據(jù)存儲和共享:
1)在客戶端頁面和服務(wù)器端程序之間,用request中的getParameter()方法共享數(shù)據(jù)
?
2)在請求和請求之間,可以用get/setAttribute方法來共享數(shù)據(jù)(轉(zhuǎn)發(fā)的時候)
?
3)同一個servlet對象,可以用servletConfig(xml)來共享數(shù)據(jù)(主要是獲取配置信息)
getServletName();獲取servlet的名稱,也就是我們在web.xml中配置的servlet-name
getServletContext(); 獲取ServletContext對象
getInitParameter(String); 獲取在servlet中初始化參數(shù)的值。這里注意與全局初始化參數(shù)的區(qū)分。這個獲取的只是在該servlet下的初始化參數(shù)
getInitParameterNames(); //獲取在Servlet中所有初始化參數(shù)的名字,也就是key值
?
4)在整個web應(yīng)用范圍內(nèi),通過ServletContext的set/getAttribute方法共享數(shù)據(jù)
ServletContext: 代表的是整個應(yīng)用。一個應(yīng)用只有一個ServletContext對象。是單實例。
在一定范圍內(nèi)(當(dāng)前應(yīng)用),使多個Servlet共享數(shù)據(jù)。
?
現(xiàn)在我們說一個新的話題:會話管理
session/cookie
什么是會話?
? 會話可簡單理解為:用戶開一個瀏覽器,點擊多個超鏈接,訪問服務(wù)器多個web資源,然后關(guān)閉瀏覽器,整個過程稱之為一個會話。
?會話過程中要解決的一些問題?
–每個用戶不可避免各自會產(chǎn)生一些數(shù)據(jù),程序要想辦法為每個用戶保存這些數(shù)據(jù)。
–例如:用戶點擊超鏈接通過一個servlet購買了一個商品,程序應(yīng)該想辦法保存用戶購買的商品,以便于用戶點結(jié)帳servlet時,結(jié)帳servlet可以得到用戶購買的商品為用戶結(jié)帳。
?Cookie
–Cookie是客戶端技術(shù),程序把每個用戶的數(shù)據(jù)以cookie的形式寫給用戶各自的瀏覽器。當(dāng)用戶使用瀏覽器再去訪問服務(wù)器中的web資源時,就會帶著各自的數(shù)據(jù)去。這樣,web資源處理的就是用戶各自的數(shù)據(jù)了。
?HttpSession
–Session是服務(wù)器端技術(shù),利用這個技術(shù),服務(wù)器在運(yùn)行時可以為每一個用戶的瀏覽器創(chuàng)建一個其獨享的HttpSession對象,由于session為用戶瀏覽器獨享,所以用戶在訪問服務(wù)器的web資源時,可以把各自的數(shù)據(jù)放在各自的session中,當(dāng)用戶再去訪問服務(wù)器中的其它web資源時,其它web資源再從用戶各自的session中取出數(shù)據(jù)為用戶服務(wù)。
總結(jié):cookie存在客戶端,session存在服務(wù)器端
cookie:
API:
public Cookie(String name,String value)
setValue與getValue方法
setMaxAge與getMaxAge方法 (秒)
setPath與getPath方法
setDomain與getDomain方法
getName方法
使用cookie的大概步驟:
1)創(chuàng)建并向客戶端發(fā)送Cookie
?創(chuàng)建Cookie對象
–調(diào)用Cookie的構(gòu)造方法,給出Cookie的名稱和Cookie的值,二者都是字符串
?Cookie c = new Cookie(“userName”,”a1234”)
?設(shè)置最大時效
–如果要告訴瀏覽器將Cookie存儲到磁盤上,而非僅保存在內(nèi)存中,使用setMaxAge方法(參數(shù)為秒數(shù))
–c.setMaxAge(60*60*24*7)//一周(正數(shù))
?將Cookie放入到HTTP響應(yīng)中
–使用response.addCookie(c)
–如沒有這一步,將不會有任何Cookie被發(fā)送到瀏覽器
2)從客戶端讀取Cookie
Cookie[] cookies = request.getCookies(); if(cookies != null){for(Cookie cookie : cookies){if("userId".equals(cookie.getName())){//doSomethingWith(cookie.getValue()); }} }?
session:
同一顏色為一次邏輯,順序為1,2,3,4
session 主要API:
?getAttribute()
–從會話對象中提取出一個之前存儲的屬性值
?如果沒有找到與名稱相關(guān)聯(lián)的值,則返回null
?setAttribute()
–設(shè)置會話對象的屬性名稱和屬性值
?removeAttribute()
–移除與名稱關(guān)聯(lián)的值
?getAttributeNames()
–返回會話中所有屬性的名稱
?getId()
–返回唯一的標(biāo)識符
使用session的大概步驟:
//獲取HttpSession對象,設(shè)置相關(guān)屬性
HttpSession session = req.getSession();
session.setAttribute("userName", userName);
//獲取HttpSession對象,取出相關(guān)屬性
HttpSession session = req.getSession();
session.getAttribute("userName", userName);
分享一張尚學(xué)堂的我覺得很好的圖
總結(jié)
以上是生活随笔為你收集整理的servlet中的数据存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode348. 判定井字棋胜负
- 下一篇: 双向循环链表【数据结构】