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新特性,优化了核心,减少了依赖,实现了真正的惰性加载 ...
随机推荐
- Ehcache3.x学习(二)分层的选项
Ehcache支持分层缓存的概念. 当想缓存堆内存以外的空间时,会发生下面的事情: 1.将数据添加到缓存意味着必须序列化key和value. 2.从缓存中读取数据意味着可能必须反序列化key和valu ...
- 20140308 std::fill
std::fill 在[first, last)范围内填充值:std::fill(v.begin(), v.end(), 100);http://blog.csdn.net/ilysony/arti ...
- C在结构体里面使用共用体
在做链表的时候我们设计每个节点都是一个结构体,每个节点的数据用一个共用体表示,每创建malloc一个结构体节点我们也要相应的malloc共用体并把它付进去. 这是定义: typedef union E ...
- linux 平台安装JDK环境
1.检查一下系统中的jdk版本 [root@localhost software]# java -version 2.检测jdk安装包 [root@localhost software]# rpm - ...
- adb shell top 使用
adb shell top 一.其中相关参数: >adb shell top -h Usage: top [ -m max_procs ] [ -n iterations ] [ -d del ...
- mysql之MHA、Mycat综合分析
一.简介 MHA: 你可以把它看做是一个监控MySQL的工具,当master挂了之后,起一个slave作为master,另外一台slave重新作为新master的备库: 所以MHA的架构做好是三台数 ...
- 配置Spring Security 错误:Property or field 'ROLE_USER' cannot be found
在学习http://www.mkyong.com/spring-security/spring-security-hello-world-example/时,出现以下错误: Property or f ...
- window下apache2.2配置多个tomcat使用不同二级域名,共用80端口
思路:分3步, 1,安装apache服务器httpd-2.2.25-win32-x86-no_ssl.msi,安装tomcat 2,配置tomcat默认访问的项目,配置apache服务器 3,测试 第 ...
- 2018-8-10-win10-uwp-如何让一个集合按照需要的顺序进行排序
title author date CreateTime categories win10 uwp 如何让一个集合按照需要的顺序进行排序 lindexi 2018-08-10 19:16:50 +08 ...
- 读取数据库的数据并转换成List<>
一.在有帮助类DbHelperSQL的时候 1.下为其中返回SqlDataReader的方法 /// <summary> /// 执行查询语句,返回SqlDataReader ( 注意:调 ...