會話及會話技術(shù) 課件_第1頁
會話及會話技術(shù) 課件_第2頁
會話及會話技術(shù) 課件_第3頁
會話及會話技術(shù) 課件_第4頁
會話及會話技術(shù) 課件_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第5章會話及會話技術(shù)《Java

Web程序設(shè)計任務(wù)教程(第2版)》學(xué)習(xí)目標(biāo)/Target了解什么是Cookie掌握Cookie對象的使用

了解什么是Session

掌握Session對象的使用章節(jié)概述/Summary

當(dāng)用戶通過瀏覽器訪問Web應(yīng)用時,通常情況下,服務(wù)器需要對用戶的狀態(tài)進(jìn)行跟蹤。例如,用戶在網(wǎng)站結(jié)算商品時,Web服務(wù)器必須根據(jù)請求用戶的身份,找到該用戶所購買的商品。在Web開發(fā)中,服務(wù)器跟蹤用戶信息的技術(shù)稱為會話技術(shù),本章將針對會話及會話技術(shù)進(jìn)行詳細(xì)講解。目錄/Contents010203會話概述Cookie對象Session對象會話概述5.15.1會話概述先定一個小目標(biāo)!

先定一個小目標(biāo)!了解會話的概念,能夠知道會話用于做什么5.1會話概述在日常生活中,從撥通電話到掛斷電話之間的一連串的你問我答的過程就是一個會話。在打電話過程中,通話雙方會有通話內(nèi)容,同樣,在客戶端與服務(wù)器交互的過程中,也會產(chǎn)生一些數(shù)據(jù)。例如,用戶甲和乙分別登錄了購物網(wǎng)站,甲購買了一個iPhone手機(jī),乙購買了一個iPad,當(dāng)這兩個用戶結(jié)賬時,Web服務(wù)器需要對用戶甲和乙的信息分別進(jìn)行保存。為了保存會話過程中產(chǎn)生的數(shù)據(jù),Servlet提供了兩個用于保存會話數(shù)據(jù)的對象,分別是Cookie和Session。會話的概念Cookie對象5.25.2.1什么是Cookie先定一個小目標(biāo)!

先定一個小目標(biāo)!了解什么是Cookie在現(xiàn)實生活中,當(dāng)顧客在購物時,商城經(jīng)常會贈送顧客一張會員卡,卡上記錄用戶的個人信息(姓名,手機(jī)號等)、消費(fèi)額度和積分額度等。顧客一旦接受了會員卡,以后每次光臨該商場時,都可以使用這張會員卡,商場也將根據(jù)會員卡上的消費(fèi)記錄計算會員的優(yōu)惠額度和累加積分。在Web應(yīng)用中,Cookie的功能類似于會員卡,當(dāng)用戶通過瀏覽器訪問Web服務(wù)器時,服務(wù)器會給客戶端發(fā)送一些信息,如用戶信息和商品信息,這些信息都保存在Cookie中。這樣,當(dāng)該瀏覽器再次訪問服務(wù)器時,會在請求頭中將Cookie發(fā)送給服務(wù)器,方便服務(wù)器對瀏覽器做出正確地響應(yīng)。Cookie的概念5.2.1什么是Cookie服務(wù)器向客戶端發(fā)送Cookie時,會在HTTP響應(yīng)頭字段中增加Set-Cookie響應(yīng)頭字段。Set-Cookie頭字段中設(shè)置的Cookie的具體示例如下:Cookie的概念5.2.1什么是CookieSet-Cookie:user=itcast;Path=/;user表示Cookie的名稱,itcast表示Cookie的值,Path表示Cookie的屬性。Cookie必須以鍵值對的形式存在,Cookie屬性可以有多個,屬性之間用分號“;”和空格分隔。當(dāng)用戶第一次訪問服務(wù)器時,服務(wù)器會在響應(yīng)消息中增加Set-Cookie頭字段,將用戶信息以Cookie的形式發(fā)送給瀏覽器。一旦用戶瀏覽器接受了服務(wù)器發(fā)送的Cookie信息,就會將它保存在瀏覽器的緩沖區(qū)中,這樣,當(dāng)瀏覽器后續(xù)訪問該服務(wù)器時,都會在請求消息中將用戶信息以Cookie的形式發(fā)送給服務(wù)器,從而使服務(wù)器分辨出當(dāng)前請求是由哪個用戶發(fā)出的。Cookie的概念5.2.1什么是Cookie5.2.2Cookie

