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新特性,优化了核心,减少了依赖,实现了真正的惰性加载 ...
随机推荐
- 数学相关比较 牛顿迭代法求开方 很多个n的平方分之一
牛顿迭代法求开方 牛顿迭代法 作用: 求f(x) = 0 的解 方法:假设任意一点 x0, 求切线与x轴交点坐标x1, 再求切线与x轴交点坐标x2,一直重复,直到f(xn) 与0的差距在一个极小的范围 ...
- webconfig节点值里的文字换行问题
有时候会遇到在配置节点中配置文字的问题,比如: <add key="notice" value="温馨提示:1,感谢您访问; \n 2,谢谢来访"/> ...
- class8_Canvas 画布
最终的部分运行效果图(程序见序号4): #!/usr/bin/env python# -*- coding:utf-8 -*-# ----------------------------------- ...
- GIT学习记录3(分支管理)
学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...
- Scala 可变长参数
Scala 允许你指明函数的最后一个参数可以是重复的.这可以允许客户向函数传入可变长度参数列表.想要标注一个重复参数,在参数的类型之后放一个星号. 例如:定义一个可变参数的函数param def pa ...
- markdown转为pdf文件
要求: 把.md格式转为.pdf格式,并批量处理,最后将多个pdf文件合并为一个pdf并以文件名作为书签名 解决思路: 1.md格式的markdown文件转为html 为了将 md 格式转换成 htm ...
- Java High Level REST Client 中文API(仅供参考)
1.初始化 兼容性 Java High Level REST Client需要Java 1.8,并依赖于Elasticsearch核心项目,客户端版本与客户端开发的Elasticsearch版本相同, ...
- selenium基础-图形验证码
selenium基础-图形验证码 一.图形验证码作用 设计的初衷其实就是为了防自动化,防止一些人利用自动工具恶意攻击网站 二.图形验证码是由客户端生成还是由服务器端生成的? 图形验证码是由服务器端生成 ...
- 在MRC模式下使用SDWebImage
在MRC模式下使用SDWebImage (1)在Target->Build Phases->Compile Sources中,给所有的SDWebImage添加-fobjc-arc (2)添 ...
- File转换为MultipartFile工具类
package cn.com.utils; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileu ...