<项目>查看用户浏览过的商品

1.创建一个entity包储存实体对象

1.1创建一个Product的类存储实体对象

对象具有以下属性,并添加set和get方法,含参和不含参的构造方法,toString方法

  1. private String id;
  2. private String proName;
  3. private String proType;
  4. private double price;

2.创建一个Dao包储存实体对象的操作方法

2.1创建一个存放所有对Product对象的CRUD方法的ProductDao类

  1. public class ProductDao {
  2. private static List<Product> data = new ArrayList<Product>();
  3. //初始化商品
  4. static{
  5. //只执行一次
  6. for(int i=1;i<=10;i++){
  7. data.add(new Product(""+i,"笔记本"+i,"LLS00"+i,2300.0+i*300));
  8. }
  9. }
  10. //提供查找所有商品的方法
  11. public List<Product> findAll(){
  12. return data;
  13. }
  14. //根据编号查找商品
  15. public Product findById(String id){
  16. for (Product p : data) {
  17. if(p.getId().equals(id)){
  18. return p;
  19. }
  20. }
  21. return null;
  22. }
  23. }

3.创建一个Servlet包存放servlet程序

3.1创建一个ListServlet来显示所有商品列表

作用:

1.从"数据库"中读取商品列表信息

  1. ProductDao dao = new ProductDao();
  2. List<Product> list = dao.findAll();

2.把商品列表信息显示到浏览器中

  1. PrintWriter writer = response.getWriter();
  2. String html = "";
  3. html += "<html><head><title>显示商品列表</title></head>";
  4. html += "<body><center><h1>所有商品</h1></center><table border='1' align='center'>";
  5. html += "<tr><th>编号</th><th>商品名称</th><th>商品型号</th><th>商品价格</th></tr>";
  6. //遍历商品
  7. for (Product product : list) {
  8.    // /day11_pro/DetailServlet?id=1 访问DetailSErvlet的servlet程序,同时传递 名为id,值为1 的参数
  9. html += "<tr><td>"+product.getId()+"</td><td><a href='/day11_pro/DetailServlet?id="+product.getId()+"'>"+product.getProName()+"</a></td><td>"+product.getProType()+"</td><td>"+product.getPrice()+"</td></tr>";
  10. }
  11. html += "</table>";
    html +="</html>";
    writer.write(html)

3.接受cookie信息,取出prodHist的cookie

  1. cookie[] cookies = request.getCookies();

4.根据编号查询相对应的商品

  1. if(cookies!=null){
  2. html += "<table align='center'><tr><th>最近浏览过的商品</th></tr>";
  3. for (Cookie cookie : cookies) {
  4. if(cookie.getName().equals("prodHist")){
  5. String prodHist = cookie.getValue(); // 3,2,1
  6. String[] ids = prodHist.split(",");
  7. //遍历浏览过的商品id
  8. for (String id : ids) {
  9. //查询数据库,查询对应的商品
  10. Product p = dao.findById(id);
  11. //显示到浏览器
  12. html += "<tr><td>"+p.getId()+"</td><td>"+p.getProName()+"</td><td>"+p.getPrice()+"</td></tr>";
  13. }
  14. }
  15. }
  16. html += "</table>";
  17. }

5.把商品显示到浏览过的商品列表

3.2创建一个DetailServlet来显示商品详细信息

作用:

1.根据编号查询对应的商品

  1. //接受获取到的编号
  2. String id = request.getParameter("id");
  3. //查询编号所对应的商品
  4. ProductDao dao = new ProductDao();
  5. Product product = dao.findById(id);

2.显示商品到浏览器

  1. //将商品的详细信息显示到浏览器中
  2. PrintWriter writer = response.getWriter();
  3. String html = "";
  4. html += "<html><head><title>商品详细信息</title></head>";
  5. html += "<body><center><h1>详细信息</h1></center><table border='1' align='center'>";
  6. html += "<tr><th>编号</th><td>"+product.getId()+"</td></tr>";
  7. html += "<tr><th>商品名称</th><td>"+product.getProName()+"</td></tr>";
  8. html += "<tr><th>商品型号</th><td>"+product.getProType()+"</td></tr>";
  9. html += "<tr><th>商品价格</th><td>"+product.getPrice()+"</td></tr>";
  10. html += "</table>";
  11. html += "<center><a href='"+request.getContextPath()+"/ListServlet'>[返回列表]</a>";
  12. html +="</html>";
  13. writer.write(html);

3.创建cookie,名为prodHist

  1. //1.创建cookie
  2. Cookie cookie = new Cookie("prodHist",creatValue(request,id));
  3. cookie.setMaxAge(1*30*24*60*60);

3.1分析思路

  1. 生成cookie的值
  2. 分析:
  3. 当前cookie 传入商品id 最终cookie
  4. null或没有prodHist 1 1 (算法: 直接返回传入的id
  5. 1 2 2,1 (没有重复且小于3个。算法:直接把传入的id放最前面
  6. 2,1 1 1,2(有重复且小于3个。算法:去除重复id,把传入的id放最前面
  7. 3,2,1 2 2,3,1(有重复且3个。算法:去除重复id,把传入的id放最前面)
  8. 3,2,1 4 4,3,2(没有重复且3个。算法:去最后的id,把传入的id放最前面)

3.2生成cookie的值

  1. Cookie[] cookies = request.getCookies();
  2. String prodHist = null;
  3. if(cookies!=null){
  4. for (Cookie cookie : cookies) {
  5. if(cookie.getName().equals("prodHist")){
  6. prodHist = cookie.getValue();
  7. break;
  8. }
  9. }
  10. }
  11. //null或没有prodHist
  12. if(cookies==null || prodHist==null){
  13. //直接返回传入的id
  14. return id;
  15. }
  16. //String -> String[] -> Collection :为了方便判断重复id
  17. String[] ids = prodHist.split(",");
  18. Collection coll = Arrays.asList(ids);
  19. // LinkedList 方便地操作(增删改元素)集合
  20. // Collection -> LinkedList
  21. LinkedList list = new LinkedList(coll);
  22. //不超过3个
  23. if(list.size()<3){
  24. //id重复
  25. if(list.contains(id)){
  26. //去除重复id,把传入的id放在最前面
  27. list.remove(id);
  28. list.addFirst(id);
  29. }else{
  30. //直接把传入的id放前面
  31. list.addFirst(id);
  32. }
  33. }else{
  34. //等于3个
  35. //id重复
  36. if(list.contains(id)){
  37. //去除重复id,把传入的id放最前面
  38. list.remove(id);
  39. list.addFirst(id);
  40. }else{
  41. //去最后的id,把传入的id放最前面
  42. list.removeLast();
  43. list.addFirst(id);
  44. }
  45. }
  46. // LinedList -> String
  47. StringBuffer sb = new StringBuffer();
  48. for (Object object : list) {
  49. sb.append(object+",");
  50. }
  51. //去掉最后的逗号
  52. String result = sb.toString();
  53. result = result.substring(0, result.length()-1);

4.把cookie发送到浏览器保存

  1. response.addCookie(cookie);

<项目><day11>查看用户浏览过的商品的更多相关文章

  1. Cookie小案例-----记住浏览过的商品记录

    Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中非经常见.这里处理请求和页面显示都是由servlet实现,主要是为了体现cookie的作用, 实现功能例如以下: 1, ...

  2. Linux查看用户和组命令

    在Linux系统里,我们会经常用Linux查看用户的命令,在这里我们一些命令进行了总结,总共有7个,并做了详细的解释,以便让大家更深入的理解,接下来让我们一起来看看这些命令和具体应用. 一.Linux ...

  3. linux下添加删除,修改,查看用户和用户组

    一.组操作 1.创建组: groupadd test #增加一个test组 2.修改组 groupmod -n test2 test #将test组的名子改成test2 3.删除组 groupdel ...

  4. Hadoop项目实战-用户行为分析之分析与设计

    1.概述 本课程的视频教程地址:<用户行为分析之分析与设计> 下面开始本教程的学习,本教程以用户行为分析案例为基础,带着大家对项目的各个指标做详细的分析,对项目的整体设计做合理的规划,让大 ...

  5. [原]Jenkins(十四)---jenkins示例:admin管理所有项目,新建用户只能看部分项目

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...

  6. 【SSH网上商城项目实战09】添加和更新商品类别功能的实现

    转自:https://blog.csdn.net/eson_15/article/details/51347734 上一节我们做完了查询和删除商品的功能,这一节我们做一下添加和更新商品的功能. 1.  ...

  7. vue中前进刷新、后退缓存用户浏览数据和浏览位置的实践

    vue中前进刷新.后退缓存用户浏览数据和浏览位置的实践 2018年07月07日 11:58:40 大灰狼的小绵羊哥哥 阅读数:4492   vue中,我们所要实现的一个场景就是: 1.搜索页面==&g ...

  8. 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。

    查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...

  9. Python基础-三次用户验证登录购买商品程序

    需求: 一:三次登录锁定 1.用户信息存放于文件中 2.尝试三次都失败,锁定用户 二.购物车功能要求: 要求用户输入总资产,例如:2000显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品 ...

随机推荐

  1. http的请求与响应-----content-type

    content-type 指请求消息头的中请求消息数据的格式 有三种用法 第一种:设置在request header的参数中 js中可以在发送请求前在请求消息头中设置content-typevar x ...

  2. LitePal用法详解

    一.首先我对数据库的操作基于LitePal的,是基于面向对象思想的,所以首先我先讲怎么使用LitePal 1.在build.garde(Module:app)里面的 dependencies{ //添 ...

  3. 掌握Spark机器学习库-07-最小二乘法

    1)最小化残差平方和 2)原理,推导过程 3)例子

  4. Objective-C 里面的类对象复用小结

    OC 提供了单继承 (Inheritance), Category, Extension, Protocol 这几种基本的类与对象层面的复用机制,作一小结. 在这几个机制中,继承提供了纵向的复用,可以 ...

  5. 【Linux】CentOS tar压缩与解压命令大全

    tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...

  6. jvm中的内存溢出与内存泄露

    内存溢出: 就是我们通常遇到的OutOfMemoryError异常,它俗理解就是内存不够,通常在运行大型程序时发生,当程序所需要的内存远远超出了JVM内存所承受大小,就会报出OutOfMemoryEr ...

  7. 转:函数调用的区别:_cdecl以及_stdcall

    函数调用的几个概念:_stdcall,_cdecl.... 1._stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将 ...

  8. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (五) -- 自动 ACK、手动 ACK、NACK

    以 Direct 类型的 交换机和 Queue 的 get 方法为例. producer.php // 连接设置 $conConfig = [ 'host' => '127.0.0.1', 'p ...

  9. 洛谷——P2417 课程

    P2417 课程 裸地匈牙利算法, 贪心的不断匹配,若没匹配,则匹配:反之,判断与之匹配的点能否在找另一个点匹配,若能,抢多这个点与之匹配 时间复杂度$O(n\times m)$ #include&l ...

  10. spring Boot 不认Mapper.xml

    很久以前的笔记了,大约就是用Generatro工具自动生成代码的时候,springboot找不到mapper.xml 之前,由于用mybatis-generator自动生成了entity,dao,ma ...