API先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握Cookie類的構(gòu)造方法和常用方法Cookie類有且僅有一個構(gòu)造方法,具體語法格式如下:構(gòu)造方法publicCookie(java.lang.Stringname,java.lang.Stringvalue);在Cookie的構(gòu)造方法中,參數(shù)name用于指定Cookie的名稱,value用于指定Cookie的值。需要注意的是,Cookie一旦創(chuàng)建,它的名稱就不能再更改,Cookie的值可以為任何值,創(chuàng)建后允許被修改。5.2.2Cookie

APICookie類的常用方法5.2.2Cookie

API方法聲明功能描述StringgetName()用于返回Cookie的名稱voidsetValue(String

newValue)用于為Cookie設(shè)置一個新的值StringgetValue()用于返回Cookie的值voidsetMaxAge(int

expiry)用于設(shè)置Cookie在瀏覽器客戶機(jī)上保持有效的秒數(shù)intgetMaxAge()用于返回Cookie在瀏覽器客戶機(jī)上保持有效的秒數(shù)voidsetPath(String

uri)用于設(shè)置該Cookie項的有效目錄路徑StringgetPath()用于返回該Cookie項的有效目錄路徑voidsetDomain(String

pattern)用于設(shè)置該Cookie項的有效域StringgetDomain()用于返回該Cookie項的有效域voidsetVersion(int

v)用于設(shè)置該Cookie項采用的協(xié)議版本intgetVersion()用于返回該Cookie項采用的協(xié)議版本voidsetComment(String

purpose)用于設(shè)置該Cookie項的注解部分StringgetComment()用于返回該Cookie項的注解部分voidsetSecure(boolean

flag)用于設(shè)置該Cookie項是否只能使用安全的協(xié)議傳送booleangetSecure()用于返回該Cookie項是否只能使用安全的協(xié)議傳送setMaxAge(int

expiry)方法和getMaxAge()方法5.2.2Cookie

APIsetMaxAge(int

expiry)和getMaxAge()方法分別用于設(shè)置和返回Cookie在瀏覽器上保持有效的秒數(shù)。如果設(shè)置的值為一個正整數(shù),瀏覽器會將Cookie信息保存在本地硬盤中。從當(dāng)前時間開始,在沒有超過指定的秒數(shù)之前,這個Cookie都保持有效,并且同一臺計算機(jī)上運(yùn)行的該瀏覽器都可以使用這個Cookie信息。如果設(shè)置值為負(fù)整數(shù),瀏覽器會將Cookie信息保存在瀏覽器的緩存中,當(dāng)瀏覽器關(guān)閉時,Cookie信息會被刪除。如果設(shè)置值為0,則瀏覽器會立即刪除這個Cookie信息。setPath(String

uri)方法和getPath()方法5.2.2Cookie

APIsetPath(String

uri)方法和getPath()方法是針對Cookie的Path屬性的。如果創(chuàng)建的某個Cookie對象沒有設(shè)置Path屬性,那么該Cookie只對當(dāng)前訪問路徑所屬的目錄及其子目錄有效。如果想讓某個Cookie項對站點(diǎn)的所有目錄下的訪問路徑都有效,應(yīng)調(diào)用Cookie對象的setPath()方法將其Path屬性設(shè)置為“/”。setDomain(String

pattern)方法和getDomain()方法5.2.2Cookie

