jsp中使用session实现一个简单的购物车案例

1、需求分析

相信大家都有网上购物的经历,当用户选定某件商品时,只要选择“购买”,便可将商品添加到购物车中,购物车中包含了用户所有要购买的商品。接下来,以购买图书为例,使用Session模拟实现购物车功能。 在使用Session实现购物车功能时,整个程序定义了五个类:

Book.java:

该类用于封装图书的信息,其中定义了id和name属性,分别用来表示书的编号和名称。 

BookDB.java:

该类用于模拟保存所有图书的数据库。该类在实现时,通过Map集合存储了5个不同的Book对象,提供了获取指定图书和所有图书的相关方法

ListBookServlet.java

该类用于显示所有可购买图书的列表,通过点击“购买”链接,便可将指定的图书添加到购物车中

PurchaseServlet.java

该类有两个功能,一是将用户购买的图书信息保存到Session对象中,二是在用户购买图书结束后,将页面重定向到用户已经购买的图书列表

CartServlet.java

该类用于展示用户已经购买的图书列表。该类在实现时,需要通过getSession()获取到所有的Session对象,然后判断用户是否已经购买图书,如果已经购买过,则显示购买的图书列表,否则在页面显示友好的提示“对不起!您还没有购买任何商品”

作业

以上的类就是原案例

对教材购物车案例(p151-p157)进行修改 ,在原案例基础上,增加要求:

1、当购买某本书后,再次访问图书列表,不能显示已经购买了的图书

2、购物车中的图书,增加取消订单功能,点击“取消订单”后,在购物车中删除已经购买的图书

解决方案:

1、第一个问题我们只需要在BookDB.java类中添加一个deleteBook(String id)方法,然后再PurchaseServlet.java类中获取到ListBookServlet.java中传过来的id进行删除

2、第二个问题也简单创建一个新的类DeleteCarServlet里面主要处理删除list(就是购物车里的图书)集合的图书

改进

这个案例要改进的地方就是,你删除购物车里的东西后,应该把他反回展示页面,本人有点懒没有写希望各位大佬可以再评论区给出解决方法,谢谢大佬们了,接来上个效果图看看

 
2、效果图

展示的图书有

点击前两本图书到购物车中

再回去看展示页面已没有那两本了

再购物车删除第一本书

123!上代码

3、java代码
Book
package com.gued.w4.anli52;

public class Book {
    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.gued.w4.anli52;

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

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

  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();
    }
    //指定获得的id获得图书
    public static Book getBook(String id){
      return books.get(id);
    }

    //删除图书
    public static void deleteBook(String id){
      books.remove(id);
    }



}
ListBookServlet
package com.gued.w4.anli52;

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 java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

@WebServlet(urlPatterns = "/book")
public class ListBookServlet extends HttpServlet {
    private static final long serialVersionUID=1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        Collection<Book> books = BookDB.getAll();
         writer.write("本网站提供的图书有:</br>");
         for (Book book:books){
             String url="/test01/PurchaseServlet?id="+book.getId();
             writer.write(book.getName()+"<a href= '"+url +"'>点击购买</a></br>");
         }
    }
}

PurchaseServlet
package com.gued.w4.anli52;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(urlPatterns = "/PurchaseServlet")
public class PurchaseServlet extends HttpServlet {
    private static final long serialVersionUID=1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取用户买的商品
        String id = req.getParameter("id");
        if (id == null) {
            //没买就重定向回去
            String url="/test01/book";
            resp.sendRedirect(url);
            return;
        }
        Book book = BookDB.getBook(id);
        //创建或者获取用户的Session对象
        HttpSession session = req.getSession();
        //从Session对象获取用户购物车
        List<Book> cart =(List) session.getAttribute("cart");
        if (cart==null){
            //首次购买,为用户创建一个购物车(list集合模拟购物车)
            cart = new ArrayList<Book>();
            //将购物车存入Session对象
            session.setAttribute("cart",cart);
        }
        //将商品放入购物车
        cart.add(book);
        //创建Cookie存放Session的标记号
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setMaxAge(60*30);
        cookie.setPath("/test01");
        resp.addCookie(cookie);
        //重定向到购物车页面
        resp.sendRedirect("/test01/CarServlet");
        //删除读书列表ListBookServlet类的书
        BookDB.deleteBook(id);



    }
}

