基于Javabean与JSP的购物车功能

来源:互联网 发布:linux yum snmp 安装 编辑:程序博客网 时间:2024/06/05 15:00

浅谈实现基于Javabean与JSP的购物车功能

  首先呢,在买了东西之后要放在购物车里,当车子里的物品有相同时就叠加,不再创建物品对象,有了物品之后肯 定要有价格,数量等等对象。这些对象我们要封装在JAVABEAN 中的!有了Javabean就需要建立SERVLET来进行与业务层连接,我们就需要有,增加购物车,删除购物车,清楚购物车等一系列的Servlet和SERVICE层连接!SERVICE层调用DAO层,这些步骤正体现出了MVC的设计模式!下面我们看具体的实现基于Javabean与JSP的购物车功能吧!

  (1) 1. 代表购物车的ShoppingCart 类

  1. public class ShoppingCart {
  2. //装载 ShoppingCartItem 的数据结构: Map, 键: 书的 id, 值: 书对应的 ShoppingCartItem
  3. private Map<String, ShoppingCartItem> books = null;
  4. public ShoppingCart(){
  5. books = new HashMap<String, ShoppingCartItem>();
  6. }
  7. public Map<String, ShoppingCartItem> getBooks() {
  8. return books;
  9. }
  10. public Book getBook(String bookId){
  11. Book book = null;
  12. ShoppingCartItem sci = this.books.get(bookId);
  13. if (sci == null)
  14. return null;
  15. return sci.getBook ();
  16. }
  17. public float getTotalPrice(){
  18. float totalPrice = 0.0f;
  19. //对 books 中的 value 进行遍历, 取其 price 属性的和
  20. Iterator<ShoppingCartItem> iterator = books.values().iterator ();
  21. while(iterator.hasNext()){
  22. ShoppingCartItem sci = iterator.next();
  23. totalPrice += sci.getPrice();
  24. }
  25. return totalPrice;
  26. }
  27. public int getTotalQuantity(){
  28. int quantity = 0;
  29. //对 books 中的 value 进行遍历, 取其 quantity 属性的和
  30. Iterator<ShoppingCartItem> iterator = books.values().iterator();
  31. while(iterator.hasNext()) {
  32. ShoppingCartItem sci = iterator.next();
  33. quantity += sci.getQuantity();
  34. }
  35. return quantity;
  36. }
  37. public boolean isExistInShoppingCart(String bookId){
  38. return this.books.get(bookId) != null;
  39. }
  40. public ShoppingCartItem getShoppingCartItemByBookId(String bookId){
  41. return this.books.get(bookId);
  42. }
  43. public void addNewItemToShoppingCart(ShoppingCartItem sci) {
  44. this.books.put(sci.getBook().getId(), sci);
  45. }
  46. }

2. 代表购物车中的物品

  1. public class ShoppingCartItem {
  2. //具体指向某本书
  3. private Book book;
  4. //当前商品在购物车中的数量
  5. private int quantity;
  6. public ShoppingCartItem(Book book) {
  7. this.book = book;
  8. this.quantity = 1;
  9. }
  10. //当前商品的总价格
  11. private float price;
  12. public void incrementQuantity(){
  13. this.quantity++;
  14. }
  15. public Book getBook() {
  16. return book;
  17. }
  18. public void setBook(Book book) {
  19. this.book = book;
  20. }
  21. public int getQuantity() {
  22. return quantity;
  23. }
  24. public void setQuantity(int quantity) {
  25. this.quantity = quantity;
  26. }
  27. public float getPrice() {
  28. return this.book.getPrice() * this.quantity;
  29. }
  30. }

