购物车
工程结构:
index.jsp:
<%@page import="com.atguigu.app.ajax.beans.Book"%>
<%@page import="com.atguigu.app.ajax.util.ShoppingCart"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>CheckUserName_Ajax</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript"
src="<%=basePath%>scripts/jquery-1.3.1.js"></script>
<script type="text/javascript">
$(function() {
// 如果没有购物车, 就隐藏提示
var isHasCart = <%=session.getAttribute("cart") == null %>;
if (isHasCart) {
$("#message").hide();
} else {
$("#message").show();
$("#bookName").text("${sessionScope.cart.bookName}");
$("#bookNumber").text("${sessionScope.cart.bookNumber}");
$("#totalMoney").text("${sessionScope.cart.totalMoney}");
}
$("a").click(function() {
$("#message").show(); // 显示购买信息
var url = this.href;
var args = {"time": new Date()};
$.getJSON(url, args, function(data) {
$("#bookName").text(data.bookName);
$("#bookNumber").text(data.bookNumber);
$("#totalMoney").text(data.totalMoney);
});
return false;
});
});
</script>
</head>
<body>
<h2 id="message">
您已将 <span id="bookName" style="color: blue;"></span> 加入购物中,
购物车中共 <span id="bookNumber" style="color: blue;"></span> 本书,
总价: ¥<span id="totalMoney" style="color: blue;"></span> 元
</h2>
<hr size="3px" color="blue">
<ol>
<li>
Java <a href="<%=basePath%>addToCart?bookName=Java&price=100">加入购物车</a><br><br>
</li>
<li>
Oracle <a href="<%=basePath%>addToCart?bookName=Oracle&price=200">加入购物车</a><br><br>
</li>
<li>
Struts2 <a href="<%=basePath%>addToCart?bookName=Struts2&price=300">加入购物车</a><br><br>
</li>
</ol>
</body>
</html>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>AddToCartServlet</servlet-name>
<servlet-class>com.atguigu.app.ajax.servlet.AddToCartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddToCartServlet</servlet-name>
<url-pattern>/addToCart</url-pattern>
</servlet-mapping>
</web-app>
Book.java:
package com.atguigu.app.ajax.beans;
public class Book {
private String bookName; // 书名
private double price; // 单价
private int totalNumber; // 数量
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getTotalNumber() {
return totalNumber;
}
public void setTotalNumber(int totalNumber) {
this.totalNumber = totalNumber;
}
}
ShoppingCart.java:
package com.atguigu.app.ajax.util;
import java.util.HashMap;
import java.util.Map;
import com.atguigu.app.ajax.beans.Book;
public class ShoppingCart {
// 声明一个购物车集合
private Map<String, Book> booksMap = new HashMap<>();
// 添加到购物车
public void addToCart(String bookName, double price) {
// 先看看购物车集合中是否存在该书, 如果有, 则数量+1, 否则, 数量=1
if (booksMap.containsKey(bookName)) {
// 如果包含该书, 就从购物车集合中取出这本书
Book book = booksMap.get(bookName);
// 定义书的信息[数量]
book.setTotalNumber(book.getTotalNumber() + 1);
} else {
// 如果不包含该书, 那么创建一本书并把书添加到购物车集合中
Book book = new Book();
book.setBookName(bookName);
book.setPrice(price);
book.setTotalNumber(1);
booksMap.put(bookName, book);
}
}
// 因为要计算总价, 所以要获取购物车集合中对应书本的数量
public int getTotalBookNumber() {
int totalNumber = 0;
// 遍历找到该书应的购买数量
for (Book book : booksMap.values()) {
totalNumber += book.getTotalNumber();
}
return totalNumber;
}
// 计算书的总价
public double getTotalMoney() {
double totalMoney = 0.0;
// 遍历找到该书应的购买数量
for (Book book : booksMap.values()) {
totalMoney += book.getTotalNumber() * book.getPrice();
}
return totalMoney;
}
}
AddToCartServlet.java:
package com.atguigu.app.ajax.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.atguigu.app.ajax.util.ShoppingCart;
@SuppressWarnings("serial")
public class AddToCartServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取JSP传递过来的参数: bookName, price
String bookName = request.getParameter("bookName");
double price = Double.parseDouble(request.getParameter("price"));
// 用户第一次访问, session中购物车不存在, 需要创建一个购物车对象放入session
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
// session中不存在购物车对象
if (cart == null) {
cart = new ShoppingCart();
session.setAttribute("cart", cart);
}
// 如果session中存在购物车对象, 就把书放入购物车
cart.addToCart(bookName, price);
// 拼接操作, 返回目标JSON数据
// 目标JSON数据: {"bookName": "Java", "bookNumber": 10, "totalMoney": 2000.0}
StringBuffer bookJSON = new StringBuffer();
bookJSON.append("{")
.append("\"bookName\": \"" + bookName + "\"")
.append(",")
.append("\"bookNumber\": ")
.append(cart.getTotalBookNumber())
.append(",")
.append("\"totalMoney\": ")
.append(cart.getTotalMoney())
.append("}");
// 返回JSON数据
response.setContentType("text/javascript;charset=UTF-8");
response.getWriter().print(bookJSON.toString());
}
}
----------------------------------------------------------------------------
测试: