您的位置:首页 > 其它

利用Cookie,实现动态显示用户曾经浏览过的商品

2015-07-25 20:58 597 查看
1、在DisPlay的servlet中主要做两件事情

1.1显示在出售的商品

1.2显示顾客曾经浏览的商品

DisPlay的代码如下:

package com.baowei.cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Display extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");

//显示所有的图书
PrintWriter  out = resp.getWriter();
out.print("本书店出售的图书如下:<br/>");

Map<String,Book> books = DB.getDBMap();
Set<Entry<String, Book>> set = books.entrySet();
Iterator<Entry<String, Book>>  it = set.iterator();
while(it.hasNext()){
Entry<String, Book> entry = it.next();
Book book = entry.getValue();
out.print("<a href='/HuiHuaTest/BookDetail?id="+book.getId()+"' target='_blank'>"+book.getName()+"</a><br/>");

}

//用户最近看过的图书
out.print("你最近浏览过的图书如下:<br/>");
Cookie cookie = null;
Cookie [] cookies = req.getCookies();
for (int   i = 0; cookies != null &&   i < cookies.length;   i++) {
if(cookies[i].getName().equals("bookHistory")){
cookie = cookies[i];
}
}

if(cookie!=null){
//找到了bookHistory这个cookie
String bookHistory = cookie.getValue();   //4_6_1
String ids[] = bookHistory.split("\\_"); //这样划分更好
for(String id: ids){
Book book = (Book) DB.getDBMap().get(id);
out.print(book.getName() + "<br/>");
}
}

}

}


2. 对于图书的详细介绍的BookDetail的servlet,也是两个功能

2.1 介绍商品的详细信息

2.2 将浏览过的商品的信息加入到Cookie中,并且将Cookie写回浏览器

BookDetail的实现代码如下:

package com.baowei.cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BookDetail extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();

// 1.根据用户带过来的id值,显示相应商品的信息
out.print("您想看的书的详细信息为:<br/>");
String id = request.getParameter("id");
Book book = (Book) DB.getDBMap().get(id);
out.print(book.getId() + "<br/>");
out.print(book.getName() + "<br/>");
out.print(book.getAuthor() + "<br/>");

// 2.以cookie的形式回写该商品的id号给浏览器
String bookHistory = makeCookie(book.getId(), request);
Cookie cookie = new Cookie("bookHistory", bookHistory);
//cookie.setMaxAge(10000); //将Cookie保存在硬盘内
response.addCookie(cookie);

}

// 根据用户原来看过的书,以及现在看的书的id,构建新的cookie值
private String makeCookie(String id, HttpServletRequest request) {

// bookHistory=null    3   bookHistory=3
// bookHistory=2_1_5   3   bookHistory=3_2_1
// bookHistory=2 3     3   bookHistory=3_2
// bookHistory=2_3     3   bookHistory=3_2

// 1.得到用户曾经看过的书
String bookHistory = null;
Cookie cookies[] = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if (cookies[i].getName().equals("bookHistory")) {
bookHistory = cookies[i].getValue();
}
}

if (bookHistory == null) {
bookHistory = id;
return bookHistory;
}

// bookHistory=1_2_5 代表用户曾经看一些书,接着程序要得到用户曾经看过什么书
String ids[] = bookHistory.split("_");
// 为了检测数组中是否包含当前id,我们应该把数据转成集合,并且还要转成链表结构的集合
LinkedList<String> idList = new LinkedList(Arrays.asList(ids));

if (idList.contains(id)) {
idList.remove(id);
} else {
if (idList.size() >= 5) {
idList.removeLast();
}
}
idList.addFirst(id);

StringBuffer sb = new StringBuffer();
for (String lid : idList) { // 1_2_3_
sb.append(lid + "_");
}

return sb.deleteCharAt(sb.length() - 1).toString();
}

}


上面两个程序中用到的Book类和DB类如下:

Book类的代码:

package com.baowei.cookie;

public class Book {

private String id;
private String name;
private String author;

public Book() {

}

public Book(String id, String name, String author) {
this.id = id;
this.name = name;
this.author = author;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}

}


DB类的代码如下:

package com.baowei.cookie;

import java.util.HashMap;
import java.util.Map;

public class DB {

static Map<String,Book>   map = new HashMap<String,Book>();

static {

map.put("1", new Book("1","JavaWeb开发","张保卫") );
map.put("2", new Book("2","操作系统","张保卫") );
map.put("3", new Book("3","Spring开发","张保卫") );
map.put("4", new Book("4","Struts2开发","张保卫") );
map.put("5", new Book("5","Java基础开发","张保卫") );
map.put("6", new Book("6","数据结构","张保卫") );
map.put("7", new Book("7","ACM","张保卫") );
map.put("8", new Book("8","计算机网络","张保卫") );
map.put("9", new Book("9","软件工程","张保卫") );
map.put("10", new Book("10","Android开发","张保卫") );
}

public static Map<String,Book> getDBMap(){
return map;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: