您的位置:首页 > 编程语言 > Java开发

购物车的实现(jsp的session+Java的Map的结合)

2017-03-07 14:27 489 查看
1:电商如此发达的现在,作为一个web开发程序猿,如果不会写购物车,真是有点不好意思找工作。所以抓紧练习啊,从上篇博客中抽离出如何实现购物车的功能。
2:首先需要理解购物车实现的一些基本步骤。
  2.1:首先考虑我购买的是哪一本书籍或者那一件商品,是不是,这里可以使用id传参确定购买的是那一件商品或者书籍,也可以使用session中取出哪一本书籍,这里采用从session的取出那一件商品或者书籍
       代码如:

      Book book=(Book)session.getAttribute("book");
     2.2:第二考虑如何把书籍放到购物车中
         2.1.1:首先考虑是否有购物车,如果没有,则创建,如果有直接使用
         2.1.2:其次先将购物车从session中拿出来,不存在就创建。
    代码如:

      Map<Integer,CartItem> cart=(Map<Integer,CartItem>)session.getAttribute("cart");
        //如果没有购物车,那么创建,只有第一次访问才会操作
        if(cart==null){
           //new一个购物车
          cart=new HashMap<>();
        }
    2.3:考虑如何把书籍放到购物车中
       2.1.1:第一考虑购物车中是否有该书籍,所以先从购物车中获取该书籍,如果为空,那么没有该书籍
     代码如:

    CartItem item=(CartItem)cart.get(book.getBookid());
       if(item==null){
             //如果购物车中不存在该书籍,那么创建,且数量默认为1
               item=new CartItem();
               //将书籍放到购物车中
              item.setBook(book);
              //将书籍的默认数量为1
              item.setNumber(1);
          }else{
              //如果购物车中以及有该书籍,那么数量加1
              item.setNumber(item.getNumber()+1);
          }
    2.4:考虑如何把购物车项(即挑选的书籍是哪一个和书本的数量)放到购物车中
      代码如:

    cart.put(book.getBookid(),item);
    2.5:将购物车放到session中,方便后面取出来
      代码如:

  session.setAttribute("cart", cart);

3:下面是具体的实现,从创建数据表开始,数据表book字段和数据名称如下所示:

 


4:下面创建实体类book.java;

1 package com.bie.po;
2
3 import java.io.Serializable;
4
5 /**
6 * @author BieHongLi
7 * @version 创建时间:2017年2月27日 上午10:07:21
8 * 图书的实体类
9 */
10 public class Book implements Serializable{
11
12     //实体类实现序列化,避免后面出现异常
13     private static final long serialVersionUID = 1L;
14     private Integer bookid;
15     private String bookname;
16     private Double price;
17     private String author;
18     private String pic;
19     private String publish;
20     public Integer getBookid() {
21         return bookid;
22     }
23     public void setBookid(Integer bookid) {
24         this.bookid = bookid;
25     }
26     public String getBookname() {
27         return bookname;
28     }
29     public void setBookname(String bookname) {
30         this.bookname = bookname;
31     }
32     public Double getPrice() {
33         return price;
34     }
35     public void setPrice(Double price) {
36         this.price = price;
37     }
38     public String getAuthor() {
39         return author;
40     }
41     public void setAuthor(String author) {
42         this.author = author;
43     }
44     public String getPic() {
45         return pic;
46     }
47     public void set
1dd8e
Pic(String pic) {
48         this.pic = pic;
49     }
50     public String getPublish() {
51         return publish;
52     }
53     public void setPublish(String publish) {
54         this.publish = publish;
55     }
56     @Override
57     public String toString() {
58         return "Book [bookid=" + bookid + ", bookname=" + bookname + ", price=" + price + ", author=" + author
59                 + ", pic=" + pic + ", publish=" + publish + "]";
60     }
61
62
63 }


 5:创建好实体类接下来是写工具类BaseDao.java,用于连接数据库的操作,这些代码就不做多解释了,都已经写烂了。所以工具类一定要熟练书写