(2)建立DAO,此时有人会问,这次DAO为什么没有购物车呢,因为购物车是没有数据的,而是里面的物品才有 数据的,当有更新购物车里面的物品时才会早DAO里面写方法!

  1. public class BookDAO {
  2. //
  3. public void upadateBookQuantityByBookId(Connection conn, String bookId, int quantity){
  4. String sql = "UPDATE books SET saleAmount = saleAmount + ? WHERE id = ?";
  5. Object [] params = new Object[]{quantity, bookId};
  6. QueryRunner queryRunner = new QueryRunner ();
  7. try {
  8. queryRunner.update(conn, sql, params);
  9. } catch (SQLException e) {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. throw new RuntimeException (MyBookStoreConstants.UPDATE_BOOK_SALEAMOUNT_BY_BOOK_ID_EXCEPTION);
  13. }
  14. }

(3) 建立业务层,涉及到添加,清空等方法!这边佟刚老师的代码都有详细的解释!

  1. public class BookService {
  2. //根据给定的 ShoppingCart 对象, 调用 DAO 方法进行数据库更新操作
  3. public void buyBooks(ShoppingCart sc){
  4. //对 sc 中的 ShoppingCartItem 对象进行遍历, 调用 BookDAO.upadateBookQuantityByBookId 方法
  5. Connection conn = null;
  6. conn = DBHelper.getConnection();
  7. try {
  8. Iterator<ShoppingCartItem> shoppingCartItemSet = sc.getBooks().values ().iterator();
  9. BookDAO bookDAO = new BookDAO ();
  10. while(shoppingCartItemSet.hasNext()) {
  11. ShoppingCartItem sci = shoppingCartItemSet.next ();
  12. String bookId = sci.getBook().getId ();
  13. int quantity = sci.getQuantity ();
  14. bookDAO.upadateBookQuantityByBookId(conn, bookId, quantity);
  15. }
  16. }finally {
  17. DBHelper.releaseDBSource(null, null, conn);
  18. }
  19. }
  20. //参数 items 中的键为 书的 id 号, 值为购 物车中对应的 数量
  21. public void updateShoppingCart(Map<String,Integer> items, ShoppingCart sc){
  22. Set<String> keySet = null;
  23. keySet = items.keySet ();
  24. for(Iterator<String> it = keySet.iterator(); it.hasNext(); ) {
  25. String bookId = it.next();
  26. int quantity = items.get (bookId);
  27. if(quantity <= 0) {
  28. sc.getBooks().remove(bookId);
  29. }else {
  30. sc.getShoppingCartItemByBookId(bookId).setQuantity (quantity);
  31. }
  32. }
  33. }
  34. //清空购物车
  35. public void clearShoppingCart(ShoppingCart sc) {
  36. sc.getBooks().clear();
  37. }
  38. public void deleteShoppingCartItemById(String id, ShoppingCart sc){
  39. //删除 sc 中的 id 元素
  40. sc.getBooks().remove(id);
  41. }
  42. //把 id 对应的 ShoppingCartItem 对象放入购物车 ShoppingCart 对象中
  43. public void addToShoppingCart(String id, ShoppingCart sc) {
  44. //1. 查看 sc 中有没有 id 对应的 ShoppingCartItem 对象
  45. if(sc.isExistInShoppingCart(id)){
  46. //1.1 有: 把该对象取出, 使其数量 + 1, 调用 sci.increseQuantity(); 方法
  47. ShoppingCartItem scsci = sc.getShoppingCartItemByBookId(id);
  48. sci.incrementQuantity();
  49. }
  50. //1.2 没有: 创建一个新的 ShoppingCartItem 对象, 并将其放入 sc 中, 以书的 id 作为键
  51. else{
  52. //1.2.1 根据 id 获取相应的 Book 对象, 调用 BookDAO 的 selectBookByBookId() 方法
  53. Book book = null;
  54. BookDAO bookDAO = null;
  55. bookDAO = new BookDAO();
  56. book = bookDAO.selectBookByBookId(id);
  57. ShoppingCartItem sci = null;
  58. sci = new ShoppingCartItem (book);
  59. sc.addNewItemToShoppingCart(sci);
  60. }
  61. }
  62. }

(4)这段是 检查购物车是有对象的,这里单独拿出来是可以很好的在WEB开发中很好的进行重用 的。

  1. public class MyBookStoreUtils {
  2. private MyBookStoreUtils(){}
  3. public static ShoppingCart getShppingCartForCreateOrExist(HttpServletRequest request) {
  4. ShoppingCart sc = null;
  5. //2.1 检查在 HttpSession 对象中有没有购物车对象 , 即检查 session 中是否有 MyBookStoreConstants.SHOOPING_CART_KEY 属性
  6. // 若 已经存在, 说明购物车存在, 直接取出
  7. HttpSession session = null;
  8. session = request.getSession();
  9. Object obj = session.getAttribute (MyBookStoreConstants.SHOOPING_CART_KEY);
  10. if(obj != null) {
  11. sc = (ShoppingCart) obj;
  12. }
  13. //2.2 若不存在 MyBookStoreConstants.SHOOPING_CART_KEY 属性, 创建一个购物车对象, 并把该对象放入 Session 中
  14. else{
  15. sc = new ShoppingCart ();
  16. session.setAttribute(MyBookStoreConstants.SHOOPING_CART_KEY, sc);
  17. }
  18. return sc;
  19. }
  20. public static ShoppingCart getShppingCartForExist(HttpServletRequest request) {
  21. ShoppingCart sc = null;
  22. //2.1 检查在 HttpSession 对象中有没有购物车对象 , 即检查 session 中是否有 MyBookStoreConstants.SHOOPING_CART_KEY 属性
  23. // 若 已经存在, 说明购物车存在, 直接取出
  24. HttpSession session = null;
  25. session = request.getSession();
  26. Object obj = session.getAttribute (MyBookStoreConstants.SHOOPING_CART_KEY);
  27. if(obj != null) {
  28. sc = (ShoppingCart) obj;
  29. }
  30. //2.2 若不存在 MyBookStoreConstants.SHOOPING_CART_KEY 属性, 抛出异常, 提示用户还不存在购物车.
  31. else {
  32. throw new RuntimeException (MyBookStoreConstants.NO_SHOPPING_CART_EXCETPION);
  33. }
  34. return sc;
  35. }
  36. }

(5)这里是所有与购物车相关的SERVLET.

这个是更新数据的,需要在SERVICE中调用DAO的!

  1. public class UpdateShoppingCartServlet extends HttpServlet {
  2. public void doPost(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. //获取表单信息
  5. // request.getParameter(""); 方法行不通, 因为表单的 name 是随时变化的
  6. //获取表单中的所有 name
  7. Enumeration<String> nameEnums = request.getParameterNames();
  8. Map items = new HashMap<String, Integer>();
  9. //遍历 nameEnums, 再取出对应的 Value, 封装到 items 中
  10. try {
  11. while(nameEnums.hasMoreElements()) {
  12. String bookId = nameEnums.nextElement();
  13. String quantity = request.getParameter (bookId);
  14. items.put(bookId, Integer.parseInt (quantity));
  15. }
  16. } catch (NumberFormatException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace ();
  19. throw new RuntimeException (MyBookStoreConstants.QUANTITY_FORMAT_EXCEPTION);
  20. }
  21. //获 取购物车对象
  22. ShoppingCart sc = null;
  23. sc = MyBookStoreUtils.getShppingCartForExist(request);
  24. //调用 Service 方法
  25. BookService bookService = new BookService ();
  26. bookService.updateShoppingCart(items, sc);
  27. //派发页面 : showShoppingCart.jsp 页面
  28. String forwardPage = "/WEB- INF/jsp/showShoppingCart.jsp";
  29. request.getRequestDispatcher(forwardPage).forward (request, response);
  30. }
  31. }
  32. public class ShowShoppingCartServlet extends HttpServlet {
  33. public void doGet(HttpServletRequest request, HttpServletResponse response)
  34. throws ServletException, IOException {
  35. //做一个转发
  36. String forwardPage = null;
  37. forwardPage = "/WEB- INF/jsp/showShoppingCart.jsp";
  38. RequestDispatcher dispatcher = null;
  39. dispatcher = request.getRequestDispatcher (forwardPage);
  40. dispatcher.forward(request, response);
  41. }
  42. }
  43. public class ReceiptServlet extends HttpServlet {
  44. public void doPost(HttpServletRequest request, HttpServletResponse response)
  45. throws ServletException, IOException {
  46. //1. 获取表单信息: name 和 cardId
  47. //2. 调用 Service 方法, 更新 books 表各条 book 的 saleAmount 字段
  48. //2.1 获取购物车
  49. ShoppingCart sc = MyBookStoreUtils.getShppingCartForExist(request);
  50. BookService bookService = new BookService();
  51. bookService.buyBooks (sc);
  52. //2.1 使 Session 失效
  53. HttpSession session = null;
  54. session = request.getSession();
  55. session.invalidate ();
  56. //3. 派发页面: receipt.jsp 页面
  57. request.getRequestDispatcher("/WEB-INF/jsp/receipt.jsp").forward(request, response);
  58. }
  59. }

这段我先开始很纳闷老师为什么会这样写呢,其实很简单,写个专门的转发的SERVLET这样,在每次转发的时候就只连接一个servlet比连接多个更来的简洁!提高了效率!

  1. public class ForwardServlet extends HttpServlet {
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. //1. 获取 path
  5. String path = request.getParameter("path");
  6. //2. 派 发页面
  7. request.getRequestDispatcher(path).forward(request, response);
  8. }
  9. }
  10. public class DeleteShoppingCartItemServlet extends HttpServlet {
  11. public void doGet(HttpServletRequest request, HttpServletResponse response)
  12. throws ServletException, IOException {
  13. //1. 获取 id 号
  14. String id = request.getParameter("bookid");
  15. //2. 调用 BookService 方法 deleteShoppingCartItemById:, 进行删除操作
  16. ShoppingCart sc = MyBookStoreUtils.getShppingCartForExist(request);
  17. String bookTitle = sc.getBook(id).getTitle();
  18. BookService bookService = new BookService ();
  19. bookService.deleteShoppingCartItemById(id, sc);
  20. //3. 派发页面
  21. request.setAttribute(MyBookStoreConstants.DELETE_FROM_SHOPPING_CART_BOOK_TITLE, bookTitle);
  22. String forwardPage = "/WEB- INF/jsp/showShoppingCart.jsp";
  23. //4. 判断购物车是否为空, 若为空则派发到 emptyCart.jsp 页面
  24. if(sc.getBooks().isEmpty())
  25. forwardPage = "/WEB- INF/jsp/emptyCart.jsp";
  26. RequestDispatcher dispatcher = null;
  27. dispatcher = request.getRequestDispatcher (forwardPage);
  28. dispatcher.forward(request, response);
  29. }
  30. }