APIsetDomain(String

pattern)方法和getDomain()方法是針對Cookie的domain屬性的。domain屬性用于指定瀏覽器訪問的域。例如,傳智播客的域為“”。設(shè)置domain屬性時,其值必須以“.”開頭,如domain=.。默認(rèn)情況下,domain屬性的值為當(dāng)前主機(jī)名,瀏覽器在訪問當(dāng)前主機(jī)下的資源時,都會將Cookie信息發(fā)送給服務(wù)器(當(dāng)前主機(jī))。需要注意的是,domain屬性的值不區(qū)分大小寫。任務(wù):顯示用戶上次訪問時間先定一個小目標(biāo)!

先定一個小目標(biāo)!使用Cookie技術(shù),實現(xiàn)顯示用戶上次的訪問時間的功能任務(wù):顯示用戶上次訪問時間當(dāng)用戶訪問某些Web應(yīng)用時,經(jīng)常會顯示出該用戶上一次的訪問時間。例如,QQ登錄成功后,會顯示用戶上次的登錄時間。本案例要求使用Cookie技術(shù)實現(xiàn)顯示用戶上次的訪問時間。顯示用戶上次訪問時間效果如下圖所示。任務(wù):顯示用戶上次訪問時間在IDEA中新建Web項目chapter05并添加Servlet-api.jar包,在chapter05項目的src包中編寫一個名稱為LastAccessServlet的Servlet類,該類主要用于獲取Cookie信息中的時間并發(fā)送給客戶端。主要代碼如下:publicclassLastAccessServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//指定服務(wù)器輸出內(nèi)容的編碼方式UTF-8,防止發(fā)生亂碼response.setContentType("text/html;charset=utf-8");//獲取所有cookieCookie[]cookies=request.getCookies();//定義flag的boolean變量,用于判斷cookies是否為空booleanflag=false; //遍歷cookie數(shù)組if(cookies.length>0&&cookies!=null){for(Cookiecookie:cookies){//獲取cookie的名稱Stringname=cookie.getName();STEP01任務(wù):顯示用戶上次訪問時間//判斷名稱是否是lastTimeif("lastTime".equals(name)){//有該cookie不是第一次訪問flag=true; //響應(yīng)數(shù)據(jù)//獲取cookie的value時間Stringvalue=cookie.getValue();System.out.println("解碼前:"+value);//URL解碼value=URLDecoder.decode(value,"utf-8");System.out.println("解碼后:"+value);response.getWriter().write("歡迎回來,您上次訪問時間為:"+value);//設(shè)置cookie的value//獲取當(dāng)前時間的字符串,重新設(shè)置cookie的值,重新發(fā)送cookieDatedate=newDate();SimpleDateFormattimesdf=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss");Stringstr_time=timesdf.format(date);System.out.println("編碼前:"+str_time);//URL編碼str_time=URLEncoder.encode(str_time,"utf-8");任務(wù):顯示用戶上次訪問時間 System.out.println("編碼后:"+str_time);cookie.setValue(str_time);//設(shè)置cookie存活時間cookie.setMaxAge(60*60*24*30); //一個月//加入當(dāng)前cookie請求時間response.addCookie(cookie);break;}}//如果cookies中沒有時間,也就是沒有訪問過if(cookies==null||cookies.length==0||flag==false){//設(shè)置cookie的value//獲取當(dāng)前時間的字符串,重新設(shè)置cookie的值,重新發(fā)送cookieDatedate=newDate();SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss");Stringstr_date=sdf.format(date);System.out.println("編碼前:"+str_date);//URL編碼str_date=URLEncoder.encode(str_date,"utf-8");System.out.println("編碼后:"+str_date);Cookiecookie=newCookie("lastTime",str_date);任務(wù):顯示用戶上次訪問時間//設(shè)置cookie存活時間cookie.setMaxAge(60*60*24*30);//一個月response.addCookie(cookie);response.getWriter().write("您好,歡迎您首次訪問");}}}任務(wù):顯示用戶上次訪問時間啟動IDEA中的Tomcat服務(wù)器,在瀏覽器的地址欄中輸入“http://localhost:8080/chapter05/LastAccessServlet”訪問LastAccessServlet,由于是第一次訪問LastAccessServlet,會在瀏覽器中看到“您好,歡迎您首次訪問”的信息:STEP02任務(wù):顯示用戶上次訪問時間刷新訪問地址“http://localhost:8080/chapter05/LastAccessServlet,瀏覽器顯示了用戶的上次訪問時間,這是因為用戶第一次訪問LastAccessServlet時,LastAccessServlet向瀏覽器發(fā)送并保存用戶訪問時間的Cookie信息。第二次訪問LastAccessServlet時,服務(wù)器讀取該Cookie信息,并在瀏覽器顯示:STEP03任務(wù):顯示用戶上次訪問時間關(guān)閉瀏覽器后,再次打開瀏覽器,訪問LastAccessServlet,瀏覽器依舊顯示了時間,是因為我們在LastAccessServlet類的代碼中設(shè)置了Cookie的有效時間為1個月。瀏覽器顯示:STEP04Session對象5.35.3.1什么是Session先定一個小目標(biāo)!

