zoukankan      html  css  js  c++  java
  • 使用集合保存“最近浏览商品” 完美实现商品显示顺序 但性能不高

    自己做项目时的代码记录  方式比较笨拙  但可以完成需要的效果【“最近浏览”的商品信息  时刻都在最近浏览界面窗口的第一位置】

        //3.根据商品id 查询一件商品  同时把当前商品设计进集合中  用来完成浏览记录功能
        public String productDetail()throws Exception{
            //传递的是商品对应的id
            Product product=this.productService.productDetail(model);
            ActionContext.getContext().put("product",product);
            
            //------------------------------
            //最近浏览商品的功能  使用session保存用户点击的商品  模拟‘浏览记录’功能
            //1.使用LinkedHashMap  非线程安全  有序
            Map<String,Product> history=(Map<String, Product>) ServletActionContext.getRequest().getSession().getAttribute("history");
            if(history==null){
                history=new LinkedHashMap<String,Product>();
            }
            //判断集合中是否存在当前浏览的商品对象
            if(history.containsKey(model.getEp_id())){
                //把对象移除  然后再下面重新添加
                history.remove(model.getEp_id());
            }
            history.put(model.getEp_id(),product);
            //把数据保存在session域中  在整个会话期间都有效
            ServletActionContext.getRequest().getSession().setAttribute("history", history);
            //以上代码  保证  最后的对象  都是刚刚浏览过的  但是输出显示的时候  是从第一个开始
            //(页面显示顺序:最先浏览的永远在第一个  最近浏览的永远在最后一个)   所以要对集合进行逆序设计
            //------------------------------
            
            //对对象集合进行倒序设计
            Set<String> keySet = history.keySet();
            //转为ArrayList集合
            List<String> list=new ArrayList<String>();
            list.addAll(keySet);
            //然后倒序取出list集合中的数据(key)
            int t=0;//规定页面上显示的浏览历史  最多存在5个
            List<String> listfive=new ArrayList<String>();
            for(int i=list.size()-1;i>=0;i--){
                //找出最后边的key  找出5个
                //System.out.println(list.get(i));
                if(t<5){
                    if(list.get(i)!=null){
                        listfive.add(list.get(i));
                    }
                }else{
                    break;
                }
                t++;
            }
            //以上代码  保证:list集合中存放的都是逆序之后的数据   而且最多取5条 
            //即从最后往前取5个  set集合中的最后一个key永远放在list中的第一个位置(下标0)
            
            //定义新的linkedHashMap 存放的数据都是最进点击过的商品
            Map<String,Product> MP=new LinkedHashMap<String,Product>();
            for(int i=0;i<listfive.size();i++){
                if(listfive.get(i)!=null){
                    MP.put(listfive.get(i),history.get(listfive.get(i)));
                }
            }
            //以上程序虽然完成了功能  但是性能不高
            ServletActionContext.getRequest().getSession().setAttribute("MP", MP);
            //页面中使用MP中保存的对象进行显示  (页面显示顺序:最先浏览的永远在最后一个  最近浏览的永远在第一个) 
            
            return "productDetail";
        }

     ------------------------------------

    上面的方法是在集合中找到了最后的5个对象  我们也可以不在集合中设计页面显示对象的个数  而是把所有的商品对象都逆序  之后  返回给页面  在页面上控制输出的个数即可

    //3.根据商品id 查询一件商品  同时把当前商品设计进集合中  用来完成浏览记录功能
        public String productDetail()throws Exception{
            //传递的是商品对应的id
            Product product=this.productService.productDetail(model);
            ActionContext.getContext().put("product",product);
            
            //------------------------------
            //最近浏览商品的功能  使用session保存用户点击的商品  模拟‘浏览记录’功能
            //1.使用LinkedHashMap  非线程安全  有序
            Map<String,Product> history=(Map<String, Product>) ServletActionContext.getRequest().getSession().getAttribute("history");
            if(history==null){
                history=new LinkedHashMap<String,Product>();
            }
            //判断集合中是否存在当前浏览的商品对象
            if(history.containsKey(model.getEp_id())){
                //把对象移除  然后再下面重新添加
                history.remove(model.getEp_id());
            }
            history.put(model.getEp_id(),product);
            //把数据保存在session域中  在整个会话期间都有效
            ServletActionContext.getRequest().getSession().setAttribute("history", history);
            //以上代码  保证  最后的对象  都是刚刚浏览过的  但是输出显示的时候  是从第一个开始
            //(页面显示顺序:最先浏览的永远在第一个  最近浏览的永远在最后一个)   所以要对集合进行逆序设计
            //------------------------------
            
            //对对象集合进行倒序设计
            Set<String> keySet = history.keySet();
            //转为ArrayList集合
            List<String> list=new ArrayList<String>();
            list.addAll(keySet);
            //然后倒序取出list集合中的数据(key)
            //int t=0;//规定页面上显示的浏览历史  最多存在5个
            List<String> listfive=new ArrayList<String>();
            for(int i=list.size()-1;i>=0;i--){
                /*
                //找出最后边的key  找出5个
                //System.out.println(list.get(i));
                if(t<5){
                    if(list.get(i)!=null){
                        listfive.add(list.get(i));
                    }
                }else{
                    break;
                }
                t++;
                */
                //不在这里进行个数设计  这里全部key倒序设置进集合中   然后 在页面进行个数设计
                listfive.add(list.get(i));
            }
            //以上代码  保证:list集合中存放的都是逆序之后的数据   而且最多取5条 
            //即从最后往前取5个  set集合中的最后一个key永远放在list中的第一个位置(下标0)
            
            //定义新的linkedHashMap 存放的数据都是最进点击过的商品
            Map<String,Product> MP=new LinkedHashMap<String,Product>();
            for(int i=0;i<listfive.size();i++){
                if(listfive.get(i)!=null){
                    MP.put(listfive.get(i),history.get(listfive.get(i)));
                }
            }
            //以上程序虽然完成了功能  但是性能不高
            ServletActionContext.getRequest().getSession().setAttribute("MP", MP);
            //页面中使用MP中保存的对象进行显示  (页面显示顺序:最先浏览的永远在最后一个  最近浏览的永远在第一个) 
            
            return "productDetail";
        }

    页面:

    这样就只输出集合中的第0个(下标)到第4个元素(下标为4)  就控制了显示的个数为5个商品对象

  • 相关阅读:
    TensorFlow 官方文档中文版 --技术文档
    借助离散数学解决“哈弗大学智商测试”一题 --编程算法
    Python3文件操作1 --Python3
    ThinkPHP5.0完全开发手册 --技术文档
    JSON和Serialize数据格式的对比
    JSON格式简介
    Github的简易操作
    Python3之JSON数据解析实例:新闻头条 --Python3
    MySql常用函数 --MySql
    Git简易教程
  • 原文地址:https://www.cnblogs.com/Joke-Jay/p/7604372.html
Copyright © 2011-2022 走看看