1.为什么要实现历史记录功能
我们在访问淘宝,京东等购物网站的时候,系统会自动给我们保存刚才浏览过的商品信息。简单的说,你想要购买一件商品,你在搜索栏输入想要的商品名称,系统会显示所有包含商品名称的商品,此时你点开第一件商品,发现不太满意,又往下浏览,浏览到最后却发现还是第一次看的商品最好,但是如果没有历史记录的话,你就很难找到那件商品,有了历史记录以后,你就可以查找历史纪录中最早访问的商品了,从而找到最满意的一款
2.怎样实现历史纪录功能
毫无疑问,能存储信息的还是cookie。具体怎么实现呢,首先,因为cookie能够携带的信息有限加上cookie只能存储字符串,所以我们不能直接将商品对象存储到cookie中,我们可以以商品的编号代之。当访问一件商品时,客户端向服务器发送请求,服务器从数据库中拿数据显示到页面上,将商品的编号写回到cookie,再将cookie携带到客户端。在写这个程序的时候,我们需要写一个DBUtils工具类,返回值为HashMap<String, Object>,一个编号对应一个商品对象。当我们访问编号为1的商品时,1商品被保存到历史记录中,然后我们再访问2商品,此时在写回到cookie的时候,我们先将1商品拿出来,然后拼接到2商品的后面,此时变为2-1,再将2-1写回到cookie中。依次类推,当访问第三本书的时候,历史纪录中为3-2-1。由于我们要求历史记录中的商品不能重复,因此我们在访问第二本书的时候,需要先用split将字符串分割,依次遍历,将2去掉,在将剩下的3-1拼接到2的后面。
下面看具体的实现代码
先编写对应的实体类,并且生成对应的set、get方法

