天天看點

【HM】第9課:Cookie與HttpSession詳解

<pre>

day09

昨天内容回顧

         (1)response

         *response裡面對應http協定裡面的對應的方法

         *在response裡面做了四個案例(不包含驗證碼)代碼至少寫三遍

         *驗證碼的案例,看懂就可以了。

         *重點掌握看不清換一張實作

         *Response向頁面輸出中文亂碼解決(****)

         (2)request

         *擷取客戶機資訊和頭資訊的方法

         *擷取表單送出的資料

         *擷取表單送出中文資料亂碼問題解決(****)

         *request域

         *重定向和轉發的差別

 思維導圖

<a href="http://s3.51cto.com/wyfs02/M00/6F/4F/wKiom1WYkUqDsgafAAEHmc_NDsk207.jpg" target="_blank"></a>

1、JSP入門(代碼位置/day09/WebRoot/jsp)

         *什麼是jsp:學過servlet,如果向頁面輸出内容,需要使用位元組流或者字元流輸出,這樣很麻煩。

         針對這種很麻煩的情況,sun公司開發了一個新的技術jsp(友善向頁面進行輸出)

         *java server pages:java伺服器端的頁面,jsp運作在伺服器裡面。

         *jsp就是一個servlet,jsp最終會被編譯成servlet,會把編譯之後的servlet放到tomcat的work目錄下

         *jsp在什麼時候編譯成servlet:在請求jsp時候會把jsp編譯成servlet

         *jsp組成:html+java代碼+jsp自身的一些東西

         *jsp裡面如何嵌入java代碼(*****)

         **有三種方式

         第一種:&lt;%!  %&gt;:在定義的變量是成員的變量

                   =&lt;%! int i = 10; %&gt;

         第二種:&lt;%=  %&gt;:向頁面輸出的内容

                   =在servlet裡面生成的代碼 out.print("hello" );

         第三種:&lt;%  %&gt;

                   =在servelt裡面生成的代碼在service裡面

         在實際開發中一般 jsp裡面經常 html代碼和java代碼混合使用

         *練習:使用html和java代碼在jsp裡面生成五行五列的表格

            &lt;table border="1"&gt;

            &lt;%

                   for(inti=1;i&lt;=5;i++) {

                   %&gt;

                            &lt;tr&gt;

                                     &lt;%

                                               for(intj=1;j&lt;=5;j++) {

                                     %&gt;

                                                        &lt;td&gt;aaaaaaaaa&lt;/td&gt;

                                               }

                                      %&gt;

                            &lt;/tr&gt;

                   &lt;%

                   }

            &lt;/table&gt;

2、EL表達式入門(代碼位置/day09/WebRoot/el)

         *什麼是el表達式:用于擷取域對象裡面的值

         *el表達式用于jsp頁面中,不能在html中使用

         *文法: ${域對象名稱}

         *    &lt;!-- 使用el表達式擷取域對象裡面的值--&gt;

            &lt;!-- 向域對象裡面設定值 --&gt;

                   //向servletContext裡面設定值

                   getServletContext().setAttribute("msg1","itcast");

                   //向request域裡面設定值

                   request.setAttribute("msg2","itheima");

             %&gt;

             &lt;!-- 使用傳統方式擷取域對象裡面的值--&gt;

            &lt;%=getServletContext().getAttribute("msg1") %&gt;

             &lt;%=request.getAttribute("msg2")%&gt;

             &lt;hr/&gt;

             &lt;!-- 使用el表達式擷取域對象裡面的值--&gt;

             ${msg1 }

             ${msg2 }

         *如果向不同的域對象裡面設定值的名稱是相同的,使用el表達式擷取的是域對象範圍小的裡面的值

         *如果使用傳統方式擷取域對象裡面的值,名稱不存在得到null

         如果使用el表達式擷取域對象裡面的值,名稱不存在傳回空字元串 ""

3、會話管理

         *什麼是會話:打開一個浏覽器進行網頁的浏覽,在一個浏覽器裡面浏覽很多的網頁,到關閉浏覽器的這個過程

         稱為一次會話。

         *會話管理的技術有兩種

         第一種:cookie,用戶端的技術          

         第二種:session,伺服器端的技術

         *使用域對象儲存購物資訊

         **使用request域對象儲存購物資訊

                   =因為request域範圍是一次請求,是以request域不能儲存購物資訊

         **使用servletContext域對象儲存購物資訊

                   =因為servletContext域範圍是整個web項目,每個web項目都有一個servletContext域

                   ,進行結算時候,誰先結算把servletContext裡面的所有商品都結算

         *可以使用會話技術儲存購物資訊

         **使用cookie儲存購物資訊

                   =基本過程:

                   第一次買百度,到伺服器端得到百度,把百度放到cookie裡面,把cookie傳回到浏覽器記憶體中

                   第二次買ibm,從浏覽器記憶體中得到資訊,拿着這個百度發送請求,到伺服器端得到ibm和百度,

                   把這兩個值放到cookie裡面,把現在cookie傳回到浏覽器記憶體中。

                   最終進行結算,拿着記憶體中的百度和ibm發送請求,在伺服器端得到兩個值進行結算

         **使用session儲存購物資訊

                   =基本的過程:

                   第一次買電腦,到伺服器端得到電腦,在伺服器端開辟一個空間,把得到放到空間裡面,傳回一把可以打開

                   這個空間唯一鑰匙,把這把鑰匙傳回浏覽器的記憶體中。

                   第二次買滑鼠,拿着第一次傳回的鑰匙進行購買,到伺服器端得到滑鼠,拿着鑰匙打開空間,

                   把滑鼠放到空間裡面,也會傳回一把新的鑰匙,傳回到浏覽器的記憶體中。

                   最終結算:拿着新的鑰匙進行結算,到伺服器端使用鑰匙把空間打開,從裡面取出值完成結算

4、案例一:使用cookie記錄使用者的上次通路時間(cn.itcast.cookie.CookieDemo1)

         *需求描述:第一次通路某個servlet,産生一個通路時間,顯示歡迎

                      第二次再次通路這個servlet,有一個上次的時間,産生一個現在的時間

         *案例的分析(畫圖分析)

         *得到所有的cookie:Cookie[] getCookies() 

         *把cookie的值傳回到浏覽器記憶體中(回寫): response.addCookie(Cookie cookie)

         *建立cookie:Cookie(String name, String value)

         *代碼片段

                   //得到所有的cookie

                   Cookie[]cookies = request.getCookies();

                   //比如時候cookie的名稱  visit,判斷是否有和visit名稱相同的cookie

                   Cookiecookie = findCookie(cookies,"visit");

                   //得到目前的時間

                   Datedate = new Date();

                   Stringtimes = date.toLocaleString();

                   //把times儲存到cookie裡面

                   Cookiec = new Cookie("visit",times);

                   //把cookie值傳回浏覽器記憶體

                   response.addCookie(c);

5、cookie的API使用

         *得到cookie的名稱:getName()

         *得到cookie的值:getValue()

         *setMaxAge(int expiry):設定cookie的有效時長

         *setPath(String uri) :設定cookie的有效路徑

         (1)cookie的分類有兩種

         第一種:會話級别的cookie,關閉浏覽器cookie消失了(銷毀了)

         第二種:持久性的cookie,cookie會在一定的時間内一直有效

                   *可以進行設定

                   *使用 setMaxAge(int expiry):參數是int類型,值是秒

                   *使用 setPath(String uri):一般參數傳遞成 setPath("/")

                   *代碼

                   //設定持久性cookie

                   //設定有效時長

                   c.setMaxAge(3600);

                   //設定有效路徑

                   c.setPath("/");

         *cookie一些細節問題

         **一個Cookie隻能辨別一種資訊,它至少含有一個辨別該資訊的名稱(NAME)和設定值(VALUE)。

         **一個WEB站點可以給一個WEB浏覽器發送多個Cookie,一個WEB浏覽器也可以存儲多個WEB站點提供的Cookie。

         **浏覽器一般隻允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。

         我的總結:

         **如果你在浏覽器中設定了自動清除cookies的話,也達不到想要的效果。

         **不同的sevlet是共享Cookie的,即使在不同的servletnew出了相同名稱的Cookie,

           但是它們還是同一個Cookie。Cookie是存儲在用戶端浏覽器中的,伺服器與Cookie

           存儲無關,隻與它的建立、修改、擷取有關。

         **不同的浏覽器即使Cookie名稱相同,也不是同一個Cookie。   

         **如果建立了一個cookie,并将他發送到浏覽器,

         預設情況下它是一個會話級别的cookie(即存儲在浏覽器的記憶體中),使用者退出浏覽器之後即被删除。

         若希望浏覽器将該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為機關的時間。