1 package com.bie.utils;
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.PreparedStatement;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8
9 /**
10 * @author BieHongLi
11 * @version 创建时间:2017年2月27日 上午10:09:00
12 * 连接数据库的工具类
13 */
14 public class BaseDao {
15
16     private static String driver="com.mysql.jdbc.Driver";
17     private static String url="jdbc:mysql:///test";
18     private static String user="root";
19     private static String password="123456";
20
21     /***
22      * 连接数据库的方法
23      * @return
24      * @throws ClassNotFoundException
25      * @throws SQLException
26      */
27     public static Connection getCon() throws ClassNotFoundException, SQLException{
28         Class.forName(driver);//加载数据库驱动
29         System.out.println("测试加载数据库成功");
30         Connection con=DriverManager.getConnection(url, user, password);
31         System.out.println("测试数据库链接成功");
32         return con;
33     }
34
35     /***
36      * 关闭数据库的方法
37      * @param con
38      * @param ps
39      * @param rs
40      */
41     public static void close(Connection con,PreparedStatement ps,ResultSet rs){
42         if(rs!=null){//关闭资源,避免出现异常
43             try {
44                 rs.close();
45             } catch (SQLException e) {
46                 // TODO Auto-generated catch block
47                 e.printStackTrace();
48             }
49         }
50         if(ps!=null){
51             try {
52                 ps.close();
53             } catch (SQLException e) {
54                 // TODO Auto-generated catch block
55                 e.printStackTrace();
56             }
57         }
58         if(con!=null){
59             try {
60                 con.close();
61             } catch (SQLException e) {
62                 // TODO Auto-generated catch block
63                 e.printStackTrace();
64             }
65         }
66     }
67
68     /***
69      * 同意增删改的方法
70      * @param sql
71      * @param arr
72      * @return
73      */
74     public static boolean addUpdateDelete(String sql,Object[] arr){
75         Connection con=null;
76         PreparedStatement ps=null;
77         try {
78             con=BaseDao.getCon();//第一步 :连接数据库的操作
79             ps=con.prepareStatement(sql);//第二步:预编译
80             //第三步:设置值
81             if(arr!=null && arr.length!=0){
82                 for(int i=0;i<arr.length;i++){
83                     ps.setObject(i+1, arr[i]);
84                 }
85             }
86             int count=ps.executeUpdate();//第四步:执行sql语句
87             if(count>0){
88                 return true;
89             }else{
90                 return false;
91             }
92         } catch (ClassNotFoundException e) {
93             // TODO Auto-generated catch block
94             e.printStackTrace();
95         } catch (SQLException e) {
96             // TODO Auto-generated catch block
97             e.printStackTrace();
98         }
99         return false;
100     }
101
102     public static void main(String[] args) {
103         try {
104             BaseDao.getCon();
105         } catch (ClassNotFoundException e) {
106             // TODO Auto-generated catch block
107             e.printStackTrace();
108         } catch (SQLException e) {
109             // TODO Auto-generated catch block
110             e.printStackTrace();
111         }
112     }
113 }


6:写好工具类就可以进行写dao层(数据交互层),service层(业务逻辑层),先写数据交互层dao层,使用先创建接口再实现接口的方法

1 package com.bie.dao;
2
3 import java.util.List;
4
5 import com.bie.po.Book;
6
7 /**
8 * @author BieHongLi
9 * @version 创建时间:2017年2月27日 上午10:11:21
10 *
11 */
12 public interface BookDao {
13
14     /***
15      * 图书的查询的方法
16      * @param sql
17      * @param arr
18      * @return
19      */
20     public List<Book> select(String sql,Object[] arr);
21
22     /***
23      * 按照图书编号进行查询
24      * @param id
25      * @return
26      */
27     public Book getBook(Integer id);
28 }


