JavaWeb购物车项目 思路&拓展&综合提升

JavaWeb购物车项目 思路&拓展&综合提升,第1张

一、实现思路

购物车shop

前台
包括用户注册,登录  
Html +js+jsp

考虑自动登录(cookie实现  登录页面)

进入购物页面购物(数据均来自数据库),商品展示页面shop.jsp显示如下(大概显示效果如下,为了界面美观,可以加入相应的商品图片 )(该页面相当于游客页面)

 1.点击”加入购物车” 的同时,要将数据(订单项的集合)保存到session中,再转入下图购物车页面cart.jsp(必须登录才能进)(大概效果如下)[从session中取出订单项集合] 

 

其中商品数量可以在修改数量以后点击【修改】按钮进行修改
删除按钮则可以删除该购买商品(必须有提示)
点击继续购物后应该转入购物页面继续购物
点击结算后应该转入结账页面,提示用户当前购物车总金额,并清空购买信息。
订单项组成:商品基本信息Goods  数量num  单个商品的总价sumprice
后台
包括对商品的管理(考虑删除的真正含义)以及 分页 下架  状态列0 1
包括对用户的管理(考虑删除的真正含义)以及 分页
**思考订单&订单项(一个订单可以包含多个订单项)的概念
解决两个问题:订单项覆盖问题 加同一个商品重复问题
涉及的技术点:

 JDBC

 Entity:

  --Goods

  --User

Session:购物车(增删改查)

 

二、JSP 页面实现(临时性购物车项目)         第一部分:images(图片)

 

    第二部分:SQL代码

--数据库设计 CartDB
 
--创建商品表
create table goods
 
(
 
gid --商品编号
 
gname --商品名称
 
gprice --商品单价
 
ginfo --商品描述信息
 
gpath --商品图片路径
 
)
 
--插入具体的数据
insert into goods values(1,'mp31',100,'mp31','images/1.jpg') ;
 
insert into goods values(2,'mp32',1200,'mp32','images/2.jpg') ;
 
insert into goods values(3,'mp33',100,'mp33','images/3.jpg') ;
 
insert into goods values(4,'mp34',1600,'mp34','images/4.jpg') ;
 
insert into goods values(5,'mp35',1500,'mp35','images/5.jpg') ;
 
insert into goods values(6,'mp36',1400,'mp36','images/6.jpg') ;
 
insert into goods values(7,'mp37',1700,'mp37','images/7.jpg') ;
 
insert into goods values(8,'mp38',1300,'mp38','images/8.jpg') ;
 
insert into goods values(9,'mp39',1500,'mp39','images/9.jpg') ;
 
insert into goods values(10,'mp310',1600,'mp310','images/10.jpg') ;
 
insert into goods values(11,'mp311',1600,'mp311','images/11.jpg');

     第三部分:代码
                 实体层(entity):
                        1.entity 包 (package com.zking.goods.entity;)
                                1.1 Users.java (用户实体类)

package com.zking.goods.entity;
 
public class Users {
	
	private int cid;
	private String cname;
	private String cpwd;
	private int urole;
	private float cmoney;
	
	
	
	public Users() {
		// TODO Auto-generated constructor stub
	}
 
 
 
	public Users(int cid, String cname, String cpwd, int urole, float cmoney) {
		super();
		this.cid = cid;
		this.cname = cname;
		this.cpwd = cpwd;
		this.urole = urole;
		this.cmoney = cmoney;
	}
 
 
 
	public int getCid() {
		return cid;
	}
 
 
 
	public void setCid(int cid) {
		this.cid = cid;
	}
 
 
 
	public String getCname() {
		return cname;
	}
 
 
 
	public void setCname(String cname) {
		this.cname = cname;
	}
 
 
 
	public String getCpwd() {
		return cpwd;
	}
 
 
 
	public void setCpwd(String cpwd) {
		this.cpwd = cpwd;
	}
 
 
 
	public int getUrole() {
		return urole;
	}
 
 
 