CartServlet
package com.gued.w4.anli52;

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;

@WebServlet(urlPatterns = "/CarServlet")
public class CarServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        //变量cart引用用户的购物车
        List<Book> cart=null;
        //变量pruFlag标记用户是否买过商品
        boolean purFlag =true;
        HttpSession session = req.getSession();
        //如果session为null,purFlag置为false
        if (session==null){
            purFlag=false;
        }else {
            //获取用户购物车
            cart =(List) session.getAttribute("cart");
            //如果用的购物车为null,purFlag置为false
            if(cart==null){
                purFlag=false;
            }
        }
        //如果purFlag为false,表明用户没有购买图书 重定向到ListServlet页面
        if (!purFlag){
            writer.write("对不起!您还没有购买任何商品!</br>");
        }else {
            //否则显示用户购买图书信息
            writer.write("您购买的图书有:</br>");
            double price=0;
            int i=0;
            for (Book book:cart){

                String url="/test01/DeleteCarServlet?id="+i;
                i++;
                writer.write(book.getName()+"<a href='"+url+"'>点击删除</a></br>");


            }

        }

    }
}
DeleteCarServlet
package com.gued.w4.anli52;

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.util.List;

@WebServlet(urlPatterns = "/DeleteCarServlet")
public class DeleteCarServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        System.out.println(id);
        HttpSession session = req.getSession();
        List<Book>cart= (List<Book>) session.getAttribute("cart");
        cart.remove(Integer.parseInt(id));
        resp.sendRedirect("/test01/CarServlet");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/515648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode开发ESP32问题记录

vscode 开发ESP32问题记录 1. 解决vscode中的波浪线警告 1. 解决vscode中的波浪线警告 参考链接&#xff1a;https://blog.csdn.net/fucingman/article/details/134404485 首先可以通过vscode 中的IDF插件生成模板工程&#xff0c;这样会自动创建.vscode文件夹中的一些json配…

illustrator编组后透明图形也能挡住后面的图形的物体

今日学习使用illustrator&#xff0c;使用3D中的突出和斜角生成了一个圆柱体之后&#xff0c;扩展图形&#xff0c;修改之后发现一个奇怪的问题&#xff0c;编组中的透明物体挡住了后面的图形&#xff08;后面的图形是有颜色的&#xff09; 后面发现&#xff0c;原来是扩展生成…

Redis 事务 与 管道

redis事务 谈到事务大家可能就会想起mysql中的事务 注意这里的事务不是指的是事务的四大特性acid 持久性 原子性 隔离性 一致性 事务的概念就是 一组命令,串行化执行而不被打断 这里redis的事务和mysql的事务就不太一样 传统关系型数据库的事务主要强调的是一个没有执行完成就…

如何查询网站是否被搜索引擎收录

怎么看网站有没有被百度收录 对于网站所有者来说&#xff0c;了解自己的网站是否被百度搜索引擎收录是非常重要的。只有被收录&#xff0c;网站才能在百度搜索结果中展现&#xff0c;从而获取流量和曝光。下面介绍几种方法&#xff0c;让您快速了解自己的网站是否被百度收录。…

ctf_show笔记篇(web入门---SSRF)

ssrf简介 ssrf产生原理&#xff1a; 服务端存在网络请求功能/函数&#xff0c;例如&#xff1a;file_get_contens()这一类类似于curl这种函数传入的参数用户是可控的没有对用户输入做过滤导致的ssrf漏洞 ssrf利用: 用于探测内网服务以及端口探针存活主机以及开放服务探针是否存…

Java多线程三种实现方式

