我们需要一个用来封装商品信息的商品类

package Semester_3.ShoppingCart;/*
* 定义用来被购买的蛋糕类*/
public class cookie {String name,ID;public cookie(){}public cookie(String ID,String name){this.name = name;this.ID = ID;}public void setName(String name){this.name = name;}public String getName(){return this.name;}public void setID(String ID){this.ID = ID;}public String getID(){return this.ID;}
}

一个用来模拟数据库的数据库模拟类

package Semester_3.ShoppingCart;import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/*
* 创建一个模拟数据库的类*/
public class CookDB {private static Map<String,cookie> cooks = new LinkedHashMap<>();//一个只能在内部调用的数组,用来存放蛋糕static{//静态代码块,当对象被创建的时候将自动运行,作用是添加数据cooks.put("1",new cookie("1","A类蛋糕"));cooks.put("2",new cookie("2","B类蛋糕"));cooks.put("3",new cookie("3","C类蛋糕"));cooks.put("4",new cookie("4","D类蛋糕"));cooks.put("5",new cookie("5","E类蛋糕"));}//返回所有蛋糕的方法public static Collection<cookie> getAll(){return cooks.values();}//返回按照ID定位蛋糕的方法public static cookie getID(String ID){return cooks.get(ID);}
}

一个用来获取和转发Cookie对象的Servlet类

package Semester_3.ShoppingCart;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@WebServlet(name = "PurchaseServlet", value = "/PurchaseServlet")
public class PurchaseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        首先获取有没有属性名为id的属性,并获取它的值String ID = request.getParameter("id");
//        如果id值是空的,表示没有任何的数据传入,将重定向到展示数据的界面重新进行选择,此为边界条件if(ID==null){String url = "ListCakeServlet";
//            在这里完成重定向的动作response.sendRedirect(url);return;}
//        获取数据库模拟类中的ID对应的蛋糕名称cookie c =CookDB.getID(ID);
//        创建Session对象用来传递会话消息HttpSession hs =request.getSession();
//        获取之前的会话消息,如果有就直接添加,如果没有就创建一个对象再进行添加动作List<cookie> ls = (List)hs.getAttribute("cart");if(ls == null){ls = new ArrayList<cookie>();hs.setAttribute("cart",ls);}ls.add(c);
//        Cookie对象的传参,将来在浏览器端可以看到这个会话头的对应的属性值Cookie cookie = new Cookie("JSESSIONID",hs.getId());
//        这个会话可以存储三十分钟cookie.setMaxAge(60 * 30);
//        将这个请求路径设置为任何目录下都可以被访问cookie.setPath("/");
//        开始储存Cookie对象response.addCookie(cookie);
//        重定向到展示购物车界面,这个类仅完成会话参数的传递String url = "CartServlet";response.sendRedirect(url);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

一个用来展示商品列表的类

package Semester_3.ShoppingCart;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.util.Collection;/*
* 显示所有可供购买的蛋糕列表,并通过点击购买添加到购物车中*/
@WebServlet(urlPatterns = "/ListCakeServlet")
public class ListCakeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//用来设置返回头的标识,表示将要返回HTML有关的语句,并在页面中解析成为HTML代码格式并以UTF-8的编码格式进行加载resp.setHeader("content-type","text/html;charset=utf-8");
//        创建数据库模拟类的对象,获取数据库中所有蛋糕的数据并返回为一个数组格式Collection<cookie> all = CookDB.getAll();
//        将数组中的格式遍历输出到HTML页面中进行展示resp.getWriter().write("本站提供的蛋糕有:"+"<br>");for(cookie c :all){
//            GET请求方式,直接在重定向的时候在URL地址栏的位置携带数据String url = "PurchaseServlet?id=" + c.getID();//用来设置返回头的标识,表示将要返回HTML有关的语句,并在页面中解析成为HTML代码格式并以UTF-8的编码格式进行加载resp.setHeader("content-type","text/html;charset=utf-8");
//            写入一个超链接标签,地址为Cookie数据转发类中,并携带有关数据resp.getWriter().write(c.getName()+"<a href='"+url+"'>点击购买</a><br>");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}//    public static void main(String[] args) {
//        Collection<cookie> all = CookDB.getAll();
//        for(cookie c :all){
//            System.out.println(c.getName()+":"+c.getID());
//        }
//    }
}

