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不能是中文

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