package edu.swpu.entity;public class Book {private String id;private String name;private double price;private String author;public Book(String id, String name, double price, String author) {super();this.id = id;this.name = name;this.price = price;this.author = author;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}@Overridepublic String toString() {return "Book [id=" + id + ", name=" + name + ", price=" + price+ ", author=" + author + "]";}}
package edu.swpu.util;import java.util.HashMap;
import java.util.Map;import edu.swpu.entity.Book;public class DBUtil {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> findAllBooks(){return books;}/*** 根据id查找指定的书* @param id* @return*/public static Book findBookById(String id){return books.get(id);}
}
package edu.swpu.history;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;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 edu.swpu.entity.Book;
import edu.swpu.util.DBUtil;public class ShowAllBooksServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.write("本网站有以下好书:<br/>");Map<String, Book> books = DBUtil.findAllBooks();for (Map.Entry<String, Book> book : books.entrySet()) {out.write("<a href='"+request.getContextPath()+"/servlet/showBookDetail?id="+book.getKey()+"' target='_blank'>"+book.getValue().getName()+"</a><br/>");}out.write("<hr/>您最近浏览过的书有:<br/>");Cookie[] cookies = request.getCookies();for(int i = 0; cookies != null && i < cookies.length; i++) {if("historyBookId".equals(cookies[i].getName())){ //判断是否有historyBookId的cookieString value = cookies[i].getValue();         //1-2-3String[] ids = value.split("-");for(int j = 0; j < ids.length; j++) {Book book = DBUtil.findBookById(ids[j]);  //根据ID得到指定的书out.print(book.getName()+"<br/>");}}}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
package edu.swpu.history;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;import javax.naming.LinkLoopException;
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 edu.swpu.entity.Book;
import edu.swpu.util.DBUtil;public class ShowBookDetail extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();//显示图书的详细信息//获得idString id = request.getParameter("id");Book book = DBUtil.findBookById(id);//out.write(book.toString());out.print(book);//把当前浏览过的书的id写回到客户端String historyBookId = organizeId(id, request);Cookie ck = new Cookie("historyBookId", historyBookId);ck.setPath("/");ck.setMaxAge(Integer.MAX_VALUE);  //设置cookie的保存时间response.addCookie(ck);           //写回到客户端}/*** 客户端                            showAllBooks                showBookDetail* 没有Cookie                        1                       historyBookId=1* 有Cookie,但没有historyBookId       1                       historyBookId=1* historyBookId=1                  2                       historyBookId=2-1* historyBookId=1-2              2                       historyBookId=2-1* historyBookId=1-2-3                2                       historyBookId=2-1-3* historyBookId=1-2-3              4                       historyBookId=4-1-2*/private String organizeId(String id, HttpServletRequest request) {//得到客户端的CookieCookie[] cookies = request.getCookies();if(cookies == null){return id;}//查找有没有name叫做historyBookId的cookieCookie historyBook = null;for(int i = 0; i < cookies.length; i++) {if("historyBookId".equals(cookies[i].getName())){historyBook = cookies[i];}}//如果没有historyBookId的cookie,则还返回idif(historyBook == null){return id;}String value = historyBook.getValue();  //2-1-3String[] values = value.split("-");LinkedList<String> list = new LinkedList<String>(Arrays.asList(values));if(list.size()<3){                      //1 2if(list.contains(id)){list.remove(id);                //如果包含当前id的值,则删除这个id}}else{if(list.contains(id)){list.remove(id);}else{                              //说明有3本书的id了list.removeLast();              //把最后一个id删除 }}list.addFirst(id);                      //最新书的id添加到最前面StringBuffer sb = new StringBuffer();for(int i = 0; i < list.size(); i++) {if(i > 0){sb.append("-");}sb.append(list.get(i));}System.out.println(sb);                 //1-2-3return sb.toString();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

使用cookie实现历史记录功能相关推荐

  1. win10计算机记录,启用Windows 10计算器中的历史记录功能 | MOS86

    点击此处修复Windows错误并提高系统性能 Windows 10中的计算器应用程序看起来很简单,但功能尚不强大,因为它包含一些标准的,科学的和编程的模式以及单位转换器.它成为准备账单,转换食谱或其他 ...

  2. 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...

    5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...

  3. 搜集访问网页历史记录软件_微软宣布OneDrive版本历史记录功能抵达Win10和macOS客户端版...

    微软旗下的云存储服务 OneDrive 此前已经提供历史版本功能,即不同编辑版本保留以便用户有需要的时候恢复.不过此前该功能仅支持网页版使用因此操作上多有不变,尤其是常用文档可能每次都得访问网页版查看 ...

  4. 微信小程序—实现搜索功能,搜索历史记录功能

    本文主要基于微信小程序实现和uni-app实现搜索商品和历史记录的功能. 不详细介绍,主看代码注释即可!! 1.搜索组件页面代码块 <template><view><!- ...

  5. java搜索页面历史记录,使用JS location实现搜索框历史记录功能

    首先,来看下效果图(样式什么的就不必吐槽了哈) html代码 搜索记录: //用于保存记录信息 css代码 * { margin: 0; padding: 0; } input { border: 0 ...

  6. Photoshop入门与进阶实例:1.10 历史记录功能

    在我们使用Photoshop进行图像绘制或者编辑等工作的时候,常常会出现一些不适当的操作,因此一般难以一次就得到完美的效果,这时就需要使用Photoshop中的历史记录功能来恢复我们的操作了.Phot ...

  7. 7. 实现用户的历史记录功能

    例如,很多应用程序都有浏览用户的历史记录的功能: 浏览器可以查看最近访问过的网页. 视频播放器可以查看最近播放过的视频文件. Shell可以查看用户输入过的命令. 要求:现在制作一个简单的猜数字游戏, ...

  8. unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏,需要一个简单的历史记录功能,放在左上角,记录最近20条的收入/支出记录.超过2秒不动则收起.收起时展示最近的一个消息记录. 用到的组件是ScrollView,使用方法 ...

  9. 历史记录计算机app,计算机管理系统软件历史记录功能

    计算机管理系统软件历史记录功能 计算机管理系统有哪些功能?在前面文章中小编总结了软件的功能概括,那么这里小编就来详细的介绍每个功能的使用和特点,希望对大家的使用有更多的帮助. 一.历史记录功能 1.屏 ...

最新文章

  1. Solr学习总结(二)Solr的安装与配置
  2. android ble 助手源码_[源码和文档分享]基于Android的生活助手APP的设计与实现
  3. 嵌入式开发之网络心跳包---阻塞和非阻塞以及是否有必要心跳包heartbeat
  4. DFS——记忆化搜索——动态规划
  5. 重装系统,配置CVS
  6. 做谷歌地图是获得Map key的方法
  7. hdu 4885 (n^2*log(n)推断三点共线建图)+最短路
  8. iOS设备唯一标识(可以用版)
  9. 4.4 逻辑运算的实现
  10. 数据结构之线性表:单链表
  11. 发言稿开场白范文_万能演讲开场白范文
  12. c# word 增加段落_你知道制作简历时的9个Word技巧吗?
  13. Mysql解压版配置环境等
  14. 从Source Insight到Vim
  15. 【路径规划】基于matlab HybridA_Star算法机器人路径规划【含Matlab源码 1390期】
  16. TwinCAT软件编码器参数介绍
  17. ssm项目_什么是SSM,以及javaweb项目包的含义(三层架构)
  18. Python 识别图片字符
  19. 一文详解云原生DevOps(认识、熟悉、上手,DevOps,Docker,Jenkins,SonarQube,Harbor)
  20. 【腾讯云 Finops Crane 集训营】深入了解 Crane 开源项目,集训营实验操作指南,体验过程总结

热门文章

  1. 复制html什么意思,copyouterhtml是什么意思
  2. 教育期刊《中学语文》征稿启示
  3. 使用python自带的虚拟环境创建虚拟环境
  4. easytouch 之 相机操作-移动端
  5. 离开谷歌的李飞飞没闲着,通过机器学习研究抑郁症!
  6. vue 项目中使用mobiscroll calendar
  7. 小袋鼠你往哪儿跳——遗传算法基础及其本质
  8. 昂达A69G主板U盘启动方法
  9. 祝全体信管女生三七女生节快乐。。。。
  10. 如何打开.lxe文件