cookie的使用,并用cookie实现购物车功能

大型网站一般都用cookie,因为session的会在客户端生成,是服务器压力增大,下面我来介绍一下,cookie的原理和使用

原理如图


cookie的使用,并用cookie实现购物车功能_第1张图片

使用方法:如如下代码demo1生成cookie,demo2获得cookie

demo1:

import java.io.IOException;
import java.util.Date;

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 CookieDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Cookie cookie = new Cookie("lastTime", new Date().toLocaleString());
		cookie.setMaxAge(60 * 60);
		cookie.setValue(new Date().toLocaleString());
		cookie.setPath(request.getContextPath());// 设置的是有效路劲,如果没有设置,那就表示当前路径
		System.out.println(request.getContextPath());
		response.addCookie(cookie);

	}

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

}

 demo2:

 

package com.itcast.servlet;

import java.io.IOException;

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 CookieDemo2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Cookie[] cookie = request.getCookies();
		for (int i = 0; cookie != null && i < cookie.length; i++) {
			if ("lastTime".equals(cookie[i].getName())) {
				response.getWriter().write(cookie[i].getValue());
				System.out.println(cookie[i].getValue());
			} else if (cookie == null) {
				response.getWriter().write("您是首次访问本站");
				Cookie[] cookies = request.getCookies();
			}
		}

	}

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

}
cookie普遍应用于购物车,是一个减缓服务器压力的好技术,下面我来用4个类为大家模拟一下买书购物功能:

 

 1.书类javabean

 

package cn.itcast.cookie.javabean;

public class Book {
	private String id;
	private String name;
	private String author;
	private String price;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Book() {
		super();
		// TODO Auto-generated constructor stub
	}

	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;
	}

	public String getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = price;
	}

	public Book(String id, String name, String author, String price) {
		super();
		this.id = id;
		this.name = name;
		this.author = author;
		this.price = price;
	}

}

 2.书店的模拟类,一般用数据库,但是这里我们模拟一些数据:package cn.itcast.cookie.javabean;

 

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

public class DB {
	private static Map<String, Book> books = new LinkedHashMap<String, Book>();

	public static Collection<Book> getAll() {
		return books.values();
	}

	static {
		books.put("1", new Book("1", "php实战", "老路", "hello"));
		books.put("2", new Book("2", "android开发", "老徐", "110"));
		books.put("3", new Book("3", "jdbc开发", "老黎", "106"));
		books.put("4", new Book("4", "c++算法", "老方", "107"));
	}

	public static Book Findbook(String bookid) {
		return books.get(bookid);
	}
}

 3.这个类,有两个功能,第一个,显示全部的书,第二个,在你买书后,刷新能显示你曾经浏览过的书

 

package com.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

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

import cn.itcast.cookie.javabean.Book;
import cn.itcast.cookie.javabean.DB;

public class ListBookServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		request.getParameter("id");
		// 获得商品
		Collection<Book> books = DB.getAll();
		// 显示商品
		for (Book book : books) {
			out.write("<a href='/day07_cookie/servlet/ShowBookInfo?id="
					+ book.getId() + "'>" + book.getName() + "</a><br>");

		}
		String bookHistory = null;
		Cookie[] cookies = request.getCookies();
		for (int i = 0; cookies != null && i < cookies.length; i++) {
			if ("BookHistory".equals(cookies[i].getName())) {
				bookHistory = cookies[i].getValue();
				break;
			}
		}

		out.write("您浏览过的商品:</br>");

		String[] strs = bookHistory.split("\\-");// 将获得的字符串拆分,获取里面的id,用来找到每一本书
		for (int j = 0; j < strs.length; j++) {
			System.out.println("strs[i]=" + strs[j]);
			Book book = DB.Findbook(strs[j]);
			out.write(book.getName() + "</br>");
		}

	}

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

}

 

 4.显示你购买商品的详细信息,并将你所有的购买的商品的id,拼接成一个1-2-3格式的字符串

 

package com.itcast.servlet;

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

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

import cn.itcast.cookie.javabean.Book;
import cn.itcast.cookie.javabean.DB;

public class ShowBookInfo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String id = request.getParameter("id");
		Book book = DB.Findbook(id);
		String BookHistory = makeBookHistory(request, book.getId());
		response.getWriter().write(
				"" + book.getName() + "</br>" + book.getAuthor() + "</br>"
						+ book.getPrice() + "</br>");
		Cookie cookie = new Cookie("BookHistory", BookHistory);
		response.addCookie(cookie);

	}

	private String makeBookHistory(HttpServletRequest request, String id) {
		Cookie[] cookies = request.getCookies();
		String BookHistory = null;
		for (int i = 0; cookies != null && i < cookies.length; i++) {
			if ("BookHistory".equals(cookies[i].getName())) {

				BookHistory = cookies[i].getValue();
				break;
			}
		}
		if (BookHistory == null) {
			return id;
		}
		String[] strs = BookHistory.split("-");//如果前面获得的id不是null,将返回来的字符串拆分,获得所有的id,存到String[]中
		List<String> list = Arrays.asList(strs);
		LinkedList<String> ids = new LinkedList<String>();//添加到LinkedList,是为了能按照先后顺序显示
		ids.addAll(list);

		if (ids.contains(id)) {// 如果有,移除,并加到第一个
			ids.remove(id);//
			ids.addFirst(id);

		}
		if (ids.size() == 3) {//最多显示3个浏览过的商品,如果超过,就删除最后一个
			ids.remove(ids.size() - 1);

		} else {
			ids.addFirst(id);
		}
		StringBuffer sb = new StringBuffer();
		for (String str : ids) {//将所有的id,合并成一个1-2-3的字符串,因为一次只能储存一个数据,在cookie中,所以用这个来储存多个id
			sb.append(str + "-");

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

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

}
 

 

你可能感兴趣的:(javaee,cookie,购物车)