	public void setUrole(int urole) {
		this.urole = urole;
	}
 
 
 
	public float getCmoney() {
		return cmoney;
	}
 
 
 
	public void setCmoney(float cmoney) {
		this.cmoney = cmoney;
	}
 
 
 
	@Override
	public String toString() {
		return "Users [cid=" + cid + ", cname=" + cname + ", cpwd=" + cpwd + ", urole=" + urole + ", cmoney=" + cmoney
				+ "]";
	}
	
	
}

        1.2 Goods.java  (商品实体类)

package com.zking.goods.entity;
 
public class Goods {
	private int gid;
	private String gname;
	private float gprice;
	private String ginfo;
	private String gpath;
 
	public Goods() {
		// TODO Auto-generated constructor stub
	}
 
	public Goods(String gname, float gprice, String ginfo, String gpath) {
		super();
		this.gname = gname;
		this.gprice = gprice;
		this.ginfo = ginfo;
		this.gpath = gpath;
	}
 
	public Goods(int gid, String gname, float gprice, String ginfo, String gpath) {
		super();
		this.gid = gid;
		this.gname = gname;
		this.gprice = gprice;
		this.ginfo = ginfo;
		this.gpath = gpath;
	}
 
	public int getGid() {
		return gid;
	}
 
	public void setGid(int gid) {
		this.gid = gid;
	}
 
	public String getGname() {
		return gname;
	}
 
	public void setGname(String gname) {
		this.gname = gname;
	}
 
	public float getGprice() {
		return gprice;
	}
 
	public void setGprice(float gprice) {
		this.gprice = gprice;
	}
 
	public String getGinfo() {
		return ginfo;
	}
 
	public void setGinfo(String ginfo) {
		this.ginfo = ginfo;
	}
 
	public String getGpath() {
		return gpath;
	}
 
	public void setGpath(String gpath) {
		this.gpath = gpath;
	}
 
	@Override
	public String toString() {
		return "Goods [gid=" + gid + ", gname=" + gname + ", gprice=" + gprice + ", ginfo=" + ginfo + ", gpath=" + gpath
				+ "]";
	}
	
}

        1.3 Cart.java (购物车实现类)

package com.zking.goods.entity;
 
public class Cart {
	private Goods goods;//对象:包含商品所有属性
	private int ccount;//数量  单个商品的数量
	private float ctotal;//单个商品的总价格
	
	public Cart() {
		// TODO Auto-generated constructor stub
	}
 
	public Cart(Goods goods, int ccount, float ctotal) {
		super();
		this.goods = goods;
		this.ccount = ccount;
		this.ctotal = ctotal;
	}
 
	public Goods getGoods() {
		return goods;
	}
 
	public void setGoods(Goods goods) {
		this.goods = goods;
	}
 
	public int getCcount() {
		return ccount;
	}
 
	public void setCcount(int ccount) {
		this.ccount = ccount;
	}
 
	public float getCtotal() {
		return ctotal;
	}
	//计算总价格
	public void setCtotal() {
		this.ctotal = this.getGoods().getGprice() * this.getCcount();
	}
 
	@Override
	public String toString() {
		return "Cart [goods=" + goods + ", ccount=" + ccount + ", ctotal=" + ctotal + "]";
	}
	
}
      数据库访问包utils (package com.zking.goods.utils;)                         1.1 BaseDao.java 万能增删改查方法(简易)实现类
