JavaWeb开发购物车设计总结
一. 实体类设计
图书实体类
public class Book {
private String id;
private String name;
private String author;
private double price;
private String description;
// 省略getter setter
}
购物项实体类
public class CartItem {
private Book book;
private int quantity;
private double price;
/**
* 重构getPrice方法
* @return 购物项总价格
*/
public double getPrice() {
return book.getPrice() * this.quantity;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public void setPrice(double price) {
this.price = price;
}
}
购物车实体类
public class Cart {
private Map<String, CartItem> map = new LinkedHashMap();
private double price;
/**
* 向购物车中添加图书
* @param book
*/
public void add(Book book) {
CartItem item = map.get(book.getId());
if(item == null) {
// 若不存在相同类型书籍,则创建新的购物项
item = new CartItem();
item.setBook(book);
item.setQuantity(1);
// 将购物项添加到购物车中
map.put(book.getId(), item);
} else {
// 若存在相同类型书籍,则将购物项个数加一
item.setQuantity(item.getQuantity()+1);
}
}
/**
* 重构getPrice方法
* @return
*/
public double getPrice() {
// 购物车总价格
double totalprice = 0;
// 迭代购物车中所有购物项, 相加获取购物车总价
for(Map.Entry<String, CartItem> me : map.entrySet()) {
CartItem item = me.getValue();
totalprice += item.getPrice();
}
return totalprice;
}
public Map<String, CartItem> getMap() {
return map;
}
public void setMap(Map<String, CartItem> map) {
this.map = map;
}
public void setPrice(double price) {
this.price = price;
}
}
二. 业务层设计
操作购物车实际上就是操作cart对象中的map集合
购物车四个主要功能:
1. 添加商品到购物车
2. 删除购物车商品
3. 清空购物车
4. 修改购物车中购物项数量
public class CartService {
BookDao bdao = new BookDao();
/**
* 将图书添加到购物车中
* @param bookid
* @param cart
*/
public void buybook(String bookid, Cart cart) {
// 根据bookid获取图书对象
Book book = bdao.find(bookid);
cart.add(book);
}
/**
* 删除购物车中指定bookid的图书
* @param bookid
* @param cart
* @throws CartNotFoundException
*/
public void deleteBook(String bookid, Cart cart) throws CartNotFoundException {
//如果用户直接访问DeleteServlet,那么当运行到这里时,因为cart对象为空,
//程序会抛出空指针异常。所以这里应该判断购物车是否为空。
if(cart == null) {
throw new CartNotFoundException("查找不到购物车!!!");
}
//String,CartItem
Map map = cart.getMap();
//删除key为bookid的购物项
map.remove(bookid);
}
/**
* 清空购物车中所有购物项
* @param cart
* @throws CartNotFoundException
*/
public void clearcart(Cart cart) throws CartNotFoundException {
if(cart == null) {
throw new CartNotFoundException("查找不到购物车!!!");
}
cart.getMap().clear();
}
/**
* 更新购物项数量
* @param cart
* @param bookid
* @param quantity
* @throws CartNotFoundException
*/
public void updateCart(Cart cart, String bookid, int quantity) throws CartNotFoundException {
if(cart == null) {
throw new CartNotFoundException("查找不到购物车!!!");
}
CartItem item = cart.getMap().get(bookid);
item.setQuantity(quantity);
}
}
注意: 获取到web层传递过来的cart对象时, 记得检查NPE
三. web层设计
1. 添加商品到购物车
public class CartAddServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String bookid = request.getParameter("bookid");
// 从session中获取购物车
Cart cart = (Cart) request.getSession().getAttribute("cart");
if (cart == null) {
//用户第一次添加商品时
cart = new Cart();
request.getSession().setAttribute("cart", cart);
}
CartService cartService = new CartService();
cartService.buybook(bookid, cart);
request.getRequestDispatcher("/listcart.jsp").forward(request, response);
return;
} catch (Exception e) {
request.setAttribute("message", "操作失败!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
}
}
2. 删除购物车商品
public class CartDeleteServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String bookid = request.getParameter("bookid");
Cart cart = (Cart) request.getSession().getAttribute("cart");
// 获取业务层, 删除目标购物项
CartService cartService = new CartService();
cartService.deleteBook(bookid, cart);
// 刷新页面
request.getRequestDispatcher("/listcart.jsp").forward(request, response);
} catch (CartNotFoundException e) {
request.setAttribute("message", "操作出错!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
}
3. 清空购物车
public class ClearCartServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Cart cart = (Cart) request.getSession().getAttribute("cart");
CartService cartService = new CartService();
cartService.clearcart(cart);
request.getRequestDispatcher("/listcart.jsp").forward(request, response);
} catch (CartNotFoundException e) {
request.setAttribute("message", "操作出错!!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
}
4. 修改购物车中购物项数量
public class UpdateCartServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//获取操作的图书对象
String bookid = request.getParameter("bookid");
//获取改变的数量
int quantity = Integer.parseInt(request.getParameter("quantity"));
//获取购物车
Cart cart = (Cart) request.getSession().getAttribute("cart");
CartService cartService = new CartService();
cartService.updateCart(cart, bookid, quantity);
request.getRequestDispatcher("/listcart.jsp").forward(request, response);
} catch (Exception e) {
request.setAttribute("message", "操作出错!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
}
5. 获取所有商品
public class ListBookServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
BookService bookService = new BookService();
Map map = bookService.getAllBook();
request.setAttribute("map", map);
request.getRequestDispatcher("/listbook.jsp").forward(request, response);
return;
} catch (Exception e) {
request.setAttribute("message", "请求失败!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
}
}
四. 前台页面设计
listbook.jsp 获取所有商品
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'listbook.jsp' starting page</title>
</head>
<body>
<table border="1px" cellspacing="0" align="center">
<tr>
<td>图书ID</td>
<td>图书名称</td>
<td>图书作者</td>
<td>图书价格</td>
<td>图书描述</td>
<td>操作</td>
</tr>
<c:forEach var="me" items="${map }">
<tr>
<td>${me.key }</td>
<td>${me.value.name }</td>
<td>${me.value.author }</td>
<td>${me.value.price }</td>
<td>${me.value.description }</td>
<td>
<a href="${pageContext.request.contextPath }/servlet/BuyServlet?bookid=${me.key }">购买</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
listcart.jsp 查看购物车页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'listcart.jsp' starting page</title>
<script type="text/javascript">
//删除商品
function clearcartitem(bookid) {
var result = window.confirm("您确定要删除该商品么?");
if(result) {
window.location.href = "${pageContext.request.contextPath }/servlet/DeleteServlet?bookid="+bookid;
}
}
//清空购物车
function clearcart() {
var result = window.confirm("您确定要清空购物车么?");
if(result) {
window.location.href = "${pageContext.request.contextPath }/servlet/ClearCartServlet";
}
}
//改变购物项数量
function updateCart(input,id,oldvalue) {
var quantity = input.value;
//验证非零的正整数:^\+?[1-9][0-9]*$
var reg= /^\+?[1-9][0-9]*$/;
var result = window.confirm("请确认改为:" + quantity);
//判断输入是否为正整数
if(!reg.test(quantity)) {
alert("参数不合法!");
input.value = oldvalue;
return;
} if(result) {
window.location.href="${pageContext.request.contextPath}/servlet/UpdateCartServlet?bookid="+id + "&quantity=" + quantity;
} else {
input.value = oldvalue;
}
}
</script>
</head> <body>
<c:if test="${!empty(cart.map) }">
<table border="1px" cellspacing="0" align="center">
<tr>
<td>图书名称</td>
<td>图书作者</td>
<td>单价</td>
<td>数量</td>
<td>小计</td>
<td>操作</td>
</tr>
<c:forEach var="me" items="${cart.map }">
<tr>
<td>${me.value.book.name }</td>
<td>${me.value.book.author }</td>
<td>${me.value.book.price }</td>
<td>
<input type="text" name="quantity" value="${me.value.quantity }" style="width: 30px" onchange="updateCart(this,${me.value.book.id },${me.value.quantity })">
</td>
<td>${me.value.price }</td>
<td>
<a href="javascript:clearcartitem(${me.value.book.id })">删除</a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="2">
<a href="javascript:clearcart()">清空购物车</a>
</td>
<td colspan="2">合计</td>
<td colspan="2">${cart.price }</td>
</tr>
</table>
</c:if> <c:if test="${empty(cart.map) }">
对不起,您还没有购买任何商品!
</c:if>
</body>
</html>
附: 数据库表
create database cart_cheatsheep; use cart_cheatsheep; create table t_book(
id varchar(40) primary key,
name varchar(100) not null unique,
author varchar(100) not null unique,
price double not null,
description varchar(255)
);
JavaWeb开发购物车设计总结的更多相关文章
- 李兴华JavaWeb开发笔记
李兴华JavaWeb开发笔记 1.Java语法-基础 环境变量-JAVA_HOME, PATH, ClassPath 变量名 作用 举例 JAVA_HOME 指向JDK目录 C:\Program Fi ...
- JavaWeb开发技术基础概念回顾篇
JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...
- 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权
原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...
- 文献综述七:基于SSM的网上商城的开发与设计
一.基本信息 标题:基于SSM的网上商城的开发与设计 时间:2018 出版源:Computer Knowledge and Technology 文件分类:对框架的研究 二.研究背景 为了解决现在电商 ...
- 关于JavaWeb开发的一些感悟
从事JavaWeb的开发已经三年了,从最开始的啥都不会,到慢慢的能够独立做项目,从一开始的一片茫然,到现在的心中有数.对于技术.业务也有了自己的看法. JavaWeb开发所涉及到的知识点非常多,涉及到 ...
- JavaWeb开发小结
JavaWeb开发是B/S开发的一种,其他语言也可以实现,就前台而言,一直都是HTML.CSS.JavaScript 后台语言可以是Perl.Python.PHP.Java等等 Java机缘巧合在We ...
- 13jsp、javaWeb开发模式
13jsp.javaWeb开发模式-2018/07/25 1.jsp jsp实际上就是servlet.jsp=html+java,为用户提供动态内容 不适合编写Java逻辑 2.JSP原理 翻译(生成 ...
- JavaWeb开发中的分层思想(一)
JavaWeb开发分层思想(一) 一.认识DAO.Service.Controller层 DAO(Data Access Object) 1.直接看英文意思就是"数据访问对象",也 ...
- 高性能PHP框架thinkphp5.0.0 Beta发布-为API开发而设计
ThinkPHP V5.——为API开发而设计的高性能框架 ThinkPHP5..0版本是一个颠覆和重构版本,采用全新的架构思想,引入了很多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载 ...
随机推荐
- CometOJ Contest #3 C
题目链接:https://cometoj.com/contest/38/problem/C?problem_id=1542&myself=0&result=0&page=1&a ...
- .net 超链接传值,传过去始终是null
今天做了一个删除功能,通过点击列表中的删除超链接,通过get请求,跳转到一个处理程序执行删除操作 . 因为不熟悉各种报错 , <%="<td> <a class='d ...
- Django ORM 之 单表、多表查询
返回ORM目录 Django ORM Django ORM 之一 内容目录: 一.单表查询 二.多表查询 0.准备工作 一些说明: - 表myapp_person的名称是自动生成的,如果你要自定义表名 ...
- python open函数关于w+ r+ 读写操作的理解(转)
r 只能读 (带r的文件必须先存在)r+ 可读可写 不会创建不存在的文件.如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容.w+ 可读可写 如果文件存在 则覆 ...
- Windows dir
显示目录中的文件和子目录列表. DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N] [/O[[:]so ...
- Hibernate与数据库交互方式和Hibernate常用的几个方法
第一种,适合sql语言水平比较高的人用 HQL(Hibernate Query Language) 面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分 ...
- jmeter+ant+jenkins 搭建接口自动化测试环境
过程参考:http://www.cnblogs.com/lxs1314/p/7487066.html 1. 安装ant 2. 安装jenkins 遇到问题: 启动Tomcat后,访问http://lo ...
- 巧用CSS3的calc()宽度计算做响应模式布局
今天浏览这个http://www.sitepoint.com站时,因为好奇看了下人家写的代码,结果发现了这行代码, 于是就研究了一下,calc()从字面我们可以把他理解为一个函数function.其实 ...
- thinkphp 应用编译
应用编译机制作为ThinkPHP独创的功能特色,从1.0版本就延续至今,3.2版本的编译机制更加具有特色. 应用编译缓存 编译缓存的基础原理是第一次运行的时候把核心需要加载的文件去掉空白和注释后合并到 ...
- ros多机系统
编辑从机的~/.bashrc添加如下指令 方法一 export ROS_MASTER_URI=http://qian:11311 #qian是主机的机器名 export ROS_HOSTNAME=ro ...