先定一個小目標(biāo)!了解什么是SessionSession對象5.3.1什么是Session當(dāng)人們?nèi)メt(yī)院就診時,就診病人需要辦理醫(yī)院的就診卡,就診卡上只有卡號,沒有其他信息。但病人每次去該醫(yī)院就診時,只要出示就診卡,醫(yī)務(wù)人員便可根據(jù)卡號查詢到病人的就診信息。Session技術(shù)類似醫(yī)院辦理就診卡和醫(yī)院為每個病人保留病歷檔案的過程。當(dāng)瀏覽器訪問Web服務(wù)器時,Servlet容器就會創(chuàng)建一個Session對象和ID屬性,Session對象就相當(dāng)于病歷檔案,ID就相當(dāng)于就診卡號。當(dāng)客戶端后續(xù)訪問服務(wù)器時,只要將ID傳遞給服務(wù)器,服務(wù)器就能判斷出該請求是哪個客戶端發(fā)送的,從而選擇與之對應(yīng)的Session對象為其服務(wù)。Session對象5.3.1什么是Session為了使讀者更好的理解Session,下面以網(wǎng)站購物為例,通過一張圖描述Session保存用戶信息的原理。網(wǎng)站購物圖解析5.3.1什么是Session用戶甲和用戶乙都調(diào)用buyServlet將商品添加到購物車,調(diào)用payServlet進(jìn)行商品結(jié)算。由于甲和乙購買商品的過程類似,在此,以用戶甲為例進(jìn)行詳細(xì)說明。當(dāng)用戶甲訪問購物網(wǎng)站時,服務(wù)器為甲創(chuàng)建了一個Session對象(相當(dāng)于購物車)。當(dāng)甲將iPhone手機(jī)添加到購物車時,iPhone手機(jī)的信息便存放到了Session對象中。同時,服務(wù)器將Session對象的ID屬性以Cookie(Set-Cookie:JSESSIONID=111)的形式返回給甲的瀏覽器。當(dāng)甲完成購物進(jìn)行結(jié)賬時,需要向服務(wù)器發(fā)送結(jié)賬請求,這時,瀏覽器自動在請求消息頭中將Cookie(Cookie:JSESSIONID=111)信息發(fā)送給服務(wù)器,服務(wù)器根據(jù)ID屬性找到為用戶甲所創(chuàng)建的Session對象,并將Session對象中所存放的iPhone手機(jī)信息取出進(jìn)行結(jié)算。Session對象5.3.1什么是SessionSession還具有更高的安全性,它將關(guān)鍵數(shù)據(jù)保存在服務(wù)器。cookie則是將數(shù)據(jù)存在客戶端的瀏覽器中。因此cookie是較為危險的,若客戶端遭遇黑客攻擊,cookie信息容易被竊取,數(shù)據(jù)也可能被篡改,而運(yùn)用Session可以有效避免這種情況的發(fā)生。5.3.2HttpSessionAPI先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握HttpSession接口中的常用方法5.3.2HttpSessionAPISession是與每個請求消息緊密相關(guān)的,為此,HttpServletRequest定義了用于獲取Session對象的getSession()方法,該方法有兩種重載形式,具體如下:Session對象的getSession()方法publicHttpSessiongetSession(boolean

create)//第一個publicHttpSessiongetSession()//第二個5.3.2HttpSessionAPISession對象的getSession()方法第一個getSession()方法根據(jù)傳遞的參數(shù)判斷是否創(chuàng)建新的HttpSession對象,如果參數(shù)為true,則在相關(guān)的HttpSession對象不存在時創(chuàng)建并返回新的HttpSession對象,否則不創(chuàng)建新的HttpSession對象,而是返回null。5.3.2HttpSessionAPISession對象的getSession()方法第二個getSession()方法相當(dāng)于第一個方法參數(shù)為true時的情況,在相關(guān)的HttpSession對象不存在時總是創(chuàng)建新的HttpSession對象。需要注意的是,由于getSession()方法可能會產(chǎn)生發(fā)送會話標(biāo)識號的Cookie頭字段,所以必須在發(fā)送任何響應(yīng)內(nèi)容之前調(diào)用getSession()方法。5.3.2HttpSessionAPIHttpSession接口中的常用方法方法聲明功能描述StringgetId()用于返回與當(dāng)前HttpSession對象關(guān)聯(lián)的會話標(biāo)識號longgetCreationTime()用于返回Session創(chuàng)建的時間,這個時間是創(chuàng)建Session的時間與1970年1月1日00:00:00之間時間差的毫秒表示形式longgetLastAccessedTime()用于返回客戶端最后一次發(fā)送與Session相關(guān)請求的時間,這個時間是發(fā)送請求的時間與1970年1月1日00:00:00之間時間差的毫秒表示形式voidsetMaxInactiveInterval(intinterval)用于設(shè)置當(dāng)前HttpSession對象可空閑的以秒為單位的最長時間,也就是修改當(dāng)前會話的默認(rèn)超時間隔booleanisNew()判斷當(dāng)前HttpSession對象是否是新創(chuàng)建的voidinvalidate()用于強(qiáng)制使Session對象無效ServletContextgetServletContext()用于返回當(dāng)前HttpSession對象所屬于的Web應(yīng)用程序?qū)ο螅创懋?dāng)前Web應(yīng)用程序的ServletContext對象voidsetAttribite(Stringname,Objectvalue)用于將一個對象與一個名稱關(guān)聯(lián)后存儲到當(dāng)前的HttpSession對象中StringgetAttribute()用于從當(dāng)前HttpSession對象中返回指定名稱的屬性對象voidremoveAttribute(Stringname)用于從當(dāng)前HttpSession對象中刪除指定名稱的屬性5.3.3Session的生命周期先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握Session對象的生效與失效Session生效Sessinon在用戶第一次訪問服務(wù)器時創(chuàng)建,需要注意只有訪問JSP(JSP將在第6章講解)、Servlet等程序時才會創(chuàng)建Session。此外,還可調(diào)用request.getSession(true)強(qiáng)制生成Session。只訪問HTML、IMAGE等靜態(tài)資源并不會創(chuàng)建Session。5.3.3Session的生命周期Session失效—“超時限制”判斷Session是否生效Web服務(wù)器采用“超時限制”判斷客戶端是否還在繼續(xù)訪問。在一定時間內(nèi),如果某個客戶端一直沒有請求訪問,那么,Web服務(wù)器就會認(rèn)為該客戶端已經(jīng)結(jié)束請求,并且將與該客戶端會話所對應(yīng)的HttpSession對象變成垃圾對象,等待垃圾收集器將其從內(nèi)存中徹底清除。反之,如果瀏覽器超時后,再次向服務(wù)器發(fā)出請求訪問,那么,Web服務(wù)器會創(chuàng)建一個新的HttpSession對象,并為其分配一個新的ID屬性。5.3.3Session的生命周期Session失效—強(qiáng)制Session失效invalidate()方法,該方法可以強(qiáng)制使Session對象失效,具體用法如下所示:5.3.3Session的生命周期HttpSessionsession=request.getSession();session.invalidate();//注銷該request的所有sessionSession失效—強(qiáng)制Session失效有時默認(rèn)的Session失效時間并不能滿足我們的需求。這時我們需要自定義Session的失效時間,自定義Session的失效時間有3種:5.3.3Session的生命周期<session-config><session-timeout>30</session-timeout></session-config>第1種在項目的web.xml文件中配置Session的失效時間,具體代碼如下所示:需要注意的是,在web.xml配置的Session失效時間默認(rèn)是分鐘,所以上述代碼設(shè)置Session失效時間為30分鐘。5.3.3Session的生命周期session.setMaxInactiveInterval(30*60);//設(shè)置單位為秒,設(shè)置為-1永不過期第2種在Servlet程序中手動設(shè)置Session的失效時間,具體代碼如下所示:<session-config><session-timeout>30</session-timeout></session-config>第3種上述代碼設(shè)置了Session的失效時間為30分鐘,如果將值設(shè)置為-1,則該Session永不過期。在<Tomcat安裝目錄>\conf\web.xml文件中,可以找到如下一段配置信息:在上述代碼的配置信息中,設(shè)置的時間值是以分鐘為單位的,即Tomcat服務(wù)器的默認(rèn)會話超時間隔為30分鐘。如果將<session-timeout>元素中的時間值設(shè)置成0或負(fù)數(shù),則表示會話永不超時。需要注意的是<Tomcat安裝目錄>\conf\web.xml文件對站點(diǎn)內(nèi)的所有Web應(yīng)用程序都起作用。5.3.3Session的生命周期Session失效—強(qiáng)制Session失效任務(wù):實現(xiàn)購物車先定一個小目標(biāo)!

