web--购物车


web应用开发案例

购物车
gitee连接:https://gitee.com/vertex_summit/officaldocument/tree/master/code tree/Web开发

注意:xml文件不要复制,因为window系统会误读xml的换行

一、业务结构

二、创建Java包

1.在src新建com.review

(在odea下,如果在新建的文件夹或者包名,中包含"."的,系统会按照分级目录创建文件夹,这样的好处是可以方便创建含多个子目录的文件夹)

2.创建Java类

创建DBHelper类,

用于写基本的数据库连接

package com.review;



import java.sql.Connection;
import java.sql.DriverManager;

public class DBHelper {

    private static final String driver = "com.mysql.jdbc.Driver"; //数据库驱动
    //连接数据库的URL地址
    private static final String url="jdbc:mysql://localhost:3306/web_order";//修改要连接的数据库名称
    private static final String username="root";//数据库的用户名
    private static final String password="你的数据库密码";//数据库的密码

    private static Connection conn=null;

    //静态代码块负责加载驱动
    static
    {
        try
        {
            Class.forName(driver);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

    //单例模式返回数据库连接对象
    public static Connection getConnection() throws Exception
    {
        if(conn==null)
        {
            conn = DriverManager.getConnection(url, username, password);
            return conn;
        }
        return conn;
    }

    public static void main(String[] args) {

        try
        {
            Connection conn = DBHelper.getConnection();
            if(conn!=null)
            {
                System.out.println("数据库连接正常!");
            }
            else
            {
                System.out.println("数据库连接异常!");
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }

    }
}

创建Items类,

用于封装属性

package com.review;

//商品类
public class Items {

    private int id; // 商品编号
    private String name; // 商品名称
    private String city; // 产地
    private int price; // 价格
    private int number; // 库存
    private String picture; // 商品图片
    private int gtypeid;//商品类型
    private String gintro;//商品描述
    private int gsail;//已经卖出份数
    private int row;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

//    public String getCity() {
//        return city;
//    }
//
//    public void setCity(String city) {
//        this.city = city;
//    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }

    public void setGintro(String gintro) {
        this.gintro = gintro;
    }

    public String getGintro() {
        return gintro;
    }

    public void setGsail(int gsail) {
        this.gsail = gsail;
    }

    public int getGsail() {
        return gsail;
    }

    public void setGtypeid(int gtypeid) {
        this.gtypeid = gtypeid;
    }

    public int getGtypeid() {
        return gtypeid;
    }

    public void setRow(int row) {
        this.row = row;
    }

    public int getRow() {
        return row;
    }
}

创建ItemsDAO类,

用于向数据库查询数据和插入数据

package com.review;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

//商品的业务逻辑类
public class ItemsDAO {

    // 获得所有的商品信息
    public ArrayList getAllItems() {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        ArrayList list = new ArrayList(); // 商品集合
        try {
            conn = DBHelper.getConnection();
            String sql = "select * from goods;"; // SQL语句
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Items item = new Items();
                item.setId(rs.getInt("goodsid"));
                item.setName(rs.getString("gname"));
                item.setNumber(rs.getInt("gcount"));
                item.setPrice(rs.getInt("gprice"));
                item.setPicture(rs.getString("gimage"));
                item.setGintro(rs.getString("gintro"));
                item.setGtypeid(rs.getInt("gtypeid"));
                item.setGsail(rs.getInt("gsail"));
                System.out.println("成功获得所有的商品信息");
                list.add(item);// 把一个商品加入集合
            }
            return list; // 返回集合。
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        } finally {
            // 释放数据集对象
            if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            // 释放语句对象
            if (stmt != null) {
                try {
                    stmt.close();
                    stmt = null;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }

    }

    // 根据商品编号获得商品资料
    public Items getItemsById(int id) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = DBHelper.getConnection();
            String sql = "select * from goods where goodsid=?;"; // SQL语句
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, id);
            rs = stmt.executeQuery();
            if (rs.next()) {
                Items item = new Items();
                item.setId(rs.getInt("goodsid"));
                item.setName(rs.getString("gname"));
                item.setNumber(rs.getInt("gcount"));
                item.setPrice(rs.getInt("gprice"));
                item.setPicture(rs.getString("gimage"));
                item.setGintro(rs.getString("gintro"));
                item.setGtypeid(rs.getInt("gtypeid"));
                item.setGsail(rs.getInt("gsail"));
                System.out.println(getClass()+"查询到数据");
                System.out.println("成功根据商品编号获得商品资料");
                return item;
            } else {
                return null;
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        } finally {
            // 释放数据集对象
            if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            // 释放语句对象
            if (stmt != null) {
                try {
                    stmt.close();
                    stmt = null;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }

        }
    }

    //向购物车添加商品,插入数据
    public Items insert(String goodsid,String gname,String gprice,String gimage) {
        System.out.println("调用insert方法");
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        int row=0;
        try {
            conn = DBHelper.getConnection();
            String sql="insert into insert_to_shoppingcar (goodsid,gname,gprice,giamge) values (goodsid,gname,gprice,giamge)";
            stmt = conn.prepareStatement(sql);
//            stmt.setString(1, goodsid);
//            stmt.setString(2, gname);
//            stmt.setString(3, gprice);
//            stmt.setString(4, gimage);
            stmt.executeUpdate(sql);
            System.out.println("注册模块开始启动");

//            Statement stmt=conn.createStatement();//创建一个Statement对象
//            stmt.executeUpdate(sql);//执行sql语句

                row++;
                System.out.println("可以插入数据");
                System.out.println(Integer.parseInt(String.valueOf(rs.getInt("goodsid"))));
                Items item = new Items();
                item.setId(Integer.parseInt(String.valueOf(rs.getInt("goodsid"))));//从网页取到的数据是String类
                item.setName(rs.getString("gname"));
                item.setPrice(Integer.parseInt(String.valueOf(rs.getInt("gprice"))));
                item.setPicture(rs.getString("gimage"));

                System.out.println(getClass()+"添加了数据");
                System.out.println("成功向购物车添加了数据");
                return item;

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        } finally {
            // 释放数据集对象
            if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            // 释放语句对象
            if (stmt != null) {
                try {
                    stmt.close();
                    stmt = null;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }

        }
    }

    //获取最近浏览的前五条商品信息
    public ArrayList getViewList(String list)
    {
        System.out.println("list:"+list);
        ArrayList itemlist = new ArrayList();
        int iCount=5; //每次返回前五条记录
        if(list!=null&&list.length()>0)
        {
            String[] arr = list.split(",");
            System.out.println("arr.length="+arr.length);
            //如果商品记录大于等于5条
            if(arr.length>=5)
            {
                for(int i=arr.length-1;i>=arr.length-iCount;i--)
                {
                    itemlist.add(getItemsById(Integer.parseInt(arr[i])));
                }
            }
            else
            {
                for(int i=arr.length-1;i>=0;i--)
                {
                    itemlist.add(getItemsById(Integer.parseInt(arr[i])));
                }
            }
            return itemlist;
        }
        else
        {
            return null;
        }

    }

}

三、创建jsp

注意:在创建好web项目或者模型后,idea会自动创建好index.jsp文件,这是tomcat启动默认打开的文件(首先打开)

1.制作主页index.jsp。(显示商品主页)

<%@page import="java.sql.*"%>
<%@ page import="jdk.swing.interop.SwingInterOpUtils" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>





Insert title here


	购物车
	<%
		ResultSet rs= null;//因为要在try之外访问它
		try{
			//加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			//创建连接
			Connection conn = DriverManager.getConnection
			("jdbc:mysql://localhost:3306/web_order",
				"root", 
				"你的数据库密码");

			Statement stmt = conn.createStatement();
			rs = stmt.executeQuery("select *  from  goods");
			System.out.println("主页注册驱动完成,查询到数据");
		}catch(Exception e){
			e.printStackTrace();
		}
	%>
	
<% try{ System.out.println("主页开始显示商品"); if(rs!=null){ while(rs.next()){ System.out.println("主页查询数据不为空"); %>
"/>

<%=rs.getString(2)%>

<%=rs.getString(1)%>

<% System.out.println("主页显示商品正常"); %>

数量:<%=rs.getString(7)%>  单价:<%=rs.getString(3)%>

加入购物车
<% } } }catch (Exception e){ } %>

2.添加details.jsp。商品详情页,在点击商品时会请求打开details.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ page import="com.review.Items"%>
<%@ page import="com.review.ItemsDAO"%>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.nio.charset.StandardCharsets" %>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>





	

	My JSP 'details.jsp' starting page

	
	
	
	
	
	
	



商品详情


<% ItemsDAO itemDao = new ItemsDAO(); Items item =null; item =itemDao.getItemsById(Integer.parseInt(request.getParameter("goodsid"))); System.out.println("在goodscar.jsp中成功根据商品编号获得商品资料"); if(item!=null) { %> <% } %>
<%-- 如果要获取其他路径的图片,/目录/item.getPicture()--%> <%-- --%> <%-- --%> <%-- --%>
<%=item.getName() %>
产地:<%=item.getCity()%>
价格:<%=item.getPrice() %>¥
数量:<%=item.getNumber() %>
描述:<%=item.getGintro() %>
类型:<%=item.getGtypeid() %>
销量:<%=item.getGsail() %>
<%-- 已成功取得商品id--%>

3.创建shoppingCar.jsp。用于处理“加入购物车”

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ page import="com.review.ItemsDAO" %>
<%@ page import="com.review.Items" %>

<%--
  Created by IntelliJ IDEA.
  User: 出猎
  Date: 2020/11/23
  Time: 15:31
  To change this template use File | Settings | File Templates.
--%>


    shoppingCar


    <%
        String goodsid=request.getParameter("goodsid");
        String gname=request.getParameter("gname");
        String gprice=request.getParameter("gprice");
        String gimage=request.getParameter("gimage");
        System.out.println(goodsid.getClass().getName());//输出变量的类型

    %>
    <%
        ItemsDAO itemDao = new ItemsDAO();
        Items item =null;
        item =itemDao.insert(goodsid,gname,gprice,gimage);

        System.out.println("在shoppingCar.jsp中准备要将商品添加到数据库中");
        %>

        
        
<%--        param 中name是变量名 value是变量值,在forward里面,所以会将uname传递到index页面--%>
    <%
        if(item!=null)
        {
            request.getRequestDispatcher("index.jsp").forward(request, response);
            System.out.println("添加购物车成功,开始跳转主页面!");
        }
    %>



4.创建showShoppingCar.jsp。用于处理“查看购物车”

<%--
  Created by IntelliJ IDEA.
  User: 出猎
  Date: 2020/11/23
  Time: 16:21
  To change this template use File | Settings | File Templates.
--%>
<%@page import="java.sql.*"%>
<%@ page import="jdk.swing.interop.SwingInterOpUtils" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>


    Title
    


<%
    ResultSet rs= null;//因为要在try之外访问它
    int count=0;
    try{
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //创建连接
        Connection conn = DriverManager.getConnection
                ("jdbc:mysql://localhost:3306/web_order",
                        "root",
                        "你的数据库密码");//基于MySQL数据库开发的,Oracle的在注册驱动和建立连接会有些不同

        Statement stmt = conn.createStatement();
        //select count(*) from 表名;
        rs = stmt.executeQuery("select *  from  insert_to_shoppingcar");
    }catch(Exception e){
        e.printStackTrace();
    }
%>
<% try{ if(rs != null){ while(rs.next()){ count++; %>
"/>

<%=rs.getString(2)%>

商品编号<%=rs.getString(1)%>

<% %>

单价:<%=rs.getString(3)%>

<% } } }catch (Exception e){ } %>

购物车添加了:<%=count%>件商品  

四、构建数据库

导入两个sql文件

1.goods.sql

INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (0, '平板', 21, 3, '电子产品', 'img/s02.jpg', 2543, 232, 12, '0000-00-00 00:00:00', '234');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (1, '牛奶糖', 1, 1, '好吃不贵', 'img/s03.jpg', 1000, 500, 1, '2020-10-06 14:50:08', '10');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (2, '巧克力', 8, 1, '好吃但贵', 'img/s01.jpg', 100, 30, 1, '2020-10-01 14:52:17', '30');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (3, '果冻', 2, 1, '好吃不贵', 'img/s04.jpg', 500, 400, 2, '2020-10-03 14:54:24', '15');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (4, '冰棍', 3, 1, '不好吃又贵', 'img/s05.jpg', 299, 100, 3, '2020-10-07 14:55:36', '30');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (5, '充电宝', 50, 2, '电子产品', 'img/s06.jpg', 50, 20, 10, '2020-10-02 14:56:36', '50');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (6, '充电器', 20, 2, '电子产品', 'img/s01.jpg', 100, 80, 4, '2020-10-06 14:57:19', '30');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (7, '鼠标', 100, 2, '电子产品', 'img/s02.jpg', 20, 10, 8, '2020-10-03 14:57:55', '45');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (8, 'iPhone', 5000, 2, '电子产品', 'img/s03.jpg', 10, 5, 15, '2020-10-08 14:58:39', '200');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (9, '电视', 2000, 1, '家用电器', 'img/s04.jpg', 20, 15, 200, '2020-10-07 15:00:01', '300');
INSERT INTO web_order.goods (GoodsID, Gname, Gprice, GtypeID, Gintro, Gimage, Gcount, Gsail, Gweight, GDateTime, Gsize) VALUES (10, 'apple', 5400, 1, '苹果', 'img/s01.jpg', 4534, 23, 19, '2020-05-23 18:34:48', '12');

2.insert_to_shoppingcar.sql

INSERT INTO web_order.insert_to_shoppingcar (goodsid, gname, gprice, gimage) VALUES ('10', 'apple', '5400', 'img/s01.jpg');
web