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

编程入门 行业动态 更新时间:2024-10-09 15:23:48

JavaWeb<a href=https://www.elefans.com/category/jswz/34/1770732.html style=购物车项目 思路拓展综合提升"/>

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

目录

 一、实现思路

二、JSP 页面实现(临时性购物车项目)

        第一部分:images(图片)

        第二部分:SQL代码

        第三部分:代码

                 实体层(entity):

                        1.entity 包 (package com.zking.goods.entity;)

                                1.1 Users.java (用户实体类)

                        1.2 Goods.java  (商品实体类)

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

                数据库访问包utils (package com.zking.goods.utils;)

                        1.1 BaseDao.java 万能增删改查方法(简易)实现类

                        1.2 DBHelper.java 数据库帮助类

        业务逻辑层 BBL(biz|services):

                1.biz包代码 (package com.zking.goods.biz;)       IGoodsBiz.java (商品方法定义接口)

                2.biz包中的impl包代码  (package com.zking.goods.biz.impl;)   GoodsBizImpl.java (商品方法实现类命名)

        数据访问层 DAL   (dao):

                1.dao包代码(package com.zking.goods.dao;)       

                        1.1 IGoodsDao.java (商品方法定义接口)

        第四部分:JSP 代码 

                1.index.jsp        商品信息显示页面

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

                3.cart.jsp        实现购物车界面

                4.doDel.jsp        购物车删除处理页面

                5.doUpdate.jsp (修改购物车信息的处理页面)


 一、实现思路

购物车shop

  • 前台
  1. 包括用户注册,登录  

Html +js+jsp

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

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

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

    1. 其中商品数量可以在修改数量以后点击【修改】按钮进行修改
    2. 删除按钮则可以删除该购买商品(必须有提示)
    3. 点击继续购物后应该转入购物页面继续购物
    4. 点击结算后应该转入结账页面,提示用户当前购物车总金额,并清空购买信息。
    5. 订单项组成:商品基本信息Goods  数量num  单个商品的总价sumprice

  • 后台
  1. 包括对商品的管理(考虑删除的真正含义)以及 分页 下架  状态列0 1
  2. 包括对用户的管理(考虑删除的真正含义)以及 分页
  3. **思考订单&订单项(一个订单可以包含多个订单项)的概念
  4. 解决两个问题:订单项覆盖问题 加同一个商品重复问题