先定一個小目標(biāo)!使用Session相關(guān)知識,實現(xiàn)模擬購物車的功能任務(wù):實現(xiàn)購物車通過所學(xué)Session知識及購物車的訪問流程,以購買蛋糕為例,模擬實現(xiàn)購物車功能。購物車的訪問流程具體如下圖所示。圖中描述的是購物車的實現(xiàn)流程,當(dāng)用戶使用瀏覽器訪問某個網(wǎng)站的蛋糕列表頁面時,如果購買某個蛋糕,那么首先會判斷蛋糕是否存在,如果存在就加入購物車,跳轉(zhuǎn)到購物車中所購買蛋糕的列表頁面。否則,返回蛋糕列表頁面。任務(wù):實現(xiàn)購物車創(chuàng)建封裝蛋糕信息的類,在chapter05項目下新建一個名稱為cn.itcast.session.entity的包,在該包中創(chuàng)建一個名稱為Cake的類。主要代碼如下:publicclassCake{ privatestaticfinallongserialVersionUID=1L; privateStringid; privateStringname; publicCake(){ } publicCake(Stringid,Stringname){ this.id=id; =name; } ......省略getter/setter方法}STEP01任務(wù):實現(xiàn)購物車創(chuàng)建數(shù)據(jù)庫模擬類,在cn.itcast.session.entity包中創(chuàng)建一個名稱為CakeDB的類,該類用于模擬保存所有蛋糕的數(shù)據(jù)庫。主要代碼如下:publicclassCakeDB{privatestaticMap<String,Cake>cake=newLinkedHashMap<String,Cake>();static{cake.put("1",newCake("1","A類蛋糕"));cake.put("2",newCake("2","B類蛋糕"));cake.put("3",newCake("3","C類蛋糕"));cake.put("4",newCake("4","D類蛋糕"));cake.put("5",newCake("5","E類蛋糕"));}//獲得所有的蛋糕publicstaticCollection<Cake>getAll(){returncake.values();}//根據(jù)指定的id獲蛋糕publicstaticCakegetCake(Stringid){returncake.get(id);}}STEP02任務(wù):實現(xiàn)購物車創(chuàng)建Servlet,創(chuàng)建一個名稱為ListCakeServlet的Servlet類,該Servlet用于顯示所有可購買蛋糕的列表,通過單擊“購買”鏈接,便可將指定的蛋糕添加到購物車中。主要代碼如下:publicclassListCakeServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{resp.setContentType("textml;charset=utf-8");PrintWriterout=resp.getWriter();Collection<Cake>cakes=CakeDB.getAll();out.write("本站提供的蛋糕有:<br>");for(Cakecake:cakes){Stringurl="PurchaseServlet?id="+cake.getId();out.write(cake.getName()+"<ahref='"+url+"'>點(diǎn)擊購買</a><br>");}}}STEP03任務(wù):實現(xiàn)購物車創(chuàng)建一個名稱為PurchaseServlet的Servlet類,該類實現(xiàn)了兩個功能,一個是將用戶購買的蛋糕信息保存到Session對象中,一個是在用戶購買蛋糕結(jié)束后,將頁面重定向到用戶已經(jīng)購買的蛋糕列表。主要代碼如下:@WebServlet(name="PurchaseServlet",urlPatterns="/PurchaseServlet")publicclassPurchaseServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//獲得用戶購買的商品Stringid=req.getParameter("id");if(id==null){//如果id為null,重定向到ListBookServlet頁面Stringurl="ListBookServlet";resp.sendRedirect(url);return;}Cakebook=CakeDB.getCake(id);STEP04任務(wù):實現(xiàn)購物車//創(chuàng)建或者獲得用戶的Session對象HttpSessionsession=req.getSession();//從Session對象中獲得用戶的購物車List<Cake>cart=(List)session.getAttribute("cart");if(cart==null){//首次購買,為用戶創(chuàng)建一個購物車(List集合模擬購物車)cart=newArrayList<Cake>();//將購物城存入Session對象session.setAttribute("cart",cart);}//將商品放入購物車cart.add(book);//創(chuàng)建Cookie存放Session的標(biāo)識號Cookiecookie=newCookie("JSESSIONID",session.getId());cookie.setMaxAge(60*30);cookie.setPath("/Servlet");resp.addCookie(cookie);//重定向到購物車頁面Stringurl="CartServlet";resp.sendRedirect(url);}}任務(wù):實現(xiàn)購物車創(chuàng)建一個名稱為CartServlet的Servlet類,該類主要用于展示用戶已經(jīng)購買的蛋糕列表,其實現(xiàn)代碼如下:@WebServlet(name="CartServlet",urlPatterns="/CartServlet")publicclassCartServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ resp.setContentType("text/html;charset=utf-8"); PrintWriterout=resp.getWriter(); //變量cart引用用戶的購物車 List<Cake>cart=null; //變量purFlag標(biāo)記用戶是否買過商品 booleanpruFlag=true; //獲得用戶的session HttpSessionsession=req.getSession(false);STEP05任務(wù):實現(xiàn)購物車

//如果session為null,則purFlag置為false if(session==null){ purFlag=false; }else{ //獲得用戶購物車 cart=(List)session.getAttribute("cart"); //如果用的購物車為null,則purFlag置為false if(cart==null){ purFlag=false; } } if(!purFlag){ out.write("對不起!您還沒有購買任何商品!<br>"); }else{ //否則顯示用戶購買蛋糕的信息 out.write("您購買的蛋糕有:<br>"); doubleprice=0; for(Cakecake:cart){ out.write(cake.getName()+"<br>"); } } }}任務(wù):實現(xiàn)購物車在IDEA中啟動Tomcat服務(wù)器,在瀏覽器中輸入地址“http://localhost:8080/chapter05/ListCakeServlet”訪問ListCakeServlet,運(yùn)行如下:STEP06任務(wù):實現(xiàn)購物車單擊“STEP05”中“A類蛋糕”后的“點(diǎn)擊購買”鏈接,瀏覽器顯示的結(jié)果如下:STEP07任務(wù):實現(xiàn)購物車再次訪問ListBookServlet,選擇“B類蛋糕”后的“點(diǎn)擊購買”鏈接,瀏覽器顯示的結(jié)果如下:STEP08任務(wù):應(yīng)用Session對象模擬用戶登錄先定一個小目標(biāo)!

先定一個小目標(biāo)!使用Session相關(guān)知識,實現(xiàn)模擬用戶登錄的功能任務(wù):應(yīng)用Session對象模擬用戶登錄通過所學(xué)Session知識,學(xué)會如何使用Session技術(shù)實現(xiàn)用戶登錄的功能。為了使讀者可以更直觀的了解用戶登錄的流程,接下來,通過一張圖來描述用戶登錄的流程,具體如下圖所示。任務(wù):應(yīng)用Session對象模擬用戶登錄上圖中描述了用戶登錄的整個流程,當(dāng)用戶訪問某個網(wǎng)站的首界面時,首先會判斷用戶是否登錄,如果已經(jīng)登錄則在首界面中顯示用戶登錄信息,否則進(jìn)入登錄頁面,完成用戶登錄功能,然后顯示用戶登錄信息。在用戶登錄的情況下,如果單擊用戶登錄界面中的“退出”時,就會注銷當(dāng)前用戶的信息,返回首界面。任務(wù):應(yīng)用Session對象模擬用戶登錄創(chuàng)建封裝用戶信息類,在chapter05項目的src目錄下的cn.itcast.session.entity包中編寫一個名稱為User的類。主要代碼如下:publicclassUser{ privateStringusername; privateStringpassword; publicStringgetUsername(){returnusername;} publicvoidsetUsername(Stringusername){this.username=username;} publicStringgetPassword(){returnpassword;} publicvoidsetPassword(Stringpassword){this.password=password;}}STEP01任務(wù):應(yīng)用Session對象模擬用戶登錄創(chuàng)建Servlet,在cn.itcast.session.servlet包中編寫IndexServlet類,該類用于顯示網(wǎng)站的首界面。主要代碼如下:publicclassIndexServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //解決亂碼問題 response.setContentType("text/html;charset=utf-8"); //創(chuàng)建或者獲取保存用戶信息的Session對象 HttpSessionsession=request.getSession(); Useruser=(User)session.getAttribute("user"); if(user==null){ response.getWriter().print( "您還沒有登錄,請<ahref='/chapter05/login.html'>登錄</a>"); }else{response.getWriter().print("您已登錄,歡迎你,"+user.getUsername()+"!"); response.getWriter().print("<ahref='/chapter05/LogoutServlet'>退出</a>"); //創(chuàng)建Cookie存放Session的標(biāo)識號 Cookiecookie=newCookie("JSESSIONID",session.getId()); cookie.setMaxAge(60*30);STEP02任務(wù):應(yīng)用Session對象模擬用戶登錄 cookie.setPath("/chapter05"); response.addCookie(cookie); } } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); }}任務(wù):應(yīng)用Session對象模擬用戶登錄創(chuàng)建Servlet,在cn.itcast.session.servlet包中編寫LoginServlet,該Servlet用于顯示用戶登

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論