package com.zking.goods.utils;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
public class BaseDao {
	//protected 访问控制符    受保护的
	protected Connection conn =null;
	protected PreparedStatement ps = null;
	protected ResultSet rs = null;
	
 
	/**
	 * 方法功能:通用增删改方法
	 */
	public int executeUpdate(Connection conn,String sql,Object...x) {
		int n = 0;
		try {
			// a.获取数据库连接
			conn = DBHelper.getConn();
			// b.sql传入方法返回执行对象
			ps = conn.prepareStatement(sql);
			//新增的sql语句  有占位符  
			if(null!=x) {
				//拿到可变参数中的2个值
				for(int i = 0;i

        1.2 DBHelper.java 数据库帮助类

package com.zking.goods.utils;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
/**
 * 数据库帮助类
 * 
 * @author Administrator
 *
 */
public class DBHelper {
 
	private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
 
	// 1.加载驱动 静态代码块进行封装 优先级别最高(静态代码块>普通代码块>构造函数)
	static {
		try {
			// OracleDriver
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
	// 2.建立数据库连接
	public static Connection getConn() {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(URL, "scott", "123");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
 
	public static void main(String[] args) {
		// System.out.println(DBHelper.getConn());
	}
 
	// 3.关闭服务
	/**
	 * 方法功能:数据库服务关闭
	 * 
	 * @param conn
	 *            连接对象
	 * @param ps
	 *            执行对象
	 * @param rs
	 *            结果集对象
	 */
	public static void myClose(Connection conn, PreparedStatement ps, ResultSet rs) {
		try {
			if (null != conn && !conn.isClosed()) {
				conn.close();
			}
			if (null != ps) {
				ps.close();
			}
			if (null != rs) {
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
}

 

      业务逻辑层 BBL(biz|services):                 1.biz包代码 (package com.zking.goods.biz;)       IGoodsBiz.java (商品方法定义接口)
package com.zking.goods.biz;
 
import java.util.List;
 
import com.zking.goods.entity.Goods;
 
public interface IGoodsBiz {
	List queryGoodsAll();
	/**
	 * 根据商品编号获取对应的信息
	 */
	Goods getGoodsByCid(int nid);
}
            2.biz包中的impl包代码  (package com.zking.goods.biz.impl;)   GoodsBizImpl.java (商品方法实现类命名)
package com.zking.goods.biz.impl;
 
import java.util.List;
 
import com.zking.goods.biz.IGoodsBiz;
import com.zking.goods.dao.IGoodsDao;
import com.zking.goods.dao.impl.GoodsDaoImpl;
import com.zking.goods.entity.Goods;
 
public class GoodsBizImpl implements IGoodsBiz {
 
	//实例化数据访问层的dao
	IGoodsDao igd = new GoodsDaoImpl();
	
	
	@Override
	public List queryGoodsAll() {
 
		return igd.queryGoodsAll();
	}
 
 
	@Override
	public Goods getGoodsByCid(int cid) {
		return igd.getGoodsByCid(cid);
	}
 
}
 数据访问层 DAL   (dao):                 1.dao包代码(package com.zking.goods.dao;)                                1.1 IGoodsDao.java (商品方法定义接口)
package com.zking.goods.dao;
 
import java.util.List;
 
import com.zking.goods.entity.Goods;
 
public interface IGoodsDao {
 
	List queryGoodsAll();
	
	/**
	 * 根据商品编号获取对应的信息
	 */
	Goods getGoodsByCid(int cid);
}

       1.2.dao包中的impl包(package com.zking.goods.dao.impl;)        GoodsDaoImpl.java (商品方法实现类)

package com.zking.goods.dao.impl;
 
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
 
import com.zking.goods.dao.IGoodsDao;
import com.zking.goods.entity.Goods;
import com.zking.goods.utils.BaseDao;
 
public class GoodsDaoImpl extends BaseDao implements IGoodsDao {
 
	@Override
	public List queryGoodsAll() {
		// 集合
		List list = new ArrayList();
		// 查看所有的sql语句
		String sql = "select * from goods";
		// 通过继承的方式 来到通用查询方法
		ResultSet rs = this.executeQuery(sql);
		try {
			while (rs.next()) {
				list.add(new Goods(rs.getInt(1), rs.getString(2), rs.getFloat(3), rs.getString(4), rs.getString(5)));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
 
	public static void main(String[] args) {
//		List queryGoodsAll = new GoodsDaoImpl().queryGoodsAll();
//		for (Goods goods : queryGoodsAll) {
//
//			System.out.println(goods);
//		}
		
		Goods goods = new GoodsDaoImpl().getGoodsByCid(1);
		System.out.println(goods);
		
	}
 
	@Override
	public Goods getGoodsByCid(int gid) {
		Goods goods = null;
		// 查看所有的sql语句
		String sql = "select * from goods where gid = "+gid;
		// 通过继承的方式 来到通用查询方法
		ResultSet rs = this.executeQuery(sql);
		try {
			if (rs.next()) {
				goods = new Goods(rs.getInt(1), rs.getString(2), rs.getFloat(3), rs.getString(4), rs.getString(5));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return goods;
	}
 
}

  当以上这些功能都实现的时候,就可以进行以下的界面 *** 作以及界面处理的 *** 作。

  第四部分:JSP 代码                  1.index.jsp        商品信息显示页面
<%@page import="com.zking.goods.entity.Goods"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.goods.biz.IGoodsBiz"%>
<%@page import="com.zking.goods.biz.impl.GoodsBizImpl"%>
<%@page import="com.zking.goods.entity.Users"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here



<%
	Users users = new Users(1,"zz","123",1,1000);
	//存储到session
	session.setAttribute("users", users);
%>
 
 
 
zz购物商城首页
<% Users u = (Users)session.getAttribute("users"); %>

欢迎您!<%=u.getCname() %>

<% //调用biz层显示所有的数据 IGoodsBiz igb = new GoodsBizImpl(); //调用查询所有的方法 List listGoods = igb.queryGoodsAll(); for(Goods goods:listGoods){ %> <% } %>
编号 名称 价格 描述 图片 *** 作
<%=goods.getGid() %> <%=goods.getGname() %> <%=goods.getGprice() %> <%=goods.getGinfo() %> "/>

          2.doShopping.jsp        购物车处理页面 

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.goods.entity.Cart"%>
<%@page import="com.zking.goods.entity.Goods"%>
<%@page import="com.zking.goods.biz.impl.GoodsBizImpl"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
	
	
	
	<%
		//将点击的商品存储到购物车容器中(session)
		
		//设置编码
		request.setCharacterEncoding("utf-8");
		//获取商品编号
		String id = request.getParameter("cid");
		int cid = 0;
		if(null!=id){
			cid = Integer.valueOf(id);
		}
	
		//拿到cid  根据cid获取商品的其它信息
		Goods goods = new GoodsBizImpl().getGoodsByCid(cid);
		//数量默认一件
		//总价格    商品的单价 * 数量(1件)
		
		//将上面获取的信息封装到Cart实体中
		Cart cart = new Cart();
		cart.setGoods(goods);
		cart.setCcount(1);
		cart.setCtotal();
		
		out.println(cart);
		
		//加入购物车的版本1
		//点击一个就加入一个
		/* session.setAttribute("cart", cart);
		response.sendRedirect("cart.jsp"); */
		//加入购物车的版本2
		/* 	
		List listCarts = new ArrayList();
		listCarts.add(cart);
		session.setAttribute("listCarts", listCarts);
		response.sendRedirect("cart.jsp"); 
		*/
		//加入购物车的版本3
		//将商品加入购物车之前,先要获取购物车
		//假设   假设购物车的标记   listCarts
		//1.获取购物车
		//session.getAttribute("listCarts"); 如果不存在  结果:null
		/* List listCarts = (List )session.getAttribute("listCarts");
		//List listCarts = null;
		//2.判断  如果购物车为null   则创建一个
		if(listCarts == null){
			//创建一个购物车容器
			listCarts = new ArrayList();
		}
		listCarts.add(cart);
		session.setAttribute("listCarts", listCarts);
		response.sendRedirect("cart.jsp");  */
		
		//问题:当点击同一件商品时,如果购物车中存在,不会修改数量,只会重新添加
		//解决这个问题
		
		//版本4
		//1.获取购物车
		List listCarts = (List )session.getAttribute("listCarts");
		//2.判断非空
		boolean flag = true;
		if(null == listCarts){//说明用户时第一次将商品加入购物车  
			//创建购物车
			listCarts = new ArrayList();
		}else{//否则  购物车中存在商品
			//遍历所有的购物车中的商品  看该购物车中是否存在刚才点击的cart实体封装
			for(Cart c : listCarts){
				//判断传递的cid与当前listCarts中的每一个cid进行匹配
				if(cid == c.getGoods().getGid()){//说明购物车中存在该商品
					flag = false;
					//修改数量
					c.setCcount(c.getCcount()+1);
					//修改总价格
					c.setCtotal();
					
				}
			}
		}
		//判断flag标记
		if(flag == true){//说明购物车中没有该商品
			listCarts.add(cart);
		}
		
		//重新保存购物车
		session.setAttribute("listCarts", listCarts);
		
		response.sendRedirect("cart.jsp");
	%>
      3.cart.jsp        实现购物车界面
<%@page import="java.util.List"%>
<%@page import="com.zking.goods.entity.Cart"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


	我的购物车
	返回首页
	
<% //java代码 //获取购物车 //Cart cart = (Cart)session.getAttribute("cart"); List listCarts = (List)session.getAttribute("listCarts"); //定义一个页码 int pageIndex = 1; //定义一个变量存储每页显示的条数 int pageSize = 4; //当用户点击了下一页 获取到下一页超链接上的参数 String pIndex= request.getParameter("pageIndex"); if(pIndex!=null){ pageIndex = Integer.valueOf(pIndex); } //定义一个变量存储总记录数 int pageCount = listCarts.size(); System.out.println("总记录数: "+pageCount); //pageIndex = 1 0-3 0 1 2 3 //pageIndex = 2 4-7 4 5 6 7 int start = (pageIndex-1)*pageSize; //sublist 参数end 没有等于 int end = pageIndex*pageSize; if(end > pageCount){ end = pageCount; } int pageMax = pageCount/pageSize; if(pageCount%pageSize!=0){ pageMax++; } //调用伪分页的方法 subList(start,end); listCarts = listCarts.subList(start,end); for(Cart cart : listCarts){ %> <% } %>
编号 名称 价格 图片 数量 总价格 *** 作
<%=cart.getGoods().getGid() %> <%=cart.getGoods().getGname() %> <%=cart.getGoods().getGprice() %> "/> <%=cart.getCtotal() %>

[<%=pageIndex %>/<%=pageMax %>] 首页 ">上一页 pageMax?pageMax:pageIndex+1%>">下一页 ">尾页

       4.doDel.jsp        购物车删除处理页面
<%@page import="java.util.Iterator"%>
<%@page import="com.zking.goods.entity.Cart"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
	
	<%
		String id = request.getParameter("gid");
		int cid = 0;
		if(null!=id){
			cid = Integer.valueOf(id);
		}
 
		
		//获取购物车
		List listCarts = (List )session.getAttribute("listCarts");
		System.out.println(listCarts);
		
		/* for(int i = 0;i its = listCarts.iterator();
		while(its.hasNext()){
			Cart cc = its.next();
			//its.remove();
			if(cc.getGoods().getGid() == cid){
				its.remove();
			}
		}
		
		session.setAttribute("listCarts", listCarts);
		response.sendRedirect("cart.jsp");
		
		
	
	%>
     5.doUpdate.jsp (修改购物车信息的处理页面)
<%@page import="com.zking.goods.entity.Cart"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
	
	<%
		String id1 = request.getParameter("gid");
		String id2 = request.getParameter("ccount");
		
		int gid = 0;
		if(id1!=null){
			gid = Integer.valueOf(id1);
		}
		int ccount = 0;
		if(id2!=null){
			ccount = Integer.valueOf(id2);
		}
		
		//获取购物车
		List listCarts = (List )session.getAttribute("listCarts");
		
		for(Cart c:listCarts){
			if(c.getGoods().getGid() == gid){
				c.setCcount(ccount);
				c.setCtotal();
			}
		}
		
		session.setAttribute("listCarts", listCarts);
	
		response.sendRedirect("cart.jsp");
	%>
	
	

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/924129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)