使用cookie+工具类实现的 记录显示 用户【浏览商品记录】

思想: 

【使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值