1 package com.bie.dao.impl;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import com.bie.dao.BookDao;
11 import com.bie.po.Book;
12 import com.bie.utils.BaseDao;
13
14 /**
15 * @author BieHongLi
16 * @version 创建时间:2017年2月27日 上午10:11:34
17 *
18 */
19 public class BookDaoImpl implements BookDao{
20
21     @Override
22     public List<Book> select(String sql, Object[] arr) {
23         Connection con=null;
24         PreparedStatement ps=null;
25         ResultSet rs=null;
26         try {
27             con=BaseDao.getCon();//第一步连接数据库
28             ps=con.prepareStatement(sql);//第二步:预编译
29             if(arr!=null){
30                 for(int i=0;i<arr.length;i++){
31                     ps.setObject(i+1, arr[i]);
32                 }
33             }
34             //第四步执行sql
35             rs=ps.executeQuery();
36             List<Book> list=new ArrayList<Book>();
37             while(rs.next()){
38                 Book book=new Book();
39                 book.setBookid(rs.getInt("bookid"));
40                 book.setBookname(rs.getString("bookname"));
41                 book.setPrice(rs.getDouble("price"));
42                 book.setAuthor(rs.getString("author"));
43                 book.setPic(rs.getString("pic"));
44                 book.setPublish(rs.getString("publish"));
45
46                 list.add(book);
47             }
48             return list;
49         } catch (ClassNotFoundException e) {
50             // TODO Auto-generated catch block
51             e.printStackTrace();
52         } catch (SQLException e) {
53             // TODO Auto-generated catch block
54             e.printStackTrace();
55         }finally{
56             //关闭资源,避免出现异常
57             BaseDao.close(con, ps, rs);
58         }
59
60         return null;
61     }
62
63     @Override
64     public Book getBook(Integer id) {
65         Connection con=null;
66         PreparedStatement ps=null;
67         ResultSet rs=null;
68         try {
69             con=BaseDao.getCon();//第一步连接数据库
70             String sql="select * from book where bookid = ? ";
71             ps=con.prepareStatement(sql);//第二步:预编译
72             ps.setInt(1, id);
73
74             //第四步执行sql
75             rs=ps.executeQuery();
76             while(rs.next()){
77                 Book books=new Book();
78                 books.setBookid(rs.getInt("bookid"));
79                 books.setBookname(rs.getString("bookname"));
80                 books.setPrice(rs.getDouble("price"));
81                 books.setAuthor(rs.getString("author"));
82                 books.setPic(rs.getString("pic"));
83                 books.setPublish(rs.getString("publish"));
84
85                 return books;
86             }
87         } catch (ClassNotFoundException e) {
88             // TODO Auto-generated catch block
89             e.printStackTrace();
90         } catch (SQLException e) {
91             // TODO Auto-generated catch block
92             e.printStackTrace();
93         }finally{
94             //关闭资源,避免出现异常
95             BaseDao.close(con, ps, rs);
96         }
97
98         return null;
99     }
100
101
102 }


7:写好dao层(数据交互层),就可以写service层(业务逻辑层),写业务逻辑层service层,也是使用先创建接口再实现接口的方法

1 package com.bie.service;
2
3 import java.util.List;
4
5 import com.bie.po.Book;
6
7 /**
8 * @author BieHongLi
9 * @version 创建时间:2017年2月27日 上午10:13:38
10 *
11 */
12 public interface BookService {
13
14     /***
15      * 图书信息查询的方法
16      * @return
17      */
18     public List<Book> select(Book book);
19
20     /***
21      * 根据id进行查询
22      * @param id
23      * @return
24      */
25     public Book getBook(Book book);
26 }


1 package com.bie.service.impl;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import com.bie.dao.BookDao;
7 import com.bie.dao.impl.BookDaoImpl;
8 import com.bie.po.Book;
9 import com.bie.service.BookService;
10
11 /**
12 * @author BieHongLi
13 * @version 创建时间:2017年2月27日 上午10:13:52
14 *
15 */
16 public class BookServiceImpl  implements BookService{
17
18 private BookDao dao=new BookDaoImpl();
19
20     public List<Book> select(Book book){
21         //String sql="select * from book ";
22         StringBuilder sql=new StringBuilder("select * from book where 1=1 ");
23         //sql语句
24         List<Object> list=new ArrayList<Object>();
25         if(book!=null){
26
27             if(book.getBookid()!=null && book.getBookid()!=0){
28                 sql.append(" and bookid=? ");
29                 list.add(book.getBookid());
30             }
31             /*list.add(book.getBookname());
32             list.add(book.getPrice());
33             list.add(book.getAuthor());
34             list.add(book.getPic());
35             list.add(book.getPublish());*/
36         }
37
38         return dao.select(sql.toString(), list.toArray());
39     }
40
41     @Override
42     public Book getBook(Book book) {
43         if(book.getBookid()!=null && book.getBookid()!=0){
44             return dao.getBook(book.getBookid());
45         }
46         return null;
47     }
48
49
50 }


8:最后按照正常开发的话就是servlet层,但是这里将servlet层的代码写到了jsp里面。所以下面jsp页面才是大戏

  先创建一个book.jsp页面,用于显示从数据库查询到的图书数据

