cookie小实例第二弹------浏览记录

cookie小实例第二弹——浏览记录

这是一个简陋的小实例,用来记录浏览过的图书信息。主要三个类。

1. DBUtils           存储图书数据用的;
2. ShowAllBooks      展示所有图书信息;
3. ShowBookDetails   显示单本图书详细信息;

一切都在注释中
package com.samblack323.util;

import java.util.HashMap;
import java.util.Map;

import com.samblack323.entity.Book;

public class DBUtils {
  private static Map<String,Book> books = new HashMap<String,Book>();

  //直接搞四本书,简单粗暴
  static {
        books.put("1", new Book("1", "金瓶梅", 20, "王瑞鑫"));
        books.put("2", new Book("2", "葵花宝典", 20, "杨成毅"));
        books.put("3", new Book("3", "九阴真经", 30, "陈光"));
        books.put("4", new Book("4", "玉女心经", 10, "陈志家"));
  }

  //得到所有书,便于展示所有商品
  public static Map<String,Book> getAllBooks() {
      return books;
  }

  //根据ID等到书,便于展示详细信息
  public static Book getBookById(String id) {
       return books.get(id);
  }
}
package com.samblack323.service;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.samblack323.entity.Book;
import com.samblack323.util.DBUtils;

public class ShowAllBooks extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //老样子,先把编码表弄好
        req.setCharacterEncoding("UTF-8");  
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        //先拿到书再说
        Map<String, Book> books = DBUtils.getAllBooks();
        out.write("下面有四本好书,快来看看!" + "<br>");

        //把书名都po出来,给上超链接,用get方式提交书的id到处理detail的servlet
        for (Entry<String, Book> book : books.entrySet()) {
            String id = book.getKey();
            out.write("<a href='" + req.getContextPath() + "/cookie/showbookdetails?id=" + id + "' target='_blank'>" + book.getValue().getName()
                    + "</a>" + "<br>");
        }


        out.write("-------------------------------" + "<br>");
        out.write("最近浏览商品如下:" + "<br>");

        //搞到所有cookie
        Cookie[] cookies = req.getCookies();  
        Book book = null;

        //别忘了判断cookie是否为空
        for (int i = 0; cookies != null && i < cookies.length; i++) {   
            if ("BookId".equals(cookies[i].getName())) {   
                //得到cookie中的value,即图书的id
                String value = cookies[i].getValue();         
                if (value != "") {
                    //图书ID是用'-'拼接起来的字符串,咱们分割一下
                    String[] booksId = value.split("-");      
                    //,总共四本书,倒着取值。j>1表示只浏览最近的3本(因为取不到缓存中下标为0的那本书)
                    for (int j = booksId.length; j > 1; j--) {
                        //注意角标不要越界
                        book = DBUtils.getBookById(booksId[j-1]); 
                        //屏幕上走你
                        out.write(book.getName() + "<br>");      
                    }
                }
            }
        }
    }
}
package com.samblack323.service;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.samblack323.entity.Book;
import com.samblack323.util.DBUtils;

public class ShowBookDetails extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //老样子,先把编码表弄好
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        //得到传来的id参数值
        String id = req.getParameter("id");
        //搞到这本书
        Book book = DBUtils.getBookById(id);
        //展示出来
        out.write(book.toString());

        //搞一个方法,拼接好图书id的值以便存储
        String historyId = getId(id,req);
        //搞一个cookie
        Cookie cookie = new Cookie("BookId",historyId);
        //设置路径
        cookie.setPath("/");
        //设置存货时长
        cookie.setMaxAge(60*60);
        //把cookie怼回客户端
        resp.addCookie(cookie);
    }


    private String getId(String id, HttpServletRequest req) {
        Cookie[] cookies = req.getCookies();

        //如果还没有cookie就直接传当前图书id
        if (cookies == null) {
            return id;
        }
        String value = "";
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < cookies.length; i++) {
            if ("BookId".equals(cookies[i].getName())) {    //找到这个cookie
                value = cookies[i].getValue();                //搞到value,一个图书id与'-'拼接起来的字符串
                if(value != "") {
                    String[] booksId = value.split("-");        //value有值得话,切割成字符串数组
                    for (int j = 0; j < booksId.length; j++) { 
                      //已经存在的记录中,不和当前图书id相同的,都给加到StringBuffer里面,并且后面跟一个'-'
                        if(!id.equals(booksId[j])) {              
                            sb.append(booksId[j]+"-");              
                        }
                    }
                } else {    //如果有BookId的这个cookie,但是没值,一样返回当前id即可
                    return id;
                }
            }
        }
        sb.append(id);   //循环结束,别忘了把最新的图书id加到Buffer里面
        return sb.toString();    //怼回拼接完成的字符串
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值