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新特性,优化了核心,减少了依赖,实现了真正的惰性加载 ...
随机推荐
- 9.RabbitMQ Topic类型交换机
RabbitMQ消息服务中Topic类型交换机根据通配符路由消息,*代表一个单词,#代表代表0或多个单词. 生产者 消费者 代码 Producer.java package com.tes ...
- 《转》python 11 表达式和语句
转自 http://www.cnblogs.com/BeginMan/p/3164600.html 一.Python语句 if语句.else语句.elif语句.条件表达式.while语句.for语句. ...
- PostgreSQL 主键自动增长
建立主键并设置自动增加的办法好好几种,这里记录我测试过的: drop table pro_process; CREATE TABLE "public"."pro_proc ...
- Eclipse中普通java项目转成Web项目
在eclipse导入一个myeclipse建的web项目后,在Eclipse中显示的还是java项目,按下面的步骤可以将其转换成web项目. 1.找到项目目录下的.project文件 2.编辑.pro ...
- Git创建本地库过程
- Window sevice +OWIN+webapi
webapi正常都托管在iis上,这里引入owin,将其托管在window服务上. 第一步:创建一个服务,这里就不多描述. 第二步:引入OWIN 2.1引入bll 2.2加入api路由配置 publi ...
- 和Excel函数date同样功能的VBA函数DateSerial用法
Sub 日期别()On Error Resume Nextlastrow = Sheets("运营日报").Range("a1048576").End(xlUp ...
- 校园商铺-4店铺注册功能模块-10店铺注册之js实现
1. 建立js目录和文件 1.1 建立js目录 在webapp下新建文件夹js,再在js目录下新建shop文件夹. 1.2 js文件 js的功能: 1.从后台获取到店铺分类.区域等是信息,将它填充到前 ...
- vue双向绑定的原理
什么是双向数据绑定?Vue是一个MVVM框架,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化. 实现数据绑定的方式大致有以下几种: - 1.发布者-订阅者 ...
- iOS 5 ARC 入门
这篇文章还可以在这里找到 英语, 波兰语 Learn the ins and outs of ARC in iOS 5! 这是iOS 5 盛宴中的第12篇教程! 这篇教程是我们的新书 iOS 5 By ...