DB位于db包
package cn.itcast.db;
import java.util.LinkedHashMap;
import java.util.Map;
import cn.itcast.domain.Book;
public class DB {
private static Map<String,Book> map=new LinkedHashMap<String,Book>();
static{
map.put("1", new Book("1","javascript","老张",59,"一本好书"));
map.put("2", new Book("2","javase","老毕",69,"一本好书"));
map.put("3", new Book("3","javaweb","老方",79,"一本好书"));
map.put("4", new Book("4","struts","老方",89,"一本好书"));
map.put("5", new Book("5","hibernate","老方",49,"一本好书"));
map.put("6", new Book("6","android","老黎",39,"一本好书"));
}
public static Map<String, Book> getAll(){
return map;
}
}
BookDao位于dao包
package cn.itcast.dao;
import java.util.Map;
import cn.itcast.db.DB;
import cn.itcast.domain.Book;
public class BookDao {
public Map<String , Book> getAll(){
return DB.getAll();
}
public Book find(String id){
return DB.getAll().get(id);
}
}
Book位于domain包
package cn.itcast.domain;
public class Book {
private String id;
private String name;
private String author;
private double price;
private String description;
public Book() {
super();
}
public Book(String id, String name, String author, double price,
String description) {
super();
this.id = id;
this.name = name;
this.author = author;
this.price = price;
this.description = description;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Cart位于domain包
package cn.itcast.domain;
import java.util.LinkedHashMap;
import java.util.Map;
public class Cart {
//购物车里面有所有购物项(CartItem),用map维护,键盘是id号,值是购物项(book和数目)
private Map<String,CartItem> map=new LinkedHashMap<String,CartItem>();
private double price;//购物车的总价值
//方法添加书(分情况讨论)
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{
//否则,书已经有了,就把数量加1
item.setQuantity(item.getQuantity()+1);
}
}
public Map<String, CartItem> getMap() {
return map;
}
public void setMap(Map<String, CartItem> map) {
this.map = map;
}
public double getPrice() {
//迭代map算出购物车的总价值
double totalPrice=0;
for (Map.Entry<String,CartItem> entry : map.entrySet()) {
CartItem item=entry.getValue();
totalPrice+=item.getPrice();
}
this.price=totalPrice;
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
CartItem位于domain包
package cn.itcast.domain;
public class CartItem {
private Book book;
private int quantity;
private double price;//代表单种商品的总计
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;
this.price=this.book.getPrice()*this.quantity;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
ListBookServlet位于web.controller包
package cn.itcast.web.controller;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.Book;
import cn.itcast.service.BusinessService;
public class ListBookServlet extends HttpServlet {
/*当在首页上点击超链接:显示所有书籍时,转到这儿
* ListBookServlet调用BusinessService业务服务取出所有书的集合
* 将集合存到request域里面,
* 转发到listbook.jsp,由listbook.jsp从域里面取出所有书籍显示
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BusinessService service=new BusinessService();
Map<String, Book> map=service.getAll();
request.setAttribute("map", map);
request.getRequestDispatcher("/WEB-INF/jsp/listbook.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
BusinessService位于service包
package cn.itcast.service;
import java.util.Map;
import cn.itcast.dao.BookDao;
import cn.itcast.domain.Book;
import cn.itcast.domain.Cart;
public class BusinessService {
//对外提供所有的业务服务
BookDao dao=new BookDao();
//服务1:得到所有书
public Map<String, Book> getAll(){
return dao.getAll();
}
//服务2:根据id查找某书
public Book find(String id){
return dao.find(id);
}
//服务3:根据id和购物车cart,移除购物车的map集合里对应的购物项
public void deleteCartItem(String id, Cart cart) {
cart.getMap().remove(id);
}
//服务4:将购物车cart里面的成员map清空
public void clearCart(Cart cart) {
cart.getMap().clear();
}
//服务4:设置购物车cart的成员map中的值(CartItem)的数量
public void changeItemQuantity(String id, String quantity, Cart cart) {
cart.getMap().get(id).setQuantity(Integer.parseInt(quantity));
}
}
BuyServlet位于web.controller包
package cn.itcast.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.Book;
import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;
public class BuyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id=request.getParameter("id");
BusinessService service=new BusinessService();
Book book=service.find(id);
//从Session得到用户的购物车Cart,将book添加进去
Cart cart=(Cart) request.getSession().getAttribute("cart");
//用户第一次买,没有购物车,为其创建一个Cart,并存到session
if (cart==null) {
cart=new Cart();
request.getSession().setAttribute("cart", cart);
}
//至此,每个用户都有一个购物车Cart
cart.add(book);
//完成购买后,跳转到购物车显示页面(listcart.jsp)
//request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
//跳转到购物车,使用重定向,由于WEB-INF禁止浏览器访问,先跳ListCartServlet
String path=request.getContextPath();///day10
response.sendRedirect(path+"/servlet/ListCartServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
deleteItemServlet位于web.controller包
package cn.itcast.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;
public class deleteItemServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 调用service删除购物车里指定的购物项
*/
String id=request.getParameter("id");
Cart cart=(Cart) request.getSession().getAttribute("cart");
BusinessService service=new BusinessService();
service.deleteCartItem(id,cart);
//删除成功后,依然跳回listcart.jsp(转发-刷新会再删一次)
//request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
//跳转到购物车,使用重定向,由于WEB-INF禁止浏览器访问,先跳ListCartServlet
String path=request.getContextPath();///day10
response.sendRedirect(path+"/servlet/ListCartServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ClearCartServlet位于web.controller包
package cn.itcast.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;
public class ClearCartServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 调用service的方法,清空购物车!
*/
Cart cart=(Cart) request.getSession(false).getAttribute("cart");
BusinessService service=new BusinessService();
service.clearCart(cart);
//清空cart里面的map后,依然跳回listcart.jsp(转发-刷新会再清空一次,无所谓!)
//request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
//跳转到购物车,使用重定向,由于WEB-INF禁止浏览器访问,先跳ListCartServlet
String path=request.getContextPath();///day10
response.sendRedirect(path+"/servlet/ListCartServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ChangeQuantityServlet位于web.controller包
package cn.itcast.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;
public class ChangeQuantityServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 将购物车中cart的书修改为指定数量
*/
String id=request.getParameter("id");
String quantity=request.getParameter("quantity");
String regex="[1-9]\\d*";
boolean b=quantity.matches(regex);
if(!b){
request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
return;
}
Cart cart=(Cart) request.getSession().getAttribute("cart");
BusinessService service=new BusinessService();
service.changeItemQuantity(id,quantity,cart);
//设置购物车cart的成员map中的值(CartItem)的数量后,跳回listcart.jsp(转发-刷新会再设置一次,无所谓!)
//request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
//跳转到购物车,使用重定向,由于WEB-INF禁止浏览器访问,先跳ListCartServlet
String path=request.getContextPath();///day10
response.sendRedirect(path+"/servlet/ListCartServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ListCartServlet位于web.UI包
package cn.itcast.web.ui;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ListCartServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
index.jsp位于web应用根目录
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>网站首页</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
</head>
<a href="${pageContext.request.contextPath }/servlet/ListBookServlet">浏览书籍</a>
<body>
</body>
</html>
listbook.jsp位于WEB-INF/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>书籍列表页面</title>
</head>
<body style="text-align: center;">
<h2>书籍列表</h2>
<table width="70%" border="1">
<tr>
<td>书名</td>
<td>作者</td>
<td>售价</td>
<td>操作</td>
<td>描述</td>
</tr>
<c:forEach var="entry" items="${map}">
<tr>
<td>${entry.value.name }</td>
<td>${entry.value.author }</td>
<td>${entry.value.price }</td>
<td>${entry.value.description }</td>
<td><a href="${pageContext.request.contextPath }/servlet/BuyServlet?id=${entry.value.id }" target="_blank">购买</a> </td>
</tr>
</c:forEach>
</table>
</body>
</html>
listcart.jsp位于WEB-INF/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>购物车列表</title>
<script type="text/javascript">
/*因为是先加载,所以传id进来*/
function deleteItem(id){
var b=window.confirm("您确认删除吗?");
if(b){
window.location.href="${pageContext.request.contextPath }/servlet/deleteItemServlet?id="+id;
}
}
function clearCart(){
var b=window.confirm("您确认删除吗?");
if(b){
window.location.href="${pageContext.request.contextPath }/servlet/ClearCartServlet";
}
}
function changeQuantity(input,id,oldNum){
var quantity=input.value;
/*
//先检查是不是数字
if(isNaN(quantity)){
alert("请输入正整数!");
input.value=oldNum;
return;
}*/
if(quantity<0||quantity!=parseInt(quantity)){
input.value=oldNum;
alert("请输入正整数!");
input.focus();
return;
}
var b=window.confirm("您确定购买"+quantity+"本吗?");
if(b){
window.location.href="${pageContext.request.contextPath }/servlet/ChangeQuantityServlet?id="+id+"&quantity="+quantity;
}else{
input.value=oldNum;
}
}
</script>
</head>
<body style="text-align: center;">
<h2>购物车列表</h2>
<c:if test="${empty(cart.map)}">
您尚未购买任何商品
<a href="${pageContext.request.contextPath }/servlet/ListBookServlet">浏览书籍</a>
</c:if>
<c:if test="${!empty(cart.map)}">
<table width="70%" border="1">
<tr>
<td>书名</td>
<td>作者</td>
<td>单价</td>
<td>数量</td>
<td>小计</td>
<td>操作</td>
</tr>
<c:forEach var="entry" items="${cart.map}">
<tr>
<td>${entry.value.book.name }</td>
<td>${entry.value.book.author }</td>
<td>${entry.value.book.price }</td>
<td><input style="width: 35px;" type="text" value="${entry.value.quantity}" οnchange="changeQuantity(this,${entry.key },${entry.value.quantity})"/> </td>
<td>${entry.value.price}</td>
<td><a href="javascript:void(0)" οnclick="deleteItem(${entry.key })">删除</a> </td>
</tr>
</c:forEach>
<tr>
<td colspan="3">总计</td>
<td colspan="2">${cart.price }元</td>
<td>
<a href="javascript:void(0)" οnclick="clearCart()">清空购物车</a>
</td>
</tr>
</table>
</c:if>
</body>
</html>