终极完美《简易商城购物车系统》揭秘--MVC设计模式
《简易商城购物系统》
大家经常去网上够物,对网上所谓的购物车应该不会陌生吧,那么今天我们就用使用javaweb的MVC设计模式来实现一个网上购物系统的案例。
最终效果如下:
三层架构的简单介绍
一、开发步骤
首先要搞清楚你要做什么,然后:
1.搭建开发环境
jstl.jar
standard.jar
2.建立类包
3.建立数据库
使用内存数据库
总之,此购物车的实现,使用的是MVC设计模式,MVC设计模式的思路就是从jsp--javabean—servlet--jsp页面做显示
流程图:
图一:MVC设计模式的简介
图二:购物系统案例的实现思路:
图三:设计购物车页面
节日正式开始,精彩不容错过。。。。
1.写一个jsp购物页面
<%@ 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> <title>飘叶网上商城</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"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <hr/> <h2 >欢迎进入飘叶网上购物商城</h2> <hr> <a href="${pageContext.request.contextPath}/ListBookServlet">进入购物页面</a> <br> </body> </html>
2.写一个javabean
package cn.itcast.cart.domain; public class Book { private String id; private String name;//书名 private String author;//作者 private int price; public Book() { super(); // TODO Auto-generated constructor stub } public Book(String id, String name, String author, int price) { super(); this.id = id; this.name = name; this.author = author; this.price = price; } 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 int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }
3.建立DB,用Map集合来模拟数据库
package cn.itcast.cart.domain; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; public class DB { // 使用map集合来模拟数据库 private static Map<String , Book> books=new LinkedHashMap<String, Book>(); static{ books.put("1", new Book("1", "《水浒传》", "施耐庵", 48)); books.put("2", new Book("2", "《西游记》", "吴承恩 ", 58)); books.put("3", new Book("3", "《三国演义》", "罗贯中", 78)); books.put("4", new Book("4", "《红楼梦》", "曹雪芹", 28)); books.put("5", new Book("5", "《平凡的世界》", "路遥", 18)); } // 获得所有图书 // 获得所有图书 public static Collection<Book> getAll() { return books.values(); } // 根据id查找图书 public static Book find(String id) { return books.get(id); } }
4.用javabean建立一个购物车对象
package cn.itcast.cart.domain; public class ShoppingcartItem { //购物车项,每一本书买了多少本,总共多少钱 private Book book; private int quantity; private int 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()*quantity; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }
购物车—cart
package cn.itcast.cart.domain; import java.util.HashMap; import java.util.Map; //购物车对象 public class Shoppingcart { private Map<String, ShoppingcartItem> items=new HashMap<String, ShoppingcartItem>(); private int price;//总价 public Map<String, ShoppingcartItem> getItems() { return items; } public void setItems(Map<String, ShoppingcartItem> items) { this.items = items; } public int getPrice() { //计算总价 int price=0; for(ShoppingcartItem item:items.values()) { price+=item.getPrice(); } return price; } public void setPrice(int price) { this.price = price; } }
5、获得图书商品列表的servlet—ListBookServlet.java
package cn.itcast.cart.web.servlet; import java.io.IOException; import java.util.Collection; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.itcast.cart.domain.Book; import cn.itcast.cart.domain.DB; public class ListBookServlet extends HttpServlet { //从DB中查询所有的图书 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //查询所有的商品 Collection<Book> books = DB.getAll(); // 转发给jsp显示 request.setAttribute("books", books); request.getRequestDispatcher("/WEB-INF/pages/listbook.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
6.servlet处理完的数据转发到一个展示商品的页面—listbook.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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>显示所有的商品</title> <script type="text/javascript"> function buy(id){ window.location = "${pageContext.request.contextPath}/BuyServlet?id="+id; } </script> </head> <body style="text-align: center"> <h1 >商品列表</h1> <table border="1" width="400px"> <tr> <td>图书名称</td> <td>作者</td> <td>价格</td> <td>购买</td> </tr> <c:forEach var="book" items="${requestScope.books}"> <tr> <td>${book.name}</td> <td>${book.author}</td> <td>${book.price}</td> <td> <input type="button" value="购买" onclick="buy(${book.id})"/> </td> </tr> </c:forEach> </table> </body> </html>
7.写一个购买处理的servlet
package cn.itcast.cart.web.servlet; 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.cart.domain.Book; import cn.itcast.cart.domain.DB; import cn.itcast.cart.domain.Shoppingcart; import cn.itcast.cart.domain.ShoppingcartItem; public class BuyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //购买页面 //获得图书 String id=request.getParameter("id"); Book book=DB.find(id); // 获得购物车 Shoppingcart cart = (Shoppingcart) request.getSession().getAttribute("cart"); if(cart==null){ //首次购物 cart=new Shoppingcart(); request.getSession().setAttribute("cart", cart); } // 商品放入购物车 bookInCart(book,cart); // 跳转至购物车页面,是一个请求重定向的页面 response.sendRedirect(request.getContextPath()+"/ListCartServlet"); } //购物 private void bookInCart(Book book, Shoppingcart cart) {//判断是否买过 Map<String, ShoppingcartItem> items = cart.getItems(); ShoppingcartItem item = items.get(book.getId()); if(item==null){ //此书未买过,创建新条目 item=new ShoppingcartItem(); item.setBook(book); item.setQuantity(1); //条目存入购物车 items.put(book.getId(), item); }else{ //买过数量加1 item.setQuantity(item.getQuantity()+1); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
8.写一个获得购物车数据处理的servlet—ListCartServlet.java
package cn.itcast.cart.web.servlet; 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/pages/listcart.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
9.购买的东西放入购物车,继而转向购物车展示页面—listcart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 只要使用foreach就要导入下面的这句代码--%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!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>购物车页面</title> <script type="text/javascript"> function change(id,inputObj){ var quantity=inputObj.value; if(quantity==null || quantity=="") { alert("数量不能为空"); inputObj.value = defaultValue; return; } if(quantity.match(/^[1-9][0-9]*$/)==null) { alert("数量必须为正整数"); inputObj.value = defaultValue; return; } if(parseInt(quantity)>999) { alert("您购买的数量已达到团购标准,请致电800-820-8820"); inputObj.value = defaultValue; return; } window.location="${pageContext.request.contextPath}/UpdateServlet?id="+id+"&quantity="+quantity; } </script> </head> <body style="text-align: center"> <h1>我的购物车</h1><br> <hr> <table border="1" width="800px"> <tr> <td>商品名称</td> <td>单价</td> <td>数量</td> <td>小计</td> <td>操作</td> </tr> <%--map迭代完后都是entry--%> <c:forEach var="entry" items="${cart.items}"> <tr> <td>${entry.value.book.name}</td> <td>${entry.value.book.price}</td> <td> <input type="text" value="${entry.value.quantity}" onblur="change(${entry.key},this) " style="width: 40px;"/> </td> <td>${entry.value.price}</td> <td> <a href="${pageContext.request.contextPath}/DaleServlet?id=${entry.key }">删除</a> </td> </tr> </c:forEach> <tr> <td> <a href="${pageContext.request.contextPath}/clearServlet">清空购物车</a> </td> <td> <a href="${pageContext.request.contextPath}/ListBookServlet">继续购物</a> </td> <td> <a href="#">下订单</a> </td> <td colspan="2">购物车总价:¥${cart.price}元</td> </tr> </table> </body> </html>
下面就是实现购物车里面的一些操作功能
10.更新购物车,就是修改完数量后,自动更新购物车—UpdateServlet.java
package cn.itcast.cart.web.servlet; 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.cart.domain.Shoppingcart; import cn.itcast.cart.domain.ShoppingcartItem; public class UpdateServlet extends HttpServlet { //更新购物车 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得id和quantity String id=request.getParameter("id"); int quantity=Integer.parseInt(request.getParameter("quantity")); //获得购物车 Shoppingcart cart = (Shoppingcart) request.getSession().getAttribute("cart"); // 修改数量 /* Map<String, ShoppingcartItem> items = cart.getItems(); ShoppingcartItem item = items.get(id); item.setQuantity(quantity);*/ cart.getItems().get(id).setQuantity(quantity); // 跳转至购物车页面 response.sendRedirect(request.getContextPath() + "/ListCartServlet"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
11.删除购物车中的单行数据—DaleServlet.java
package cn.itcast.cart.web.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 cn.itcast.cart.domain.Shoppingcart; public class DaleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获得id String id = request.getParameter("id"); // 获得购物车 Shoppingcart cart = (Shoppingcart) request.getSession().getAttribute("cart"); //删除条目 cart.getItems().remove(id); // 跳转至购物车页面 response.sendRedirect(request.getContextPath()+"/ListCartServlet"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
12.清空购物车—clearServlet.java
package cn.itcast.cart.web.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 cn.itcast.cart.domain.Shoppingcart; public class clearServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获得购物车 Shoppingcart cart = (Shoppingcart) request.getSession().getAttribute("cart"); // 清空购物车 cart.getItems().clear(); // 跳转至购买页面 response.sendRedirect(request.getContextPath()+"/ListBookServlet"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
ok,忙碌到半夜,到此结束,下面看看我们的最终效果吧:
--------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
嘿嘿,没有美工处理的页面,还行,像那回事吧?
这上面的所有功能都可以实现的哦!
如果,这篇博客帮您解决了问题,不妨点击一下右下角的【推荐】。如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。因为,我的热情需要您的肯定和支持!感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends! |