用session实现购物车
增加要求:
- 当购买某本书后,再次访问图书列表,不能显示已经购买了的图书
- 购物车中的图书,增加取消订单功能,点击“取消订单”后,在购物车中删除已经购买的图书
Book 图书对象
package com.gd.servlet.buy;
import java.io.Serializable;
/**
* @author LFXIANG
* description TODO
* @title Book
* date 2024/5/4 13:41
*/
public class Book implements Serializable {
private String id;
private String name;
public Book() {
}
public Book(String id, String name) {
this.id = id;
this.name = name;
}
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;
}
}
BookDB 获取书库图书
package com.gd.servlet.buy;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author LFXIANG
* description TODO
* @title BookDB
* date 2024/5/4 13:41
*/
public class BookDB {
private static Map<String,Book> books=new LinkedHashMap<>();
static {
books.put("1",new Book("1","javaweb开发"));
books.put("2",new Book("2","jdbc开发"));
books.put("3",new Book("3","java基础"));
books.put("4",new Book("4","struts开发"));
books.put("5",new Book("5","spring开发"));
}
public static Collection<Book> getAll(){
return books.values();
}
public static Book getBook(String id){
return books.get(id);
}
}
CartServlet 购物车展示
package com.gd.servlet.buy;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
/**
* @author LFXIANG
* description TODO
* @title CartServlet
* date 2024/5/4 13:42
*/
@WebServlet("/CartServlet")
public class CartServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
List<String> cart=null;
boolean purFlag=true;
// 取与当前请求关联的HttpSession对象,如果存在则返回该对象,否则返回null。
HttpSession session = req.getSession(false);
if (session==null){
purFlag=false;
}else {
cart = (List)session.getAttribute("cart");
if (cart==null){
purFlag=false;
}
}
if (purFlag){
writer.write("购买的书籍<hr>");
for (int i=0;i<cart.size();i++){
String url="/web1/DeleteBookServlet?id="+i;
writer.write(cart.get(i)+"<a href='"+url+"'>取消订单</a><br>");
}
}else {
writer.write("您没有购买任何书籍,1秒后跳转");
resp.setHeader("Refresh","1;url=/web1/ListBookServlet");
}
if (cart.size()==0){
writer.write("您没有购买任何书籍,1秒后跳转");
resp.setHeader("Refresh","1;url=/web1/ListBookServlet");
}
}
}
DeleteBookServlet 图书删除
package com.gd.servlet.buy;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
/**
* @author LFXIANG
* description TODO
* @title DeleteBookServlet
* date 2024/5/4 15:13
*/
@WebServlet("/DeleteBookServlet")
public class DeleteBookServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
System.out.println("id = " + id);
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (id!=null){
HttpSession session = req.getSession(false);
List<Book> cart =(List) session.getAttribute("cart");
int i = Integer.parseInt(id);
cart.remove(i);
writer.write("删除成功,1秒后跳转");
resp.setHeader("Refresh","0.5;url=/web1/CartServlet");
}else {
writer.write("删除失败,1秒后跳转");
resp.setHeader("Refresh","0.5;url=/web1/CartServlet");
}
}
}
ListBookServlet 图书展示
package com.gd.servlet.buy;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author LFXIANG
* description TODO
* @title ListBookServlet
* date 2024/5/4 13:42
*/
@WebServlet("/ListBookServlet")
public class ListBookServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
Collection<Book> books = BookDB.getAll();
PrintWriter writer = resp.getWriter();
writer.write("本站提供的图书有:<hr>");
HttpSession session = req.getSession();
List<String> cart = (List)session.getAttribute("cart");
// (在页面点击返回按钮重新刷新页面)在服务器端,你可以在响应中设置HTTP头,强制浏览器不使用缓存,每次访问都必须从服务器获取最新内容。
resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
resp.setHeader("Pragma", "no-cache");
resp.setDateHeader("Expires", 0);
if (cart==null){
cart=new ArrayList<>();
session.setAttribute("cart",cart);
}
for(Book book:books){
if (cart.contains(book.getName())) continue;
String url="/web1/PurchaseServlet?id="+book.getId();
writer.write(book.getName()+"<a href='"+url+"'>点击购买</a><br>");
}
if (cart.size()==books.size()){
writer.write("书库已空");
}
}
}
PurchaseServlet 添加图书
package com.gd.servlet.buy;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
/**
* @author LFXIANG
* description TODO
* @title PurchaseServlet
* date 2024/5/4 13:42
*/
@WebServlet("/PurchaseServlet")
public class PurchaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
System.out.println("id = " + id);
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (id!=null){
Book book = BookDB.getBook(id);
HttpSession session = req.getSession();
List<String> cart = (List) session.getAttribute("cart");
if (cart==null){
cart = new ArrayList<>();
session.setAttribute("cart",cart);
}
cart.add(book.getName());
// 将JSESSIONID存入Cookie 重新访问页面 可以保持相同会话
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*30);
cookie.setPath("web1");
resp.addCookie(cookie);
resp.sendRedirect("/web1/CartServlet");
}else {
writer.write("该书无库存,1秒后跳转");
resp.setHeader("Refresh","1;url=/web1/ListBookServlet");
}
}
}