我们经常在淘宝,京东,亚马逊等电商平台浏览商品是,经常会看到最近浏览记录这一栏,如下图:


Q题目

现在要求,模拟一个类似的功能,实体为一个网上书店,要求显示最近的三条浏览记录。如下图

例如:
1)现有如下网上书店:

本站书籍目录:JAVAC++C语言LinuxAndroid
最近三次浏览记录:

2)第一次注册进去时,是没有浏览记录的
3)浏览第一个商品后,若为Java,显示界面

本站书籍目录:JAVAC++C语言LinuxAndroid
最近三次浏览记录:JAVA

4)浏览第二个商品,若为C++

5)浏览第三个商品,若为Java,此时涉及一个排序问题了,最前的必须是最近浏览的。

6)浏览第四个商品,为C语言,


逻辑分析:

因为浏览记录设计到排序问题,为了避免排序,我们使用LinkedList集合来实现此处功能。

因为Linkedlist特点是:增删速断快,而且有addFirst(),remove()等方法。

此处,我使用Cookie来存储最近的浏览记录(当然,电商平台一般都是使用session实现)。Cookie中的key和value分别为ids,“1-2-3”等形式。

Cookie的value值说明:1-2-3

数字代表的是书籍的唯一编号id,这样我们可以将Cookie值按“-”拆分,取出id,再根据id,取出对应书籍。

实现代码

目录

book类

package com.tcb.domain;public class Book {private int id;private String name;private int price;private String author;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public Book(int id, String name, int price, String author) {super();this.id= id;this.name = name;this.price = price;this.author = author;}@Overridepublic String toString() {return "Book [id=" + id + ", name=" + name + ", price=" + price + ", author=" + author + "]";}public Book() {super();// TODO Auto-generated constructor stub}}

工具类(存储数据的地方)

package com.tcb.utils;import java.util.HashMap;import com.tcb.domain.Book;public class DBUtils {private static HashMap<String, Book> map;static{map=new HashMap<String, Book>();map.put("1",new Book(1,"JAVA",80,"张三"));map.put("2",new Book(2,"C++",60,"李四"));map.put("3",new Book(3,"C语言",70,"王五"));map.put("4",new Book(4,"Linux",100,"赵六"));map.put("5",new Book(5,"Android",90,"钱七"));}public static HashMap<String, Book> getMap() {return map;}public static void setMap(HashMap<String, Book> map) {DBUtils.map = map;}@Overridepublic String toString() {return "DBUtils [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()+ "]";}public DBUtils() {super();// TODO Auto-generated constructor stub}}

逻辑实现类Servlet:书店首页,显示所有书籍以及最近浏览记录

package com.tcb.web.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;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.tcb.domain.Book;
import com.tcb.utils.DBUtils;/*** 实现功能:* 1,显示书店书籍目录* 2,显示最近三次浏览记录*/
public class ShowBookContent extends HttpServlet {private static final long serialVersionUID = 1L;public ShowBookContent() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();// 展示所有书籍writer.write("本站书籍目录:<br>");//从集合map中取出所有book进行展示HashMap<String, Book> map = DBUtils.getMap();for (int i = 1; i < map.size() + 1; i++) {Book book = map.get(i + "");writer.write("<a href='" + request.getContextPath() + "/ShowBookDetails?id=" + book.getId() + "'>"+ book.getName() + "</a><br>");}// 显示最近三次的访问记录writer.write("最近三次浏览记录:<br>");Cookie[] cookies = request.getCookies();if (cookies != null) {//遍历cookies查找ids这个Cookiefor (Cookie cookie : cookies) {String name = cookie.getName();//若存在ids这个Cookie,则取值,去除书籍进行显示--不存在,就不做任何处理if ("ids".equals(name)) {String value = cookie.getValue();String[] values = value.split("-");for (int i = 0; i < values.length; i++) {String id = values[i];Book book1 = DBUtils.getMap().get(id);System.out.println(book1.toString());writer.write("<a  href='ShowBookDetails?id=" + book1.getId() + "'>" + book1.getName()+ "</a><br>");}}}}}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}

逻辑处理Servlet:书籍详情

package com.tcb.web.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;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.tcb.domain.Book;
import com.tcb.utils.DBUtils;/*** 实现功能:* 1,显示书籍详细信息* 2,将该次浏览信息存进Cookie*/
public class ShowBookDetails extends HttpServlet {private static final long serialVersionUID = 1L;public ShowBookDetails() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//编码处理request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//输出流PrintWriter writer = response.getWriter();// 显示被查看书籍的具体信息String id = request.getParameter("id");Book book = DBUtils.getMap().get(id);writer.write("您查看了" + book.getName() + "这本书。<br><br>");writer.write("书籍具体信息如下:<br>");writer.write(book.getName() + "<br>");writer.write(book.getAuthor() + "<br>");writer.write(book.getPrice() + "<br>");// 存储该次访问记录,方便在主页面中显示最近的访问记录// 存取数据格式为:3-2-1 先要进行数据拆分,根据情况做修改数据操作,再将数据合并放回到cookie中Cookie[] cookies = request.getCookies();if (cookies != null) {//创建一个Stringbuffer来存取所有Cookie的名字,用于判断Cookies数组中是否有ids这个Cookie,没有就需要创建StringBuffer cookieNames=new StringBuffer();//遍历Cookies数组for (Cookie cookie : cookies) {//得到Cookie名字String name = cookie.getName();//将Cookie名字存起来cookieNames.append(name+"-");  //加“-”目的是:防止分隔开每个Cookie的名字,防止相连的名字组合匹配到ids//若存在ids这个Cookie,就会进入if语句,进行数据处理---不存在ids时,需要单独处理if ("ids".equals(name)) {// 取出Cookie中存的值String value = cookie.getValue();// ids这个Cookie取出的值为空那就没必要做拆分了if (value != null && !"".equals(value)) {String[] values = value.split("-");// 数组转化成Collection集合List<String> list = Arrays.asList(values);// 把list集合直接转化成LinkedList,为了方便后续处理LinkedList<String> linked = new LinkedList<String>(list);// 判断Cookie值中包含id否if (linked.contains(id)) {//包含id,则移除id--最后将id添加到第一位linked.remove(id);} else {//不包含id,则要判断linked中数据的个数,若是3个,则直接删除最后一个--再插入//                            若小于3个,直接在第一个位置插入即可if (linked.size() > 2) {linked.removeLast();}}//将上面插入数据的的操作都提取为一句话,减少重复代码linked.addFirst(id);// 将存进linkedList中的数据取出来组合成1-2或1-2-3等形式,放到Cookie中String result = "";for (int i = 0; i < linked.size(); i++) {result += linked.get(i);if (i < linked.size()-1) {result += "-";}}System.out.println("=======result=======" + result);Cookie cookie2 = new Cookie("ids", result);cookie2.setMaxAge(10 * 60);response.addCookie(cookie2);}}}//对遍历后得到的cookieName进行判断,是否存在ids,不存在,则需要自己创建if(!cookieNames.toString().contains("ids")){Cookie cookie = new Cookie("ids", id);cookie.setMaxAge(10 * 60);response.addCookie(cookie);}} else {//cookies为空,那么ids这个cookie肯定不存在Cookie cookie = new Cookie("ids", id);cookie.setMaxAge(10 * 60);response.addCookie(cookie);}}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

显示结果:

源码下载地址:http://download.csdn.net/detail/baidu_37107022/9854421

拓展:若将集合改为MySQL数据库,此时如何实现历史记录?
答案:http://blog.csdn.net/baidu_37107022/article/details/72784178

模拟亚马逊、淘宝等浏览记录(历史记录)功能(访问集合存储的数据)相关推荐

  1. 带你一步步破解亚马逊 淘宝 京东的反爬虫机制!

    事情是这样的 亚马逊是全球最大的购物平台 很多商品信息.用户评价等等都是最丰富的. 今天,手把手带大家,越过亚马逊的反爬虫机制 爬取你想要的商品.评论等等有用信息 反爬虫机制 但是,我们想用爬虫来爬取 ...

  2. 亚马逊光缆被挖?——阿里工程师讲解支付宝如何架构设计数据中心

    文: 周瑜 校对:李二 全文2500字,建议阅读时长7分钟 点击右上角关注我们,每天都能收到有趣的推文哦. 亚马逊光缆被挖?--阿里工程师讲解支付宝如何架构设计数据中心 昨天科技圈最火的新闻应该是&q ...

  3. 亚马逊多店铺管理软件需要有什么功能?

    亚马逊多店铺管理软件是什么?亚马逊多店铺管理软件能干什么?亚马逊多店铺管理软件能达到什么目的?小编今天就会结合上述问题总和分析亚马逊多店铺管理软件. 知道亚马逊多店铺管理软件的亚马逊卖家,恭喜你,拥有 ...

  4. 亚马逊数据库数据传输费用_见解:亚马逊希望获得有关您的身体形状和眼球运动的数据

    亚马逊数据库数据传输费用 Amazon's Anticipatory Package Shipping in its Fulfillment Centres has packed and ready ...

  5. 惹事之后,亚马逊AI助手Alexa将增新功能,真的能比自己更懂你?

    作者|震霆            出品|遇见人工智能        公众号|GOwithAI 亚马逊的语音助手Alexa总是给用户带来"惊喜". 比如前段时间突然发出怪笑,把用户吓 ...

  6. 亚马逊前员工被控盗取Capital One 1亿多客户数据 AWS安全性遭质疑

    [TechWeb]8月2日消息,据国外媒体报道,西雅图一名女程序员佩齐·汤普森(Paige Thompson)被控从美国一家大型商业银行Capital One盗取了1亿多客户数据. 汤普森的简历显示, ...

  7. 模拟亚马逊、淘宝等浏览记录功能(访问数据库)

    Q题目 现在要求,模拟一个类似的功能,实体为一个网上书店,要求显示最近的三条浏览记录,使用数据库存储数据和查询数据,如下图 例如: 1)现有如下网上书店: 本站书籍目录:JAVAC++C语言Linux ...

  8. 亚马逊——不一样的电商公司

    其一: 电商公司就是电子商务公司.电子商务通俗的说就是利用电子工具进行各种商务活动,如网上购物.在线电子支付等.可以说电子商务是传统商业活动的电子化和网络化.离我们最近的就是网购了,通常我们会在淘宝. ...

  9. 亚马逊运营,站外推广的五种方式 推广时需要注意什么?

    亚马逊旺季即将到来,各位做亚马逊的卖家如果你已经使用了亚马逊站内推广方案,但仍然觉得销量还有更多增长空间,或者说站内的营销以及到了瓶颈.那么你可能是时候研究一下亚马逊站外的广告了. 据亚马逊官方统计, ...

最新文章

  1. think in java interview-高级开发人员面试宝典(二)
  2. swift5优秀打印函数自定义
  3. Ehcache小结(一)
  4. 编程中的那些容易迷糊的小知识
  5. 如何通过PXE实现一键自动化安装操作系统
  6. LAMP_PHP配置
  7. 讯为开发板的最小LINUX系统烧写及U盘的挂载及卸载
  8. Polar SI9000阻抗计算
  9. 蓝牙 - 注册SIG账号
  10. “正大杯”第十三届全国大学生市场调查与分析大赛(本科模拟题)
  11. Composition API 监听属性
  12. qq说说时间轴php实现,qq空间时间轴 PHP实现时间轴函数代码
  13. 基于51单片机及MAX6675的8通道测温系统 protues仿真
  14. 你应该知道的三相电机知识
  15. 来,新手们,Internet Download Manager,艺术升华
  16. 信息奥赛一本通1225:金银岛
  17. oracle中触发器的创建,Oracle触发器创建及其功能
  18. Linux中的timedatectl时间设置及ntp时间同步服务搭建
  19. 计算机教师面试万能稿,教资面试——信息技术试讲逐字稿
  20. 800字让你搞懂:掩码,反掩码,通配符。

热门文章

  1. 【tensorflow】随机数生成
  2. 西交计算机电气,数二满分-初试441西交电气考研纯干货分享!
  3. HALC:用于长读取错误纠正的高吞吐量算法
  4. Recast源码解析(一):射线实现原理
  5. ubuntu14.04安装Floodlight
  6. 谷歌游览器插件html5,谷歌放弃Gears浏览器插件 重点开发HTML5
  7. abb机器人码垛编程详解_ABB机器人IRB460机器人完成双工位码垛任务编程——ABB机器人...
  8. 独木桥问题-PV操作解决同步问题
  9. int的取值范围(最大值最小值)怎么得到
  10. 【电子学会】2022年03月图形化二级 -- 跳跃游戏