Cookie实现商品浏览记录--方式二:JS实现
使用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实现的更多相关文章
- Cookie实现商品浏览记录--方式一:Java实现
方式一:Java代码方式实现:此种方式实现思路较为顺畅.难点在于,如何实现将最近浏览的产品显示在最前面:实现方式是借助LinkedList提供的remove()方法,先将此id从列表中移除,然后再借助 ...
- 使用Cookie保存商品浏览记录
数据流程:页面上是商品列表,点击<a href="productServlet">商品名</a> ==>跳转到自定义的servlet中进行处理,先得到 ...
- javaWeb 使用cookie显示商品浏览记录
package de.bvb.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.Date ...
- Java遇见HTML——JSP篇之商品浏览记录的实现
一.项目总体介绍 使用Cookie实现商品浏览记录. 要实现这个程序采取的是Model1(Jsp+JavaBean)架构实现,具体步骤: 首先要有个数据库,商品表,操作数据库的一个类DBHelper类 ...
- (JS实现顾客商品浏览记录以及购物车)Cookie的保存与删除
//JS实现顾客浏览商品的记录以及实现购物车的功能function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.s ...
- 使用cookie实现打印浏览记录的功能
可以用cookie知识来实现打印浏览记录.这里面用到的思路是将浏览记录以字符串的方式保存到cookie中,当浏览记录增加时,再将其转化为数组. $uri=$_SERVER['REQUEST_URI'] ...
- 使用cookies查询商品浏览记录
经历了俩个星期,易买网项目如期完工,现在总结一下如何使用cookies实现浏览商品的历史记录. 第一步:创建商品实体类. 第二步:连接oracle数据库. 第三步:创建商品三层架构. 效果图: 在要显 ...
- destoon系统开发-最新利用浏览器的cookie 做历史浏览记录
注意: 代码 放在要显示的为 (一般放在详情页),注意本教程不入库,直接利用浏览器的 cookie 缓存判断 <!--历史浏览记录 S--> <div class=&quo ...
- cookie的应用——浏览记录
实体类 package entity; public class Product { private String id; private String proName; private String ...
随机推荐
- 苹果Home键恢复(无工具篇)
无工具法: 弹指神功.用手指轻轻弹Home,过了一阵子后可能会出现白色污垢,其后再重覆“弹”,直至正常为止.(亲测可用) 软件调试法.首先,打开任意一款应用程序,按住电源开关几秒钟,直到屏幕出现滑动关 ...
- 转载《SimpleAdapter的参数说明》
SimpleAdapter的参数说明 第一个参数 表示访问整个android应用程序接口,基本上所有的组件都需要 第二个参数表示生成一个Map(String ,Object)列表选项 第三个参数表示界 ...
- Ext.Window 的常见属性
Ext.Window 的常见属性: plain:true,(默认不是) resizable:false,(是否可以改变大小,默认可以) maximizable:true,(是否增加最 ...
- BHP Net Tool
#导入需要用到的包 import sys import getopt import threading import socket import subprocess #定义全局变量 listen = ...
- 链表c++实现一
#include <iostream>using namespace std; typedef char nodeEntry; struct Node{ //数据成员 nodeEntry ...
- mouseover事件与mouseenter事件的区别
不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件.对应mouseout 只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件.对应mouseleave 被触发的 M ...
- 解释器模式(Interpreter Pattern)
定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpre ...
- php7 编译安装 apache
http://blog.csdn.net/21aspnet/article/details/47708763 根据此教程的步骤但是碰到了若干问题 1. 执行./configure的时候报错 大部分可 ...
- ubuntu下安装rpm 文件
正想着如何把rpm package 安装到ubuntu上, 发现了这篇文章,转载一下 Ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb. sudo a ...
- 从css谈模块化
模块化是现今我们随处都可以听到的一个名词,什么是模块化?为什么我们需要模块化?这是本系列文章我们要弄明白的一个问题.我们也借这部分内容,顺带回顾一下前端的发展历程. 说实话,模块化这个主题有点大,我一 ...