涉及的技术点:

 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;thisame = 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) {thisame = 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;}@Overridepublic 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;}@Overridepublic 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;thisount = 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) {thisount = ccount;}public float getCtotal() {return ctotal;}//计算总价格public void setCtotal() {this.ctotal = this.getGoods().getGprice() * this.getCcount();}@Overridepublic 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<x.length;i++) {//System.out.println(x[i]);ps.setObject(i+1, x[i]);}}n = ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {DBHelper.myClose(conn, ps, null);}return n;}/*** 方法功能:通用查询     查询所有  查询一个   模糊查询*/public ResultSet executeQuery(String sql,Object...x) {try {// a.获取数据库连接conn = DBHelper.getConn();// b.sql传入方法返回执行对象ps = conn.prepareStatement(sql);//新增的sql语句  有占位符  if(null!=x) {//拿到可变参数中的2个值for(int i = 0;i<x.length;i++) {//System.out.println(x[i]);ps.setObject(i+1, x[i]);}}rs = ps.executeQuery();} catch (Exception e) {e.printStackTrace();}finally {//不能关闭    通用的查询base方法  不能实现数据库关闭//DBHelper.myClose(conn, ps, null);}return rs;}}

                        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 {// OracleDriverClass.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<Goods> 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 {//实例化数据访问层的daoIGoodsDao igd = new GoodsDaoImpl();@Overridepublic List<Goods> queryGoodsAll() {return igd.queryGoodsAll();}@Overridepublic 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<Goods> 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 {@Overridepublic List<Goods> queryGoodsAll() {// 集合List<Goods> list = new ArrayList<Goods>();// 查看所有的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<Goods> queryGoodsAll = new GoodsDaoImpl().queryGoodsAll();
//		for (Goods goods : queryGoodsAll) {
//
//			System.out.println(goods);
//		}Goods goods = new GoodsDaoImpl().getGoodsByCid(1);System.out.println(goods);}@Overridepublic 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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ".dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 通过session默认保存一个用户 -->
<%Users users = new Users(1,"zz","123",1,1000);//存储到sessionsession.setAttribute("users", users);
%><h3>zz购物商城首页</h3>
<% Users u = (Users)session.getAttribute("users"); %>
<p>欢迎您!<%=u.getCname() %></p><table border ="1" width = "70%"><tr><th>编号</th><th>名称</th><th>价格</th><th>描述</th><th>图片</th><th>操作</th></tr><%//调用biz层显示所有的数据IGoodsBiz igb = new GoodsBizImpl();//调用查询所有的方法List<Goods> listGoods = igb.queryGoodsAll();for(Goods goods:listGoods){%><tr><td><%=goods.getGid() %></td><td><%=goods.getGname() %></td><td><%=goods.getGprice() %></td><td><%=goods.getGinfo() %></td><td><img src = "<%=goods.getGpath()%>"/></td><td><button onclick="addCart(<%=goods.getGid()%>)">加入购物车</button></td></tr><%		}%></table>
<script type="text/javascript">//加入购物车的点击事件function addCart(cid){//alert(cid)location.href = "doShopping.jsp?cid="+cid;}</script></body>
</html>

                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"%><!-- 加入购物车的do处理页面 --><!-- 购物车流程:1.Goods---显示商品信息2.Cart ---购物车中的信息加入购物车 不是将Goods进行存储  而是存储的是Cart实体--><%//将点击的商品存储到购物车容器中(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<Cart> listCarts = new ArrayList<Cart>();listCarts.add(cart);session.setAttribute("listCarts", listCarts);response.sendRedirect("cart.jsp"); *///加入购物车的版本3//将商品加入购物车之前,先要获取购物车//假设   假设购物车的标记   listCarts//1.获取购物车//session.getAttribute("listCarts"); 如果不存在  结果:null/* List<Cart> listCarts = (List<Cart> )session.getAttribute("listCarts");//List<Cart> listCarts = null;//2.判断  如果购物车为null   则创建一个if(listCarts == null){//创建一个购物车容器listCarts = new ArrayList<Cart>();}listCarts.add(cart);session.setAttribute("listCarts", listCarts);response.sendRedirect("cart.jsp");  *///问题:当点击同一件商品时,如果购物车中存在,不会修改数量,只会重新添加//解决这个问题//版本4//1.获取购物车List<Cart> listCarts = (List<Cart> )session.getAttribute("listCarts");//2.判断非空boolean flag = true;if(null == listCarts){//说明用户时第一次将商品加入购物车  //创建购物车listCarts = new ArrayList<Cart>();}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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ".dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body><h2>我的购物车</h2><a href = "index.jsp">返回首页</a><hr/><table border ="1" width = "70%"><tr><th>编号</th><th>名称</th><th>价格</th><th>图片</th><th>数量</th><th>总价格</th><th>操作</th></tr><%
//java代码//获取购物车//Cart cart = (Cart)session.getAttribute("cart");List<Cart> listCarts = (List<Cart>)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   7int 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){%><tr id = "<%=cart.getGoods().getGid()%>"><td><%=cart.getGoods().getGid() %></td><td><%=cart.getGoods().getGname() %></td><td><%=cart.getGoods().getGprice() %></td><td><img src = "<%=cart.getGoods().getGpath() %>"/></td><td><button onclick="add('a',<%=cart.getGoods().getGid()%>)">-</button><input type = "text" style ="width:40px" value = "<%=cart.getCcount() %>"/><button onclick="add('b',<%=cart.getGoods().getGid()%>)">+</button></td><td><%=cart.getCtotal() %></td><td><button onclick="delCart(<%=cart.getGoods().getGid()%>)">删除</button><button onclick="updateCart(<%=cart.getGoods().getGid()%>)">修改</button></td></tr><%		}%></table>
<!-- 购物车页面实现分页 -->
<!-- 每一页现实的商品条数4条 -->
<p>[<%=pageIndex %>/<%=pageMax %>]<a href = "cart.jsp?pageIndex=1">首页</a><a href = "cart.jsp?pageIndex=<%=pageIndex-1<0?1:pageIndex-1%>">上一页</a><a href = "cart.jsp?pageIndex=<%=pageIndex+1>pageMax?pageMax:pageIndex+1%>">下一页</a><a href="cart.jsp?pageIndex=<%=pageMax%>">尾页</a></p><script type="text/javascript">function delCart(id){if(window.confirm("您确定要删除吗?")){location.href="doDel.jsp?gid="+id;}}function add(type,id){//根据参数id获取tr标签var tr = document.getElementById(id);//console.log(tr)//根据tr获取数量var ccount = tr.cells[4].children[1].value;console.log(ccount);if(type === 'a'){//减法ccount--;}else if(type==='b'){//加法ccount++;}tr.cells[4].children[1].value = ccount;}function updateCart(id){//根据id获取到数量var tr = document.getElementById(id);var ccount = tr.cells[4].children[1].value;//console.log(ccount);location.href="doUpdate.jsp?gid="+id+"&ccount="+ccount;}</script>
</body>
</html>

                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<Cart> listCarts = (List<Cart> )session.getAttribute("listCarts");System.out.println(listCarts);/* for(int i = 0;i<listCarts.size();i++){if(cid == listCarts.get(i).getGoods().getGid()){listCarts.remove(i);}} *///迭代器的方式进行删除Iterator<Cart> 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<Cart> listCarts = (List<Cart> )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");%>

更多推荐

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

本文发布于:2024-02-28 00:25:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767207.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:购物车   思路   项目   JavaWeb

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!