这里是清空购物车的SERVLET.

  1. public class ClearShoppingCartServlet extends HttpServlet {
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. //1. 调用方法
  5. BookService bookService = new BookService ();
  6. ShoppingCart sc = null;
  7. sc = MyBookStoreUtils.getShppingCartForExist (request);
  8. bookService.clearShoppingCart (sc);
  9. //2. 派发页面
  10. String forwardPage = null;
  11. forwardPage = "/WEB- INF/jsp/emptyCart.jsp";
  12. RequestDispatcher dispatcher = request.getRequestDispatcher(forwardPage);
  13. dispatcher.forward(request, response);
  14. }
  15. }
  16. public class AddToShoppingCartServlet extends HttpServlet {
  17. public void doGet(HttpServletRequest request, HttpServletResponse response)
  18. throws ServletException, IOException {
  19. //1. 获取书的 id 号
  20. String bookId = null;
  21. bookId = request.getParameter("bookId");
  22. //2. 获取 购物车对象: 调用 getShppingCart 方法
  23. ShoppingCart sc = null;
  24. sc = MyBookStoreUtils.getShppingCartForCreateOrExist(request);
  25. //3. 调用 Service 方法把 id 对应的 ShoppingCartItem 对象放入购物车 ShoppingCart 对象中: addToShoppingCart(id, shoppingCart);
  26. BookService bookService = null;
  27. bookService = new BookService();
  28. bookService.addToShoppingCart(bookId, sc);
  29. //4. 派发页面
  30. String forwardPage = "/index.jsp";
  31. //4.1 获取书名
  32. String bookTitle = null;
  33. //bookTitle = sc.getBooks().get(bookId).getBook().getTitle ();
  34. bookTitle = sc.getBook(bookId).getTitle();
  35. //4.2 将书 名放入请求域中, 以让页面进行显示
  36. request.setAttribute (MyBookStoreConstants.ADD_TO_SHOPPING_CART_BOOK_TITLE, bookTitle);
  37. RequestDispatcher dispatcher = null;
  38. dispatcher = request.getRequestDispatcher (forwardPage);
  39. dispatcher.forward(request, response);
  40. }
  41. }

