使用Cookie实现商品浏览记录:
方式二:JS方法实现cookie的获取以及写入。
当某一个产品被点击时,触发JS方法。利用JS方法判断一下,此产品是否在浏览记录中。如果不存在,则将产品ID加入到cookie中。否则将此id之前的id全部后移一位,然后将此id移动至第一位。
注意的问题是:通过js方法写入cookie,在java代码中获取cookie的值,需要进行转码
java.net.URLDecoder.decode(listView,"UTF-8");

具体实现如下:
(1). JSP页面:当浏览某一个产品时,调用goView(id)方法,并将产品id作为参数传入。
```
<dt><a href="javascript:goView(${product.ep_id});">.....</a></dt>
```
(2). 在JS文件中,创建goView()方法。该方法的功能是,根据id写入cookie,并将页面跳转到Servlet中。
```
function goView(id) {
    var aid = id;
    var newCookie = "";
        //获得key值为viewRecode的cookie的value值
    var oldCookie = getCookie("viewRecode");
        //如果oldCookie不为null
    if (oldCookie) {
                //将value值按照","分割成数组
        var array = oldCookie.split(",");
                //如果产品id在此数组中,则判断此id是否处于数组中第一个位置。如果不在第一个位置,则让此产品位置之前的id全部后移一位,然后将此id至于第一个位置。否则数组不变。
        if (inArray(array, id)) {
            for ( var a = 0; a < array.length; a++) {
                if (array[a] == id) {
                    if (a != 0) {
                        array[a] = null;
                        for ( var j = a; j >= 0; j--) {
                            array[j] = array[j - 1];
                            array[j - 1] = null;
                        }
                        array[0] = id;
                    }
                }
            }
                        //将上述的数组按","拼接成字符串
            newCookie = array.join(",");
        }
        //如果id不在此数组中,则将此id放在原字符串的最前面,并用","分割。
            else {
            newCookie = id + "," + oldCookie;
        }
    }
    //如果cookie中不存在此key值,则是第一次访问产品,key值为 viewRecode的cookie不存在,则先设定value值为此id。
    else {
        newCookie = id;
    }
        //最后,将cookie写入进去.
    setCookie("viewRecode", newCookie);
        //页面跳转到servlet中.
    location.href = "servlet/ProductServlet?param=productView&pid="+id;
}

//根据Cookie的key值得到对应的value.如果不存在,则返回null.
function getCookie(name)
{
  var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
  if(arr != null) return unescape(arr[2]); return null;
}

//如果str在array数组中,返回true;否则返回false
function inArray(array, str) {
    for(var a in array){
        if(array[a] == str){
            return true;
        }
    }
    return false;
}

//写入cookie
function setCookie(name,value)
{
  var Days = 30;
  var exp  = new Date();
  exp.setTime(exp.getTime() + Days*24*60*60*1000);
  //在最后追加  ;path=/ 非常有必要。否则容易出现   在不同的目录下,调用同一个js方法来存储Cookie,到别的目录取不出或取出的值是不对的这种情况
  document.cookie = name + "="+ escape(value) +";expires="+ exp.toGMTString()+";path=/";
}
```
(3). 在Servlet中通过获取Cookie中的值,得到商品列表,并显示到jsp页面中。
```
public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String param=request.getParameter("param");
        CookieService cookieService = new CookieSerivceImpl();
        Cookie[] cookies = request.getCookies();
        if("listView".equals(param)){
            String pid = request.getParameter("pid");
            List<Product> products = new ArrayList<Product>();
            //获取cookie,读取缓存
            String listView = "";
            if (cookies != null && cookies.length > 0) {
                for (Cookie c : cookies) {
                    if ("listView".equals(c.getName())) {
                        System.out.println(c.toString());
                        listView = c.getValue();
                        break;
                    }
                }
            }
            //这一步非常重要。因为Java接收JS传递值,需要解码。否则","会被解析成 "%2C"
            //解码之后的字符串就是正常的。
            String listView=java.net.URLDecoder.decode(listView,"UTF-8");
            //根据产品id列表获得产品列表
            products = cookieService.onLineProductList(listView);
            request.getSession().setAttribute("products", products);
            request.getRequestDispatcher("/servlet/ProductServlet?param=productView&pid="+pid).forward(request, response);
            out.flush();
            out.close();
    }
}
```
最后在页面中通过EL表达式循环显示出列表即可。
针对以上内容,欢迎指正!
谢谢你来看我!