1 <%@page import="java.util.List"%>
2 <%@page import="com.bie.service.impl.BookServiceImpl"%>
3 <%@page import="com.bie.po.Book"%>
4 <%@ page language="java" contentType="text/html; charset=UTF-8"
5     pageEncoding="UTF-8"%>
6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
7 <html>
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
10 <title>图书列表的页面</title>
11 </head>
12 <body>
13 <%
14     //图书的实体类创建一个对象
15     Book book=new Book();
16     //图书的业务逻辑层层
17     BookServiceImpl service=new BookServiceImpl();
18     List<Book> list=service.select(book);
19 %>
20 <div style="text-align:right;font-size:36px;">
21     <a href="docart.jsp">我的购物车</a>
22 </div>
23 <table align="center" width="100%">
24     <tr>
25         <th>编号</th>
26         <th>书名</th>
27         <th>价格</th>
28         <th>作者</th>
29         <th>封皮</th>
30         <th>出版社</th>
31     </tr>
32     <%
33         for(Book b:list){
34     %>
35     <tr align="center">
36         <td><%=b.getBookid() %></td>
37         <td><a href="dobook.jsp?id=<%=b.getBookid()%>"><%=b.getBookname() %></a></td>
38         <td><%=b.getPrice() %></td>
39         <td><%=b.getAuthor() %></td>
40         <td><%=b.getPic() %></td>
41         <td><%=b.getPublish() %></td>
42     </tr>
43     <%} %>
44 </table>
45
46 </body>
47 </html>


9:当图书显示出来之后就可以根据图书编号查看图书详情了,接着写dobook.jsp页面和detail.jsp页面,这个显示图书的详细的信息的页面

1 <%@page import="com.bie.service.impl.BookServiceImpl"%>
2 <%@page import="com.bie.service.BookService"%>
3 <%@page import="com.bie.po.Book"%>
4 <%@ page language="java" contentType="text/html; charset=UTF-8"
5     pageEncoding="UTF-8"%>
6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
7 <html>
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
10 <title>处理图书详细信息的页面</title>
11 </head>
12 <body>
13 <%
14     Book book=new Book();
15     String sid=request.getParameter("id");
16     Integer id=Integer.parseInt(sid);
17     BookService service=new BookServiceImpl();
18     book.setBookid(id);
19     Book books=service.getBook(book);
20
21     session.setAttribute("book", books);
22     response.sendRedirect("detail.jsp");
23 %>
24 </body>
25 </html>


1 <%@page import="com.bie.po.Book"%>
2 <%@ page language="java" contentType="text/html; charset=UTF-8"
3     pageEncoding="UTF-8"%>
4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8 <title>图书详细信息的页面</title>
9 </head>
10 <body>
11 <%
12     Book book=(Book)session.getAttribute("book");
13 %>
14 <div style="text-align:right;font-size:36px;">
15
16     <a href="docart.jsp">我的购物车</a>
17 </div>
18 <table align="center" cellpadding="20" cellspacing="20">
19     <tr>
20         <td>图书编号</td>
21         <td>图书名称</td>
22         <td>图书价格</td>
23         <td>图书作者</td>
24         <td>图书封皮</td>
25         <td>图书出版社</td>
26     </tr>
27     <tr>
28         <td><%=book.getBookid() %></td>
29         <td><%=book.getBookname() %></td>
30         <td><%=book.getPrice() %></td>
31         <td><%=book.getAuthor() %></td>
32         <td><img src="images/<%=book.getPic() %>"></td>
33         <td><%=book.getPublish() %></td>
34     </tr>
35     <tr>
36         <td colspan="2"></td>
37         <td><a href="cart.jsp">添加到购物车</a></td>
38         <td><a href="book.jsp">图书列表</a></td>
39
40         <td colspan="2"></td>
41     </tr>
42 </table>
43 </body>
44 </html>


10:写好上面的detail.jsp然后就可以在detail.jsp页面点击添加到购物车,下面实现购物车的功能,也是这个实现购物车的核心部分,参考的话是重点看的内容,当然在写购物车之前还需要创建一个实体类CartItem.java,用于存放图书的信息和购买的数量

1 package com.bie.po;
2
3 /**
4  * @author BieHongLi
5  * @version 创建时间:2017年2月27日 上午10:40:53
6  * 购物项
7  */
8 public class CartItem {
9
10     private Book book;// 图书对象的成员变量
11     private Integer number;// 购买的数量;
12
13     public Book getBook() {
14         return book;
15     }
16
17     public void setBook(Book book) {
18         this.book = book;
19     }
20
21     public Integer getNumber() {
22         return number;
23     }
24
25     public void setNumber(Integer number) {
26         this.number = number;
27     }
28
29 }