(6)下面是显示层,对应着其相应的SERVLET.下面的JSP页面运用到了我们前段时间学的JSTL,EL表示.
'cashier.jsp'

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% >
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4. <head>
  5. <title>My JSP 'cashier.jsp' starting page</title>
  6. </head>
  7. <body>
  8. <center>
  9. <br><br>
  10. 您一共购买 了 ${sessionScope.shoppingcartkey.totalQuantity} 本书
  11. <br><br>
  12. 您应付金额 是:${sessionScope.shoppingcartkey.totalPrice} 元。
  13. <br><br>
  14. <form action="receiptServlet" method="POST">
  15. <table>
  16. <tr>
  17. <td>信用卡用户 名:</td>
  18. <td><input type="text" name="userName"/></td>
  19. </tr>
  20. <tr>
  21. <td>信用卡帐号:</td>
  22. <td><input type="text" name="cardId"/></td>
  23. </tr>
  24. <tr align="center">
  25. <td colspan="2">
  26. <input type="submit" value="递交 "/>
  27. </td>
  28. </tr>
  29. </table>
  30. </form>
  31. </center>
  32. </body>
  33. </html>
  34. 'receipt.jsp'
  35. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  36. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  37. <html>
  38. <head>
  39. <title>My JSP 'emptyCart.jsp' starting page</title>
  40. </head>
  41. <body>
  42. <center>
  43. <br><br>
  44. 您的购物车 为空<br><br>
  45. <a href="${pageContext.request.contextPath }/index.jsp">继续购物<a>
  46. </center>
  47. </body>
  48. </html>
  49. <%@ page language="java" import="java.util.*" pageEncoding="UTF- 8"%>
  50. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  51. <html>
  52. <head>
  53. <title>My JSP 'receipt.jsp' starting page</title>
  54. </head>
  55. <body>
  56. 再见: ${param.userName }<br><br>
  57. <a href="${pageContext.request.contextPath }/index.jsp">继续购物</a>&nbsp;&nbsp;
  58. </body>
  59. </html>
  60. 'showShoppingCart.jsp'
  61. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% >
  62. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  63. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  64. <html>
  65. <head>
  66. <title>My JSP 'showShoppingCart.jsp' starting page</title>
  67. </head>
  68. <body>
  69. <center>
  70. <c:if test="${requestScope.deleteToShoppingCartBookTitle != null}">
  71. <br><br>
  72. 您已经把 ${requestScope.deleteToShoppingCartBookTitle} 从购物车中删除了!
  73. </c:if>
  74. <br><br>
  75. 您的购物车中一共有 ${sessionScope.shoppingcartkey.totalQuantity} 本书
  76. <br><br>
  77. <form action="updateShoppingCartServlet" method="POST">
  78. <table cellpadding="10" cellspacing="0">
  79. <tr>
  80. <th>书名</th>
  81. <th>价 格</th>
  82. <th>数量 </th>
  83. <td></td>
  84. </tr>
  85. <c:forEach items="${sessionScope.shoppingcartkey.books}" var="sci">
  86. <tr>
  87. <td>${sci.value.book.title }</td>
  88. <td>${sci.value.book.price }</td>
  89. <td><input type="text" value="${sci.value.quantity }" name="${sci.key }" size="2" /></td>
  90. <td><a href="${pageContext.request.contextPath }/deleteShoppingCartItemServlet?bookid=${sci.key }">删除 </a></td>
  91. <td></td>
  92. </tr>
  93. </c:forEach>
  94. </table>
  95. <input type="submit" value="保存修 改">
  96. </form>
  97. <br>
  98. 总价格: ${sessionScope.shoppingcartkey.totalPrice}
  99. <br><br>
  100. <a href="${pageContext.request.contextPath }/index.jsp">继续购物 </a>&nbsp;&nbsp;
  101. <a href="${pageContext.request.contextPath }/clearShoppingCartServlet">清空购物车 </a>&nbsp;&nbsp;
  102. <a href="${pageContext.request.contextPath }/forwardServlet?path=cashier.jsp">付账 </a>
  103. </center>
  104. </body>
  105. </html>

  这样子简易JSP购物车算是完成了,当然这个JSP购物车只是简单的运用,没有涉及到大量的数据,作为入门的教学的例子是完全值得我们这些初学者消化的了!通过这次JSP购物车的联系,我对MVC的设计模式有了深刻的了解!不过其中的一些细节,还是需要我自己去慢慢的体会的!比如分页就是一个值得我去好好去研究的例子!

原创粉丝点击