Cookie实现商品浏览记录--方式二:JS实现的更多相关文章

  1. Cookie实现商品浏览记录--方式一:Java实现

    方式一:Java代码方式实现:此种方式实现思路较为顺畅.难点在于,如何实现将最近浏览的产品显示在最前面:实现方式是借助LinkedList提供的remove()方法,先将此id从列表中移除,然后再借助 ...

  2. 使用Cookie保存商品浏览记录

    数据流程:页面上是商品列表,点击<a href="productServlet">商品名</a> ==>跳转到自定义的servlet中进行处理,先得到 ...

  3. javaWeb 使用cookie显示商品浏览记录

    package de.bvb.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.Date ...

  4. Java遇见HTML——JSP篇之商品浏览记录的实现

    一.项目总体介绍 使用Cookie实现商品浏览记录. 要实现这个程序采取的是Model1(Jsp+JavaBean)架构实现,具体步骤: 首先要有个数据库,商品表,操作数据库的一个类DBHelper类 ...

  5. (JS实现顾客商品浏览记录以及购物车)Cookie的保存与删除

    //JS实现顾客浏览商品的记录以及实现购物车的功能function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.s ...

  6. 使用cookie实现打印浏览记录的功能

    可以用cookie知识来实现打印浏览记录.这里面用到的思路是将浏览记录以字符串的方式保存到cookie中,当浏览记录增加时,再将其转化为数组. $uri=$_SERVER['REQUEST_URI'] ...

  7. 使用cookies查询商品浏览记录

    经历了俩个星期,易买网项目如期完工,现在总结一下如何使用cookies实现浏览商品的历史记录. 第一步:创建商品实体类. 第二步:连接oracle数据库. 第三步:创建商品三层架构. 效果图: 在要显 ...

  8. destoon系统开发-最新利用浏览器的cookie 做历史浏览记录

      注意: 代码 放在要显示的为 (一般放在详情页),注意本教程不入库,直接利用浏览器的 cookie 缓存判断    <!--历史浏览记录 S--> <div class=&quo ...

  9. cookie的应用——浏览记录

    实体类 package entity; public class Product { private String id; private String proName; private String ...

随机推荐

  1. Shell脚本检测文件夹是否已被挂载的方法

    方法1: if grep -qs '/mnt/foo' /proc/mounts; then echo "It's mounted." else echo "It's n ...

  2. Java的Package和Classpath

    Package 在Java中,Package是用来包含一系相关实例的集合.这些相关联的实例包括:类.接口.异常.错误以及枚举. Package主要有一些的几点作用: Package可以处理名字冲突,在 ...

  3. java一行一行写入或读取数据

    原文:http://www.cnblogs.com/linjiqin/archive/2011/03/23/1992250.html 假如E:/phsftp/evdokey目录下有个evdokey_2 ...

  4. C#编程语言与面向对象——委托

    委托(delegate)也可以看成是一种数据类型,可以用于定义变量,但它是一种特殊的数据类型,所定义的变量能接收的数值只能是个函数,更确切地说,委托类型的变量可以接收一个函数的地址. 简单地说 委托变 ...

  5. Sublime Text 3 简体中文汉化包

    Sublime Text 3下载 不用说是上官方下载地址:http://www.sublimetext.com/3 Sublime Text 3 简体中文汉化包使用方法 1.将上面要求下载的subli ...

  6. HDU 1285 确定比赛排名 (数组实现 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    ...

  7. ng-class的用法

    最近在学习angular框架,ng-class是angular框架的一个指令,这里是ng-class指令的官方解释: ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类. ng ...

  8. new date() 在Linux下引起的时间差问题

    java工程部署到Linux时,使用new date()获取的时间出现时间差,通过查阅资料,发现有可能是服务器时间设置问题,JVM问题,jdk问题: 1.服务器时间设置问题: 正确的时间显示 有 CS ...

  9. 计算机网络自学之路------IP协议(1)

    1)TCP/IP模型与OSI对应 2)TCP/IP集每层主要协议 3)IP协议 4)IP地址的命名与使用 5)子网与子网掩码 1)TCP/IP模型与OSI对应关系 我们看到,TCP/IP只有四层与OS ...

  10. 如何用selenium webdriver 捕获js error

    ### 问题 捕捉页面上js error ### 解决办法 从Selenium webdriver log 中解析 # -*- coding:utf8 -*- import unittest from ...