思想:
【使用cookie 记录访问过得商品ID。
每次访问一个商品,都先经过一个servlet处理,
把cookie里的history取出来(遍历cookies,处理cookie.getName()=="history" 的那个cookie),
===判断是否是第一次浏览:浏览第一个商品时不存在name=“history”的cookie,新建一个。
history=cookie.getValue();
拆分history:String[ ] ids=history.spilit("-");
把遍历ids,存入LinkedList list,便于添加和删除id(更新浏览记录)。======这是学习到的重点:利用了LinkedList集合的有序特性。先进先出。
使用到了:contains(id)判断是否浏览过:
①浏览过:删除id:list.remove(id);把id添加到最前面:list.addFirst(id)
②没浏览过:先要判断是否超过显示的里记录个数(list.size()):没超过,直接添加到最前面;超过,先删除最后一个元素(list.removeLast()),再添加到最后。
========到这里:浏览记录history跟新完毕。 只需要存入 重新存入cookie,返回浏览器就行了。
接着把所有浏览过的商品ID,使用“-”拼接成字符串 string history。(遍历list,StringBuilder(没有多线程,推荐这个)或StringBuffer拼接)
history 存入cookie:new Cookie("history",history),(设置路径:setPath(),设置持久化时间:setMaxAge(毫秒) ),response.addCookie(c)返回浏览器。
】
===下次 访问新的商品,重复以上过程,更新cookie里的 history。
核心代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1.接收参数ID
* 2.获得从浏览器带过来的cookie信息
* 3.判断是否是第一次浏览商品:
* *是第一次:
* *创建一个cookie将商品ID写回浏览器
* *不是第一次:
* *获得cookie中的值(所有浏览过的商品ID) 1-3
* *已经存在:1-3 点击3
* *删除当前元素,将该元素添加到最前面。
* *不存在:1-3 点击4 1-3-2 点击4
* *判断长度:
* *没有超出界限:直接添加到最前;
* *达到界限:删除最后面一个元素,将点击的这个添加到最前面。
* *创建一个cookie将商品的ID们写回到浏览器。
* 4.页面跳转到商品详情页面。
* */
//1.接收参数ID
String id = request.getParameter("pid");
//2.获得从客户端带来的所有cookie
Cookie[] cookies = request.getCookies();
//3.查找指定名称的cookie
Cookie cookie = CookieUtils.findCookie(cookies,"history");
//4.判断是否是第一次浏览商品
if(cookie==null){//第一次浏览商品
Cookie c = new Cookie("history", id);
//设置有效路径
c.setPath("/day37_visitHistory");
//有效时长
c.setMaxAge(60*60*24*7);
//协会浏览器
response.addCookie(c);
}else {
//判断商品是否已存在浏览记录中
String value = cookie.getValue();//1-3
//===切分
String[] ids = value.split("-");//===[1,3]
//===创建LinkedList:增删查改比较方便
LinkedList<String> list = new LinkedList<String>(Arrays.asList(ids));
//判断商品是否已存在浏览记录中
if (list.contains(id)) {
//已存在。1-3 点击3 --》 3-1
list.remove(id);
list.addFirst(id);
} else {
//不存在浏览记录中
if (list.size()>=3) {
//超过长度 1-3-2· 点击4--》4-1-3【linkedList结构】
//===linkedList队列结构,删除最后一个,最新浏览的添加在最前面。
list.removeLast();
list.addFirst(id);
} else {
//没超过
list.addFirst(id);
}
}
//使用-连接集合中的数据
StringBuffer sb = new StringBuffer();
for (String string : list) {
sb.append(string).append("-");
}
String history = sb.toString().substring(0,sb.toString().length()-1);
Cookie c = new Cookie("history", history);
c.setPath("/day37_visitHistory");
c.setMaxAge(60*60*24*7);
//协会浏览器
response.addCookie(c);
}
//页面跳转
response.sendRedirect(request.getContextPath()+"demo2-history/product_info.jsp?"+id);
}
不知道在页面如何拿到cookie。(好像只能在servlet:服务端 通过request.getCookies()拿到cookie)
于是 我是把 以上代码里:更新后的 list,直接放到session里,在页面从session取商品id值。
代码:http://pan.baidu.com/s/1nuRjqqP