将购物车放入Session中
修改数量用Ajax 为-0时删除
// 修改数量
protected void updateItemQuantity(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 4.在 方法中获取quantity id 在获取 购物车对象
// 调用service方法 做修改
String idStr = request.getParameter("id");
String quantityStr = request.getParameter("quantity");
ShoppingCart sc = BookStoreWebUtils.getShoppingCart(request);
int id = -1;
int quantity = -1;
try {
id = Integer.parseInt(idStr);
quantity = Integer.parseInt(quantityStr);
} catch (Exception e) {
}
if (id > 0 && quantity > 0) {
bookService.updateItemQuantoity(sc, id, quantity);
}
// 5.传回 JSON数据
Map<String, Object> result = new HashMap<>();
result.put("bookNumber", sc.getBookNumber());
result.put("totalMoney", sc.getTotalMoney());
Gson gson = new Gson();
String jsonStr = gson.toJson(result);
response.setContentType("text/javascript");
response.getWriter().print(jsonStr);
}
// 控制器 不写逻辑
protected void clear(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ShoppingCart sc = BookStoreWebUtils.getShoppingCart(request);
bookService.clearShoppingCart(sc);
request.getRequestDispatcher("/WEB-INF/pages/emptycart.jsp").forward(request, response);
}
// 删除
protected void remove(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String idStr = request.getParameter("id");
int id = -1;
try {
id = Integer.parseInt(idStr);
} catch (Exception e) {
}
ShoppingCart sc = BookStoreWebUtils.getShoppingCart(request);
bookService.removeItemFromShoppingCart(sc, id);
// 如果删 了 购物车 转发到 为空的那个 页面
if (sc.isEmpty()) {
request.getRequestDispatcher("/WEB-INF/pages/emptycart.jsp").forward(request, response);
return;
}
// 否则 不变
request.getRequestDispatcher("/WEB-INF/pages/cart.jsp").forward(request, response);
}
// 仅仅是关于转发 的 方法 可以写的灵活
public void forwardPage(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String page = request.getParameter("page");
request.getRequestDispatcher("/WEB-INF/pages/" + page + ".jsp").forward(request, response);
}
// 加入购物车
public void addToCart(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获取商品的id
String idStr = request.getParameter("id");
int id = -1;
boolean flag = false;
try {
id = Integer.parseInt(idStr);
} catch (Exception e) {
}
if (id > 0) {// 合法
// 2、 获取购物车对象
ShoppingCart sc = BookStoreWebUtils.getShoppingCart(request);
// 3、调用 BookServlet的addToCart()方法把商品放到购物车中
flag = bookService.addToCart(id, sc);
}
if (flag) {
// 4、直接调用getBOOKS方法
getBooks(request, response);
return;
}
response.sendRedirect(request.getContextPath() + "/error.jsp");
}
// 获取图书详细信息
public void getBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String idStr = request.getParameter("id");
int id = -1;
Book book = null;
try {
id = Integer.parseInt(idStr);
} catch (NumberFormatException e) {
}
if (id > 0) {
book = bookService.getBook(id);
}
if (book == null) {
response.sendRedirect(request.getContextPath() + "error.jsp");
return;
}
request.setAttribute("book", book);
request.getRequestDispatcher("/WEB-INF/pages/book.jsp").forward(request, response);
}
package com.greatest.mvcapp.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import com.greatest.mvcapp.dao.AccountDAO;
import com.greatest.mvcapp.dao.BookDAO;
import com.greatest.mvcapp.dao.TradeDAO;
import com.greatest.mvcapp.dao.TradeItemDAO;
import com.greatest.mvcapp.dao.UserDAO;
import com.greatest.mvcapp.dao.impl.AccountDAOIml;
import com.greatest.mvcapp.dao.impl.BookDAOImpl;
import com.greatest.mvcapp.dao.impl.TradeDAOImpl;
import com.greatest.mvcapp.dao.impl.TradeItemDAOImpl;
import com.greatest.mvcapp.dao.impl.UserDAOImpl;
import com.greatest.mvcapp.main.Book;
import com.greatest.mvcapp.main.ShoppingCart;
import com.greatest.mvcapp.main.ShoppingCartItem;
import com.greatest.mvcapp.main.Trade;
import com.greatest.mvcapp.main.TradeItem;
import com.greatest.mvcapp.web.CriteriaBook;
import com.greatest.mvcapp.web.Page;
public class BookService {
private BookDAO bookDAO=new BookDAOImpl();
public Page<Book> getPage(CriteriaBook criteriabook){
return bookDAO.getPage(criteriabook);
}
public Book getBook(int id){
return bookDAO.getBook(id);
}
public boolean addToCart(int id,ShoppingCart sc){
Book book=bookDAO.getBook(id);//获取book
if(book!=null){
sc.addBook(book);
return true;
}
return false;
}
public void removeItemFromShoppingCart(ShoppingCart sc,int id){
sc.removeItem(id);
}
public void clearShoppingCart(ShoppingCart sc){
sc.clear();
}
public void updateItemQuantoity(ShoppingCart sc ,int id,int quantity){
sc.updateItemQuantity(id, quantity);
}
private AccountDAO accountdao=new AccountDAOIml();
private TradeDAO tradedao=new TradeDAOImpl();
private UserDAO userdao=new UserDAOImpl();
private TradeItemDAO tradeitemdao=new TradeItemDAOImpl();
//业务代码 实现 交易 将库存加减、交易记录、购买记录、账户余额 封装为事务
public void cash(ShoppingCart shoppingCart, String username, String accountid) {
//1、更新myboks表中的库存 salesamount和 storeunmber
bookDAO.batchUpdateStoreNumberAndSalesAmount(shoppingCart.getItems());
// int i=10/0;
//2.更新account数据表的balance
accountdao.updateBalance(Integer.parseInt(accountid), shoppingCart.getTotalMoney());
//3.向trade数据表中插入一条记录 交易记录
Trade trade=new Trade();
//哪个用户在哪个时间购买书
trade.setTradeTime(new Date(new java.util.Date().getTime()));
trade.setUserId(userdao.getUser(username).getUserId());
tradedao.insert(trade);
//4.向tradeitem数据表中插入n条记录 购买记录
//4.1先获取信息 书的id 数量
Collection<TradeItem> items=new ArrayList<>();
for(ShoppingCartItem sci:shoppingCart.getItems()){
TradeItem tradeitem=new TradeItem();
tradeitem.setBookId(sci.getBook().getId());
tradeitem.setQuantity(sci.getQuantity());
tradeitem.setTradeId(trade.getTradeId());
items.add(tradeitem);
}
//4.2执行插入方法
tradeitemdao.batchSave(items);
//5、清空购物车
shoppingCart.clear();
}
}
cart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="script/jquery-1.7.2.min.js"></script>
<%@include file="/commons/queryCondition.jsp" %>
<script type="text/javascript">
$(function(){
$(".delete").click(function(){
var $tr=$(this).parent().parent();
var title=$.trim($tr.find("td:first").text());
var flag = confirm("确定要删"+title+"除的信息吗?")
if(flag){
return true;
}
return false;
})
//Ajax修改单个商品的数量
//1、获取页面中所有的Text ,并为其添加onchange响应函数
//弹出对话框 :确定修改吗?
$(":text").change(function(){
var quantityVal=$.trim(this.value);
var flag=false;
var reg=/^\d+$/g;
var quantity=-1;
//校验数量的合法性
if(reg.test(quantityVal)){
quantity=parseInt(quantityVal);//文本框中的值变为int 类型
if(quantity>=0){
flag=true;//合法
}
}
if(!flag){
alert("输入的数量不合法!");
$(this).val($(this).attr("class"));//回显 让当前的值为 class属性的值(class的值相当与隐藏域 )
return;
}
var $tr=$(this).parent().parent();
var title=$.trim($tr.find("td:first").text());
if(quantity==0){
var flag2=confirm("确定要删除"+title+"吗?");
if(flag2){
//得到了a节点
var $a=$tr.find("td:last").find("a");
//执行a节点的onclick响应函数
$a[0].onclick();//DOM对象
return;
}
}
var flag=confirm("确定要修改"+title+"的数量吗?")
if(!flag){
$(this).val($(this).attr("class"));
return ;
}
//2、请求地址为BOOKServlet
var url="bookServlet";
//3.请求参数为 method:updateItemQuantity,id:name属性值 ,quantity:val
//time:new Date();
var idVal=$.trim(this.name);
var args={"method":"updateItemQuantity","id":idVal,"quantity":quantityVal,"time":new Date()};
//4.在updateItemQuantity方法中 获取quantity 在获取购物车的对象
//调用service的方法做修改
//5.回传 JSON数据 :bookNumber:xx,totalMoney;
//6.更新当前页面 的bookNumber 和 totalMoney
$.post(url,args,function(data){
var bookNumber=data.bookNumber;
var totalMoney=data.totalMoney;
$("#totalMoney").text("总金额:¥"+totalMoney);
$("#bookNumber").text("您的购物车中有 "+bookNumber+"本书");
},"JSON");
})
})
</script>
</head>
<body>
<center>
<br><br>
<div id="bookNumber">你的购物车中共有${sessionScope.ShoppingCart.bookNumber }本书</div>
<table cellpadding="10">
<tr>
<td>Title</td>
<td>Quantity</td>
<td>Price</td>
<td> </td>
</tr>
<c:forEach items="${sessionScope.ShoppingCart.items }" var="item">
<tr>
<td>${item.book.title}</td>
<td>
<input class="${item.quantity }" type="text" size="1" name="${item.book.id }" value="${item.quantity }"/></td>
<td>${item.book.price}</td>
<td><a href="bookServlet?method=remove&pageNo=${param.pageNo }&id=${item.book.id}" class="delete" >删除</a>
</td>
</tr>
</c:forEach>
<tr><td clospan="4" id="totalMoney">总金额:¥
${sessionScope.ShoppingCart.totalMoney }
</td> </tr>
<tr>
<td clospan="4">
<a href="bookServlet?method=getBooks&pageNo=${param.pageNo }">继续购物</a>
<a href="bookServlet?method=clear">清空购物车</a>
<a href="bookServlet?method=forwardPage&page=cash">结账</a>
</td>
</tr>
</table>
</center>
</body>
</html>