一、继承Thread方法 public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 10; i) {System.out.println(getName() "输出内容");}}public static void main(String[] args) {MyThread thread1 new MyThread();MyThread thread…

2024年清明节安装matlab 2024a

下载安装离线支持包SupportSoftwareDownloader_R2024a_win64&#xff0c;地址https://ww2.mathworks.cn/support/install/support-software-downloader.html&#xff0c;运行软件&#xff08;自解压运行&#xff09;&#xff0c;登录账号&#xff08;需要提前在官网注册&#x…

Java数据结构-队列

目录 1. 队列概念2. 模拟实现队列2.1 链式队列2.2 循环队列 3. 双端队列4. 队列的应用4.1 用队列实现栈4.2 用栈实现队列 1. 队列概念 队列是一种只能在一端进行插入数据操作&#xff0c;另一端进行删除数据操作的数据结构&#xff0c;插入数据的叫队尾&#xff0c;删除数据的…

Vulnhub:BOSSPLAYERSCTF: 1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap 命令执行漏洞 反弹shell 提权 系统信息收集 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd:9…

我与C++的爱恋:内联函数,auto

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 一、内联函数 1.内联函数的概念 内联函数目的是减少函数调用的开销&#xff0c;通过将每个调用点将函数展开来实现。这种方法仅适用于那些函数体小、调用频繁的函数。 …

探索大数据时代下与云计算技术融合:实现企业级数据处理与分析的灵活性和效率性

引言&#xff1a; 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 随着信息时代的到来&#xff0c;数据量的爆炸性增长已成为一种常态。企业、政府、科研机构等各个领域都面临着海量数据的收集、存储、处理和分析的挑战。在…

2024年福建三支一扶报名指南—照片<100kb

2024年福建三支一扶报名指南—照片<100kb

大日志精选案例四:某省级大数据集团日志审计优化实战解析

“在集团日常运营中&#xff0c;数据安全始终是我们关注的重点。过去&#xff0c;数据量大、处理速度慢&#xff0c;导致日志数据难以迅速获取和分析&#xff0c;影响业务决策。但自从引入聚铭大日志解决方案后&#xff0c;系统日志和用户行为数据都得到了高效处理与存储。该方…

C易错注意之分支循环,悬空else,短路表达式,static

接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 前言&#xff1a; c语言中一些关于分支循环中continue常混淆&#xff0c;悬空esle问题&#xff0c;短路表达式&#xff0c;static ,extern在使用时稍不注意就会出错的点,接下来我们将介绍…

数据结构:排序

排序的概念 1.概念 就我当前所认识的排序来说。排序是把一串相同类型的数据&#xff0c;按照升序或者降序排列起来的操作。 以下介绍的排序大多可以排列不限于整型和文件&#xff0c;但也有一些算法有较明显的局限性。 2.稳定性 如果在排列之前&#xff0c;一组数据中&…

Airtable、pyairtable

文章目录 一、关于 AirtableAirtable 公司历史诞生发展 产品方向产品层级国内模仿者竞争对手关于 API Key价格 二、关于 pyairtable安装快速使用 一、关于 Airtable 官网&#xff1a;https://www.airtable.comgithub : https://github.com/AirtableAirtable AI &#xff1a; h…

搜索最短路/最小步数问题

文章目录 搜索专题之最短路/最小步数迷宫问题【题目描述】【输入样例】【输出样例】【AC代码】 武士风度的牛【题目描述】【AC代码】 抓住那头牛【题目描述】【AC代码】 魔板【题目描述】【AC代码】 搜索专题之最短路/最小步数 迷宫问题 【题目描述】 【输入样例】 5 0 1 0 …

【Clang+LLVM+honggfuzz学习】(一)LLVM简介、安装和第一个Hello Pass

本文结构&#xff0c;PS:根据需要选择观看哦 1. 前言参考 2.简介传统编译器架构LLVM架构 3. LLVM安装版本准备官网源码下载git下载安装过程 4. 写一个LLVM Pass旧Hello Pass实现&#xff08;legacy PM version&#xff09;新Hello Pass实现&#xff08;Using the New Pass Mana…

GPT4不限制使用次数了!GPT5即将推出了!

今天登录到ChatGPT Plus账户&#xff0c;出现了如下提示&#xff1a; 已经没有了数量和时间限制的提示。 更改前&#xff1a;每 3 小时限制 40 次&#xff08;团队计划为 100 次&#xff09;&#xff1b;更改后&#xff1a;可能会应用使用限制。 GPT-4放开限制 身边订阅了Ch…

【C++STL详解 —— vector的介绍及使用】

【CSTL详解 —— vector的介绍及使用】 vector的介绍vector的使用vector的构造vector iterator 的使用begin和endrbegin和rend vector 空间增长问题size和capacityreserve和resizeempty vector 增删查改push_back和pop_backinsert和erasefindswap元素访问 vector 迭代器失效问题…