Cookie應用實例——訂餐會員卡

cookie原理

用戶通過瀏覽器向myweb網站發送請求申請OneServlet,OneServlet在運行期間創建了一個cookie存儲當前用戶相關數據。OneServlet工作完畢後,將cookie寫入到響應頭交還給瀏覽器,瀏覽器收到響應包之後,將cookie存在瀏覽器的緩存中。
用戶通過同一個瀏覽器再次向myweb網站發送請求申請TwoServlet時,瀏覽器需要無條件的將myweb網站之前推送過來的cookie寫入到請求頭髮送過去。

cookie構造:

cookie(String key,String value)

實現流程圖:
web流程圖
Java代碼

//配置文件
 <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.luna.controller.OneServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.luna.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>

首先是用戶申請會員卡的頁面,用戶將userName和money寫入,通過表單提交給OneServlet

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>會員申請</title>
</head>
<body>
    <center>
        <font style="font-size: 40px;color: red">會員卡申請</font><br><br>
        <form action="/myweb/one">
            用戶名:<input type="text" name="userName"><br><br>
            預存金額:<input type="text" name="money"><br><br>
            <input type="submit" value="提交">
            <input type="reset" value="重置">
        </form>
    </center>
</body>
</html>

OneServlet拿到用戶提交的參數後存入cookie,並將cookie寫入響應頭信息返回給瀏覽器,瀏覽器攜帶cookie重定向至第二個頁面——用戶點餐頁面index2.html

public class OneServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、調用請求對象讀取請求頭參數信息
        String userName=request.getParameter("userName");
        String money=request.getParameter("money");
        //2、開卡
        Cookie card=new Cookie("userName",userName);
        Cookie card1=new Cookie("money",money);
        //3、髮卡
        response.addCookie(card);
        response.addCookie(card1);
        //4、通知瀏覽器將點餐頁面寫入到響應體交給瀏覽器
        response.sendRedirect("/myweb/index2.html");
    }
}

以下是index2.html點餐頁面…

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <center>
        <font style="font-size: 40px;color: red">歡迎點餐</font>
        <form action="/myweb/two">
            <input type="radio" name="food" value="dumpling"> 餃子15<br><br>
            <input type="radio" name="food" value="noodle">麪條12<br><br>
            <input type="radio" name="food" value="rice">米飯13<br><br>
            <input type="submit" value="劃卡消費">
        </form>
    </center>
</body>
</html>

TwoServlet通過請求對象拿到cookie,對cookie中的值做消費處理。之後建立新的cookie,將計算後的值存入cookie寫入響應頭信息中並返回給瀏覽器,在界面上展現給用戶。也就是說,Servlet拿到了舊cookie(消費之前的money)的值,將其修改(消費之後的money)存入新的cookie再放入響應頭信息返回給瀏覽器。

public class TwoServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int dumpling_money=15;
        int noodle_money=12;
        int rice_money=13;
        String userName=null;
        int money;
        int spend=0;
        int balance=0;
        response.setContentType("text/html;charSet=UTF-8");
        PrintWriter out=response.getWriter();
        Cookie newCard=null;
        //1、讀取請求頭參數信息 得到用戶點餐類型
        String food=request.getParameter("food");
        //2、讀取cookie
        Cookie[] cookies=request.getCookies();
        //3、刷卡消費
        for(Cookie ele:cookies){
            String key=ele.getName();
            String value=ele.getValue();
            if ("userName".equals(key)){
                userName=value;
            }else if("money".equals(key)){
                money=Integer.valueOf(value);
                if ("dumpling".equals(food)){
                   if(money>dumpling_money){
                       spend=dumpling_money;
                       balance=money-spend;
                       newCard=new Cookie("money",balance+"");
                   }else{
                       out.print("用戶"+userName+"餘額不足,請充值");
                   }
                }else if("noodle".equals(food)){
                    if(money>noodle_money){
                        spend=noodle_money;
                        balance=money-spend;
                        newCard=new Cookie("money",balance+"");

                    }else{
                        out.print("用戶"+userName+"餘額不足,請充值");
                    }
                }else if("rice_money".equals(food)){
                    if(money>rice_money){
                        spend=rice_money;
                        balance=money-spend;
                        newCard=new Cookie("money",balance+"");
                    }else{
                        out.print("用戶"+userName+"餘額不足,請充值");
                    }
                }
            }
        }
        //4、將用戶會員卡返回給用戶
        response.addCookie(newCard);
        //5、將消費記錄寫入到響應
        out.print("用戶"+userName+"消費了:"+spend+"元,餘額:"+balance+"元");
    }
}

注意:
1、cookie使用前提:兩個servlet來自於同一個網站,並且爲同一個瀏覽器/用戶提供服務,此時藉助於cookie進行數據共享。
2、一個cookie只能存放一個鍵值對
3、cookie中的key與value都只能是String類型
4、cookie中的key不能是中文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章