使用集合保存“最近浏览商品” 完美实现商品显示顺序 但性能不高
自己做项目时的代码记录 方式比较笨拙 但可以完成需要的效果【“最近浏览”的商品信息 时刻都在最近浏览界面窗口的第一位置】
//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个商品对象
查看更多随笔:http://www.cnblogs.com/Joke-Jay/