最后是一个用来展示已经被购买的商品的购物车类

package Semester_3.ShoppingCart;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;@WebServlet(name = "CartServlet", value = "/CartServlet")
public class CartServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//获取写入响应信息的输入流PrintWriter writer = response.getWriter();
//        获取一个空的蛋糕对象List<cookie> ls =null;
//        这是一个标记,作用是判断是否有蛋糕被选择boolean pruFlag = true;
//        参数的意义,当参数为true时,如果获取不到对象的Session对象则自动创建一个;false参数则表示不自动创建HttpSession hs =request.getSession(false);
//        首先进入一个判断,当不存在Session对象时,则表示用户没有会话对象传入,将标记修改if(hs==null){pruFlag = false;}else {
//            如果有会话对象,但是会话中没有cart相应的信息,则表示用户没有选择蛋糕,也修改标记将标记的值改变ls = (List)hs.getAttribute("cart");if(ls==null){pruFlag= false;}}
//        最后渲染选择的蛋糕列表阶段,当标记一直没有被修改,则表示用户确实传入了一个会话对象,并且选择了蛋糕,则对用户选择的蛋糕进行渲染if (pruFlag){writer.write("您购买的蛋糕有:<br>");double price = 0;for(cookie c : ls){writer.write(c.getName()+"<br>");}}writer.write("<a href='ListCakeServlet'>返回蛋糕列表页</a>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

基本原理

类的介绍

Cookie类:对蛋糕信息的封装,以及对于蛋糕属性的设置和获取

具体实现:一个标准类,内部有带参数的构造方法,不带参数的构造方法,有成员变量,和针对每个成员变量的 get方法和set方法

CookDB:数据库模拟类,模拟了数据库中存储的商品信息

具体实现:类中包含一个私有的,静态的Map数组为本体,键对应ID编号,值对应不同的cookie也就是蛋糕 类的具体对象,内部用一个静态代码块封装了将所有蛋糕添加进数组的方法,所以每次重启项目的时候 都可以保证数组内部自动填充了相应的数据 内部有两个方法,一个按照ID获取对应的蛋糕类的方法,一个获取所有蛋糕的方法,一个 简单的模拟数据库存储数据的类就完成了

ListCakeServlet:一个展示所有蛋糕的展示页面,并且附带将选择的蛋糕的信息传递到其他类的功能

具体实现:首先获取所有的蛋糕列表,并使用for循环遍历,在遍历的时候,获取蛋糕的ID和蛋糕的名字 并写入一个超链接标签,当点击超链接的时候,将链接到会话类中并携带相应的蛋糕的信息

PurchaseServlet:会话类,将传递进来的信息封装进一个会话中传递给购物车类

具体实现:将蛋糕展示页面的信息获取到之后,首先会获取到传入的参数里有没有一个参数名为id的值,如果 有,则根据ID获取对应的蛋糕对象,用到的是模拟数据库类中的方法,将ID对应的蛋糕封装进一个数组中 进行传递,如果是一次接受数据,则创建一个数组,最后存储cookie对象并重定向到购物车类,这个类只做 传递参数的作用,并没有实际展示的效果

CartServlet:购物车类,展示用户选择的蛋糕

具体实现:将会话类中传递的信息在这个类中进行最终地展示,会话类中传递出了封装了所有用户选择的蛋糕的 数组对象,只需要遍历出这些蛋糕对象,并将获取每一个蛋糕的名字即可

具体流程

首先当数据库模拟类被加载进内存时,会自动执行静态代码中的内容完成商品的初始化。然后在商品展示页面 遍历数据库模拟类中的商品,当点击购买的时候,会携带着数据重定向到负责存储Cookie的类中, 判断是否有对应的cookie数据,如果没有就重定向到数据展示页面重新选择,如果有,就按照ID值获取 数据库模拟类中的商品实例对象存储进Cookie中,然后转发到商品展示类中。在商品展示类中获取对应的 Cookie值对应的商品对象,并将商品的信息获取并输出在网页中完成一个简易的购物车模拟类