6、案例二:使用cookie記錄使用者浏覽的商品

         (頁面位置:/day09/WebRoot/cookie/product.jsp

         servlet位置:/day09/src/cn/itcast/cookie/CookieDemo2.java)

         (1)實作的步驟:

         1、建立頁面,在頁面裡面有多個超連結表示不同的商品 ,使用id的值區分

          * 1、判斷是否是第一次浏覽

          * 2、如果是第一次浏覽,擷取id值,把id值存到cookie裡面,再把cookie寫到浏覽器的記憶體中

          * 3、如果不是第一次浏覽,首先得到第二次購物的id值,到cookie裡面進行判斷,判斷是否有相同的id

          * 如果有相同的id,不需要回寫cookie

          * 4、如果沒有相同的id值的cookie,首先擷取之前id值,在之前的基礎之上追加一個id值,回寫到浏覽器的記憶體中

         **代碼片段

         *//判斷id是否相同 cookie裡面存結構 his 1,2,3

                   Stringvalues = cookie.getValue();

                   //切割values

                   String[]ids = values.split(",");

                   //寫方法實作周遊數組,和id值進行比較

                   booleanflag = checkIds(ids,id);

                   //沒有相同的id才進行下一步操作

                   if(!flag){

                            Stringvalue = values+","+id; //比如values 1,2 追加之後 1,2,3

                            //存到cookie

                            Cookiec = new Cookie("his",value);

                            //設定cookie是持久性的cookie

                            c.setMaxAge(3600);

                            c.setPath("/");

                            //把cookie寫到浏覽器的記憶體中

                            response.addCookie(c);                             

         (2)清空浏覽記錄的功能(代碼位置:/day09/src/cn/itcast/cookie/Clear1.java)

                   *因為浏覽資訊存到cookie裡面,所有銷毀cookie就可以了

                   *如果是會話級别的cookie,關閉浏覽器就銷毀cookie

                   *如果是持久性的cookie如何銷毀呢?

                   *通路的路徑裡面包含setPath裡面的值,會攜帶cookie資訊發送請求

                   比如:c.setPath("/day01");

                   如果通過這個路徑進行通路http://127.0.0.1/day01/... 會攜帶cookie資訊

                   如果通過這個位址通路http://127.0.0.1/day02/..... 不會寫到cookie資訊

                   *一般都是設定成 /

                   *銷毀持久性cookie的步驟

                   1、建立一個和要銷毀cookie相同名稱的cookie

                            Cookiecookie = new Cookie("his","")

                   2、設定這個cookie的有效時長是0

                            cookie.setMaxAge(0)

                   3、設定有效路徑和要删除cookie的路徑一樣

                            cookie.setPath("/");

                   4、把這個cookie回寫到浏覽器的記憶體

7、session的簡介

         *第一次買電腦,到伺服器端得到電腦,在伺服器端開辟一個空間,把得到放到空間裡面,傳回一把可以打開

         這個空間唯一鑰匙,把這把鑰匙傳回浏覽器的記憶體中。

         第二次買滑鼠,拿着第一次傳回的鑰匙進行購買,到伺服器端得到滑鼠,拿着鑰匙打開空間,

         把滑鼠放到空間裡面,也會傳回一把新的鑰匙,傳回到浏覽器的記憶體中。

         最終結算:拿着新的鑰匙進行結算,到伺服器端使用鑰匙把空間打開,從裡面取出值完成結算

         (1)如何建立session?

         *執行getSession()  方法之後建立session對象 名稱是 HttpSession

         *一個浏覽器獨占一個session對象

         *舉例看效果

         **建立一個servlet1,在建立session,列印session的id值

         **在servlet1寫一個超連結到servlet2,在servlet2也是建立session,列印id值

         ***看這兩個id值是否一樣

         *session向浏覽器回寫鑰匙,也是使用cookie來實作的,jsessionid=值

         **session也是要依賴于cookie實作的

8、案例三:使用session實作簡單的購物車(****)

         (代碼的位置

         頁面:/day09/WebRoot/session

         servlet:/day09/src/cn/itcast/session/SessionDemo1.java

         )

         *首先建立商品的清單的頁面

                   (差別不同的商品id)

         *點選某個商品加入到購物車

         *會到一個頁面(結算還是繼續購物)

                   **點選繼續購物,回到清單頁面

         *到結算頁面,在結算頁面上顯示商品名稱和數量

         *session也是一個域對象,範圍:一次會話

         **存值 setAttribute(name,value)

         **取值 getAttribute(name)

          * 1、判斷是否是第一次購物

          * 2、如果是第一次購物,建立購物車,把商品名稱和數量1放到map裡面(得到id,根據id得到商品名稱)

          * 3、根據商品名稱進行判斷,判斷購物車裡面是否有相同名稱的商品,如果有,把商品的數量取出來+1,放回map裡面

          * 4、如果沒有相同名稱的商品,直接把商品名稱和數量1放到map裡面

          * 5、最終把map放到session裡面

9、session的建立、銷毀和清空購物車

         (代碼:/day09/src/cn/itcast/session/ClearSession.java)

         *request.getSession()進行建立

         *session的銷毀(****)

         第一種:非正常關閉伺服器

         第二種:session有一個預設的過期時間 這個時間是30分鐘

         第三種:直接調用session裡面的方法實作invalidate() (重點掌握)

10、案例四:使用session進行驗證碼的校驗

         (代碼位置:/day09/src/cn/itcast/session/CodeServlet.java

                   /day09/src/cn/itcast/session/LoginServlet.java)

         *建立一個登陸頁面,在添加驗證碼,完成校驗

         *debug調試web項目

          * 1、擷取輸入的驗證碼

          * 2、擷取session裡面的驗證碼

          * 3、判斷這兩個驗證碼是否相同

11、禁用cookie後session的使用(了解)

       ** 建立一個servlet1,在建立session,列印session的id值

         **在請求的位址後面添加一個參數 ;jsessionid=session的id值

         **如果網站裡面有很多位址,這些位址都需要加jsessionid

         **一般的購物網站,如果禁用了cookie,直接不讓你買東西

=======================================================================

         完成的任務:

         (1)昨天寫的request和response案例的代碼寫一遍

         (2)cookie裡面的兩個案例代碼至少寫兩遍

         (3)session裡面購物車的代碼至少寫一遍

                   *根據實作步驟把代碼寫出來

&lt;/pre&gt;

      本文轉自屠夫章哥  51CTO部落格,原文連結:http://blog.51cto.com/4259297/1671016,如需轉載請自行聯系原作者