1 <%@page import="java.util.HashMap"%>
2 <%@page import="com.bie.po.CartItem"%>
3 <%@page import="java.util.Map"%>
4 <%@page import="com.bie.po.Book"%>
5 <%@ page language="java" contentType="text/html; charset=UTF-8"
6     pageEncoding="UTF-8"%>
7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
8 <html>
9 <head>
10 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
11 <title>添加到购物车</title>
12 </head>
13 <body>
14 <%
15     //购物车功能
16     //1:首先考虑我购买的是哪一本书籍,这里可以使用id确认也可以使用session中取出哪一本书籍
17     Book book=(Book)session.getAttribute("book");
18
19     //2:考虑如何把书籍放到购物车中
20         //2.1:首先考虑是否有购物车,如果没有,则创建,如果有直接使用
21         //2.2:其次先将购物车从session中拿出来,不存在就创建。
22     Map<Integer,CartItem> cart=(Map<Integer,CartItem>)session.getAttribute("cart");
23     //如果没有购物车,那么创建,只有第一次访问才会操作
24     if(cart==null){
25         //new一个购物车
26         cart=new HashMap<>();
27     }
28
29     //3:考虑如何把书籍放到购物车中
30         //3.1:第一考虑购物车中是否有该书籍,所以先从购物车中获取该书籍,如果为空,那么没有该书籍
31     CartItem item=(CartItem)cart.get(book.getBookid());
32     if(item==null){
33         //如果购物车中不存在该书籍,那么创建,且数量默认为1
34         item=new CartItem();
35         //将书籍放到购物车中
36         item.setBook(book);
37         //将书籍的默认数量为1
38         item.setNumber(1);
39     }else{
40         //如果购物车中以及有该书籍,那么数量加1
41         item.setNumber(item.getNumber()+1);
42     }
43
44     //4:考虑如何把购物车项(即挑选的书籍是哪一个和书本的数量)放到购物车中
45     cart.put(book.getBookid(),item);
46
47     //5:将购物车放到session中,方便后面取出来
48     session.setAttribute("cart", cart);
49
50     response.sendRedirect("book.jsp");
51 %>
52 </body>
53 </html>


11:写完上面的就可以查看我的购物车了,在book.jsp页面和detail.jsp页面都有可以点击查看我的购物车的连接,然后就可以查看我的购物车,完成购物车功能。

1 <%@page import="com.bie.po.CartItem"%>
2 <%@page import="java.util.Map"%>
3 <%@ page language="java" contentType="text/html; charset=UTF-8"
4     pageEncoding="UTF-8"%>
5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
6 <html>
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9 <title>我的购物车的页面</title>
10 </head>
11 <body>
12 <table width="100%" align="center" border="1px">
13     <tr>
14         <th>书本编号</th>
15         <th>书本名称</th>
16         <th>书本单价</th>
17         <th>书本数量</th>
18         <th>书本小计</th>
19     </tr>
20     <%
21         //1:将添加到购物车里面的物品显示出来
22          Map<Integer,CartItem> map=(Map<Integer,CartItem>)session.getAttribute("cart");
23         //2:将购物车里面的内容遍历出来
24         double count=0;//显示出总价格
25         for(Map.Entry<Integer,CartItem> entry : map.entrySet()){
26             //计算出每一样的书籍一共花了多少钱
27             double price=entry.getValue().getBook().getPrice() * entry.getValue().getNumber();
28             //计算出一共花了多少钱
29             count=count+price;
30     %>
31     <tr align="center">
32         <td><%=entry.getKey() %></td>
33         <td><%=entry.getValue().getBook().getBookname() %></td>
34         <td><%=entry.getValue().getBook().getPrice() %></td>
35         <td><%=entry.getValue().getNumber() %></td>
36         <td><%=entry.getValue().getBook().getPrice() * entry.getValue().getNumber()%></td>
37
38     </tr>
39     <%} %>
40     <tr>
41         <td colspan="4" align="right">价格总计</td>
42         <td><%=count %></td>
43     </tr>
44 </table>
45 <div style="text-align:center;font-size:36px;">
46     <a href="book.jsp">图书列表</a>
47 </div>
48 </body>
49 </html>


效果如下所示:



虽然简陋,没有完全实现完,还待改善,继续加油!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