JavaWeb实现简单购物车案例相关推荐

  1. vue简单购物车案例

    效果图: html代码如下: <body> <div id="app"><div v-if="books.length">& ...

  2. 基于javaweb+JSP+Servlet简单购物车

    基于javaweb+JSP+Servlet简单购物车 开发工具:eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 public ...

  3. php实现购物车 redis,redis 哈希数据类型简单操作(实现购物车案例)

    这里不累赘如何安装redis和php  redis扩展,主要熟悉调用redis哈希数据类型 如图 简单方法操作如下 1:hSet 2:hGet 4:hDel 5:hGetAll 4:hExists 5 ...

  4. Web全栈~17.购物车案例(JavaScript动态效果)

    Web全栈~17.购物车案例(JavaScript动态效果) 上一期 前言 前三期已经对购物车的样式绘制完毕,那么这一期就用JavaScript来实现动态效果. 全选 思路 可以在input标签里,添 ...

  5. solr简单搜索案例

    solr简单搜索案例 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类.价格过滤搜索结果,也可以根据价格进行排序,实现分页. 架构分为: 1. solr服务器 2. ...

  6. Javaweb之简单例子(一)

    Javaweb 之简单例子(一) 目录:                                                                         一.简述    ...

  7. JavaWeb之网上书城案例低保真

    JavaWeb之网上书城案例低保真(本低保真目前适用于chrome) 首页页面:   注册页面:   登陆页面:   购物车页面:   付款页面:   成功页面:   失败页面:  

  8. vue之购物车案例升级版、v-model之lazy、number、trim的使用、fetch和axios、计算属性、Mixins、虚拟dom与diff算法 key的作用及组件化开发

    文章目录 1.购物车案例升级版(含价格统计.全选/反选.商品增加减少) 2.v-model之lazy.number.trim的使用 3.fetch和axios 3.1.通过jquery+ajax实现v ...

  9. Vue实战之商品购物车案例

    学习Vue框架有一段时间了,所以找了个案例练练手,借此来巩固所学知识以及如何将其运用在实际生活场景,学以致用不就是这个意思嘛<_<.好了,废话不多说,切入正题. 该案例是利用Vue的计算属 ...

最新文章

  1. 【科技金融】互金欺诈黑话大集锦
  2. 1、CSS 定位 (Positioning)
  3. python基础教程:函数作用域
  4. java 乘法 位移_java 位移运算与乘法运算
  5. Kubernetes入门——Kubernetes日志采集与监控告警
  6. Win7/Win8.1升级Win10后屏幕一直闪烁怎么办?
  7. 【6】nagios从零学习使用 - centreon发送邮件报警
  8. mysql数据库连接失败,挑战大厂重燃激情!
  9. rational rose 逆向工程
  10. UVA 1599 Ideal Path
  11. 二维burgers方程_二维Burgers方程的RKDG有限元解法
  12. 为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法如下
  13. 10句编程箴言 每个程序员都应该知道
  14. day4(继承、修饰符、方法的重写、super关键词、继承中的构造方法、object类、对象转型)...
  15. SpringBoot Security 整合 thymeleaf 模板自定义登录页面,按需提示错误信息
  16. Cadence系列之SIPI仿真笔记:Cadence多种版本的安装、卸载重装(一)
  17. YYKit框架使用学习之整理
  18. Postgres-XL 9.5简易搭建
  19. 慢慢来,一切都来得及
  20. 11:Hive从0到1系列学习:函数之常用的内置函数

热门文章

  1. C++ reverse函数的用法—头文件#include <algorithm>
  2. 人性化出色 Vista版金山毒霸2007试用
  3. Centos7 虚拟机联网配置
  4. 打印机常见问题故障之经验总结
  5. React路由使用详解
  6. 远程服务器与windows之间不能复制粘贴
  7. 金蝶KIS商贸版即时库存表开发实现增加'综合数量'列
  8. vue渲染时数据对象里面的子对象的属性报错undefined,但页面正常渲染
  9. 程序运行过程中更改窗体大小
  10. esp8266灯上电闪一下_【零知ESP8266教程】快速入门2-点亮外部LED灯