JavaWeb購(gòu)物車(chē)項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)指南
一、項(xiàng)目前提
1、購(gòu)物車(chē)并不是一直放數(shù)據(jù)庫(kù)
2、選擇使用的技術(shù):
session:(購(gòu)物車(chē)項(xiàng)目使用session)
好處:快(放在內(nèi)存當(dāng)中),存對(duì)象的
壞處:占用內(nèi)存,服務(wù)器意外待機(jī)數(shù)據(jù)會(huì)丟失cookie
好處:不占用內(nèi)存,存儲(chǔ)很久
壞處:存在客戶(hù)端上,只能存String,數(shù)據(jù)有泄露的風(fēng)險(xiǎn)
二、數(shù)據(jù)庫(kù)的創(chuàng)建
用戶(hù)表
create table shop_user ( id number primary key,--用戶(hù)id account varchar2(30) not null,--用戶(hù)賬戶(hù) password varchar2(30)not null--用戶(hù)密碼 );
商品表
create table shop_goods( id number primary key,--商品id name varchar2(50) not null,--商品名稱(chēng) price number default 0.0,--商品價(jià)格 info varchar2(255) default '三五產(chǎn)品' not null--商品介紹 );
三、eclipse進(jìn)行創(chuàng)建包和類(lèi):
com.zking.util 幫助類(lèi)com.zking.pojo 實(shí)體類(lèi)com.zking.dao(放dao接口)com.zking.dao.imp (放dao接口實(shí)現(xiàn)類(lèi))com.zking.biz (業(yè)務(wù)邏輯層放dao方法)com.zking.biz.imp(業(yè)務(wù)邏輯層放dao實(shí)現(xiàn)類(lèi)) com.zking.vo (view object 視圖對(duì)象 前端用)
四、主要實(shí)現(xiàn)功能
1、購(gòu)物車(chē)用戶(hù)登錄
login.jsp
界面效果
代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Document</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css" rel="external nofollow" rel="external nofollow" > <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script> <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script> <style> * { outline: none !important; } html, body { background: #1abe9c; } form { width: 300px; background: #ebeff2; box-shadow: 0px 0px 50px rgba(0, 0, 0, .5); border-radius: 5px; padding: 20px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } .btn-group { width: 100%; } .btn-group button { width: 50%; } </style> </head> <body> <form action="doLogin.jsp" method="post"> <h3 class="text-center" style="text-shadow: 2px 2px 1px #ed3f3f;">歡迎光臨苡桉超市</h3> <div class="form-group"> <input name="account" type="text" class="form-control" placeholder="請(qǐng)輸入您的用戶(hù)名"> </div> <div class="form-group"> <input name="password" type="password" class="form-control" placeholder="請(qǐng)輸入您的密碼"> </div> <div class="btn-group"> <button type="submit" class="btn btn-primary">登錄</button> <button type="button" class="btn btn-danger">沒(méi)有賬號(hào)?</button> </div> </form> </body> </html>
doLogin.jsp(處理登錄界面)
<%@page import="com.zking.vo.CarItem"%> <%@page import="java.util.ArrayList"%> <%@page import="java.util.List"%> <%@page import="com.zking.pojo.User"%> <%@page import="com.zking.biz.impl.UserBizImpl"%> <%@page import="com.zking.biz.IUserBiz"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8"); String account=request.getParameter("account"); String password=request.getParameter("password"); IUserBiz userBiz=new UserBizImpl(); User user=userBiz.login(new User(0,account,password)); if(user==null){ response.sendRedirect("login.jsp"); }else{ //首頁(yè)需要登錄數(shù)據(jù) session.setAttribute("user",user); //分配購(gòu)物車(chē) List<CarItem>car=new ArrayList<>(); //放到session中(把購(gòu)物車(chē)給我) session.setAttribute("car", car); response.sendRedirect("index.jsp"); } %>
用戶(hù)實(shí)體類(lèi)User.java
package com.zking.pojo; public class User { private Integer id; private String account; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(Integer id, String account, String password) { super(); this.id = id; this.account = account; this.password = password; } public User() { super(); } @Override public String toString() { return "User [id=" + id + ", account=" + account + ", password=" + password + "]"; } }
IUserBiz.java (用戶(hù)邏輯接口)
package com.zking.biz; import com.zking.pojo.User; /** * 用戶(hù)邏輯接口 * @author zjjt * */ public interface IUserBiz { User login(User user); }
UserBizImpl.java (用戶(hù)邏輯接口實(shí)現(xiàn)類(lèi))
package com.zking.biz.impl; import com.zking.biz.IUserBiz; import com.zking.dao.IUserDao; import com.zking.dao.impl.UserDaoImpl; import com.zking.pojo.User; /** * 用戶(hù)邏輯接口實(shí)現(xiàn)類(lèi) * @author zjjt * */ public class UserBizImpl implements IUserBiz{ private IUserDao userDao=new UserDaoImpl(); @Override public User login(User user) { User u = userDao.login(user); if(u!=null) { if(u.getPassword().equals(user.getPassword())) { return u; } } return null; } }
IUserDao.java(用戶(hù)數(shù)據(jù)訪問(wèn)接口)
package com.zking.dao; import com.zking.pojo.User; /** * 用戶(hù)數(shù)據(jù)訪問(wèn)接口 * @author zjjt * */ public interface IUserDao { User login(User user); }
UserDaoImpl.java(用戶(hù)數(shù)據(jù)訪問(wèn)接口實(shí)現(xiàn)類(lèi))
package com.zking.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import com.zking.dao.IUserDao; import com.zking.pojo.User; import com.zking.util.DBHelper; public class UserDaoImpl implements IUserDao { private Connection con; private PreparedStatement ps; private ResultSet rs; @Override public User login(User user) { try { con=DBHelper.getCon(); ps=con.prepareStatement("select * from shop_user where account=?"); ps.setString(1,user.getAccount()); rs=ps.executeQuery(); if(rs.next()) { User u=new User(); u.setId(rs.getInt(1)); u.setAccount(rs.getString(2)); u.setPassword(rs.getString(3)); return u; } } catch (Exception e) { e.printStackTrace(); }finally { DBHelper.close(con, ps, rs); } return null; } }
2、商品顯示
實(shí)現(xiàn)效果如下:
將數(shù)據(jù)庫(kù)存放的數(shù)據(jù)顯示在頁(yè)面上,尊貴的xxx通過(guò)session拿到登錄的用戶(hù)名
Goods.java(商品實(shí)體類(lèi))
package com.zking.pojo; public class Goods { private Integer id; private String name; private Integer price; private String info; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public Goods(Integer id, String name, Integer price, String info) { super(); this.id = id; this.name = name; this.price = price; this.info = info; } public Goods() { super(); } @Override public String toString() { return "Goods [id=" + id + ", name=" + name + ", price=" + price + ", info=" + info + "]"; } }
index.jsp(首頁(yè)代碼)
<%@page import="com.zking.pojo.Goods"%> <%@page import="com.zking.biz.impl.GoodsBizImpl"%> <%@page import="com.zking.biz.IGoodsBiz"%> <%@page import="com.zking.pojo.User"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Document</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css" rel="external nofollow" rel="external nofollow" > <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script> <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script> <style> td:nth-child(3)::before{ content: "$"; } </style> </head> <body> <% Object obj=session.getAttribute("user"); if(obj==null){ response.sendRedirect("login.jsp"); return; } %> <div class="jumbotron"> <div class="container"> <h1>歡迎光臨苡桉SuperMarket</h1> <p>尊貴的<%=((User)obj).getAccount() %></p> </div> </div> <%=session.getAttribute("car")%> <div class="container"> <table class="table"> <tr> <th>商品序號(hào)</th> <th>商品名稱(chēng)</th> <th>商品單價(jià)</th> <th>商品描述</th> <th>操作</th> </tr> <% IGoodsBiz goodsBiz=new GoodsBizImpl(); for(Goods goods:goodsBiz.getAll()){ %> <tr> <td><%=goods.getId() %></td> <td><%=goods.getName() %></td> <td><%=goods.getPrice() %></td> <td><%=goods.getInfo() %></td> <td> <div class="btn-group btn-group-xs"> <a href="doAddCar.jsp?id=<%=goods.getId() %>" rel="external nofollow" class="btn btn-primary">添加購(gòu)物車(chē)</a> </div> </td> </tr> <% } %> </table> </div> </body> </html>
IGoodsBiz.java (商品邏輯接口)
package com.zking.biz; import java.util.List; import com.zking.pojo.Goods; /** * 商品邏輯接口 * @author zjjt * */ public interface IGoodsBiz { List<Goods>getAll(); //查詢(xún)單個(gè) Goods getOne(Integer id); }
GoodsBizImpl.java (商品邏輯接口實(shí)現(xiàn)類(lèi))
package com.zking.biz.impl; import java.util.List; import com.zking.biz.IGoodsBiz; import com.zking.dao.IGoodsDao; import com.zking.dao.impl.GoodsDaoImpl; import com.zking.pojo.Goods; /** * 商品邏輯接口實(shí)現(xiàn)類(lèi) * @author zjjt * */ public class GoodsBizImpl implements IGoodsBiz { private IGoodsDao goodsDao=new GoodsDaoImpl(); @Override public List<Goods> getAll() { return goodsDao.getAll(); } @Override public Goods getOne(Integer id) { return goodsDao.getOne(id); } }
IGoodsDao.java (商品數(shù)據(jù)訪問(wèn)接口)
package com.zking.dao; import java.util.List; import com.zking.pojo.Goods; /** * 商品數(shù)據(jù)訪問(wèn)接口 * @author zjjt * */ public interface IGoodsDao { //查詢(xún)所有 List<Goods>getAll(); //查詢(xún)單個(gè) Goods getOne(Integer id); }
GoodsDaoImpl.java (商品數(shù)據(jù)訪問(wèn)接口實(shí)現(xiàn)類(lèi))
package com.zking.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.zking.dao.IGoodsDao; import com.zking.pojo.Goods; import com.zking.pojo.User; import com.zking.util.DBHelper; /** * 訪問(wèn)數(shù)據(jù)接口實(shí)現(xiàn)類(lèi) * @author zjjt * */ public class GoodsDaoImpl implements IGoodsDao{ private Connection con; private PreparedStatement ps; private ResultSet rs; /** * 查詢(xún)?nèi)可唐? */ @Override public List<Goods> getAll() { List<Goods>list=new ArrayList<Goods>(); try { con=DBHelper.getCon(); ps=con.prepareStatement("select * from shop_goods "); rs=ps.executeQuery(); while(rs.next()) { Goods goods=new Goods(); goods.setId(rs.getInt(1)); goods.setName(rs.getString(2)); goods.setPrice(rs.getInt(3)); goods.setInfo(rs.getString(4)); list.add(goods); } return list; } catch (Exception e) { e.printStackTrace(); }finally { DBHelper.close(con, ps, rs); } return list; } /** * 根據(jù)id查詢(xún)商品 */ @Override public Goods getOne(Integer id) { try { con=DBHelper.getCon(); ps=con.prepareStatement("select * from shop_goods where id=? "); ps.setInt(1, id); rs=ps.executeQuery(); if(rs.next()) { Goods goods=new Goods(); goods.setId(rs.getInt(1)); goods.setName(rs.getString(2)); goods.setPrice(rs.getInt(3)); goods.setInfo(rs.getString(4)); return goods; } } catch (Exception e) { e.printStackTrace(); }finally { DBHelper.close(con, ps, rs); } return null; } }
3、購(gòu)物車(chē)添加&商品總數(shù)和價(jià)格的計(jì)算
doAddCar.java(處理添加購(gòu)物車(chē)的頁(yè)面)
<%@page import="java.util.List"%> <%@page import="com.zking.biz.impl.GoodsBizImpl"%> <%@page import="com.zking.biz.IGoodsBiz"%> <%@page import="com.zking.vo.CarItem"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% //添加購(gòu)物車(chē)的頁(yè)面 //拿購(gòu)物車(chē) List<CarItem>car=(List<CarItem>)session.getAttribute("car"); IGoodsBiz goodsBiz=new GoodsBizImpl(); //1、得知道是那件商品 String str=request.getParameter("id"); int id=-1; if(str!=null){ id=Integer.parseInt(str); } //2-1 判斷該商品是否存在 boolean f=true; for(CarItem item:car){ //item.getGoods().getId() 條目的商品id if(id==item.getGoods().getId()){ //商品應(yīng)該是已經(jīng)被添加了[購(gòu)物車(chē)中某個(gè)條目的商品id和你需要添加的商品id相同了] item.setCount(item.getCount()+1);//數(shù)量+1 item.setSum(item.getCount()*item.getGoods().getPrice()); f=false; break; } } //只要判斷f是否發(fā)生了改變 if(f){ //2-2、生成一個(gè)CarItem[如果購(gòu)物車(chē)沒(méi)有該商品] CarItem carItem=new CarItem(); //設(shè)置對(duì)應(yīng)的商品數(shù)據(jù) carItem.setGoods(goodsBiz.getOne(id)); //數(shù)量 carItem.setCount(1); //加車(chē)數(shù)量*商品單價(jià) //carItem.getCount()商品加車(chē)的數(shù)量 //carItem.getGoods().getPrice() 商品的單價(jià) carItem.setSum(carItem.getCount()*carItem.getGoods().getPrice()); //將購(gòu)物條目carItem 綁定到購(gòu)物車(chē) car.add(carItem); } //更新購(gòu)物車(chē) session.setAttribute("car", car); //跳回首頁(yè) response.sendRedirect("index.jsp"); %>
CarItem.java(購(gòu)物車(chē)中的每一項(xiàng),每一個(gè)條目)
package com.zking.vo; import com.zking.pojo.Goods; /** * 購(gòu)物車(chē)中的每一項(xiàng),每一個(gè)條目 * @author zjjt * */ public class CarItem { private Integer count;//數(shù)量 private Integer sum;//條目總價(jià) private Goods goods;//對(duì)應(yīng)的商品 public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public Integer getSum() { return sum; } public void setSum(Integer sum) { this.sum = sum; } public Goods getGoods() { return goods; } public void setGoods(Goods goods) { this.goods = goods; } public CarItem(Integer count, Integer sum, Goods goods) { super(); this.count = count; this.sum = sum; this.goods = goods; } public CarItem() { // TODO Auto-generated constructor stub } @Override public String toString() { return "CarItem [count=" + count + ", sum=" + sum + ", goods=" + goods + "]"; } }
效果先簡(jiǎn)單打印到頁(yè)面 之后會(huì)進(jìn)行修改
今天的分享就到這里結(jié)束啦!!??
以上就是關(guān)于JavaWeb購(gòu)物車(chē)項(xiàng)目的一些內(nèi)容!!??
總結(jié)
到此這篇關(guān)于JavaWeb購(gòu)物車(chē)項(xiàng)目開(kāi)發(fā)的文章就介紹到這了,更多相關(guān)JavaWeb購(gòu)物車(chē)項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaWeb后臺(tái)購(gòu)物車(chē)類(lèi)實(shí)現(xiàn)代碼詳解
- eclipse的web項(xiàng)目實(shí)現(xiàn)Javaweb購(gòu)物車(chē)的方法
- javaweb購(gòu)物車(chē)案列學(xué)習(xí)開(kāi)發(fā)
- java web開(kāi)發(fā)之購(gòu)物車(chē)功能實(shí)現(xiàn)示例代碼
- javaweb圖書(shū)商城設(shè)計(jì)之購(gòu)物車(chē)模塊(3)
- java web開(kāi)發(fā)之實(shí)現(xiàn)購(gòu)物車(chē)功能
- java商城項(xiàng)目實(shí)戰(zhàn)之購(gòu)物車(chē)功能實(shí)現(xiàn)
- JAVAEE中用Session簡(jiǎn)單實(shí)現(xiàn)購(gòu)物車(chē)功能示例代碼
- java實(shí)現(xiàn)網(wǎng)上購(gòu)物車(chē)程序
- Java?web實(shí)現(xiàn)購(gòu)物車(chē)案例
相關(guān)文章
Intellij IDEA 2017.3使用Lombok及常用注解介紹
這篇文章主要介紹了Intellij IDEA 2017.3使用Lombok及常用注解介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Docker環(huán)境下Spring Boot應(yīng)用內(nèi)存飆升分析與解決場(chǎng)景分析
當(dāng)運(yùn)行一個(gè)Spring Boot項(xiàng)目時(shí),如果未設(shè)置JVM內(nèi)存參數(shù),Spring Boot默認(rèn)會(huì)采用JVM自身默認(rèn)的配置策略,接下來(lái)通過(guò)本文給大家介紹Docker環(huán)境下Spring Boot應(yīng)用內(nèi)存飆升分析與解決方法,需要的朋友參考下吧2021-08-08springboot集成swagger3與knife4j的詳細(xì)代碼
這篇文章主要介紹了springboot集成swagger3與knife4j,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08Springboot整合WebSocket實(shí)戰(zhàn)教程
WebSocket使得客戶(hù)端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶(hù)端推送數(shù)據(jù),這篇文章主要介紹了Springboot整合WebSocket實(shí)戰(zhàn)教程,需要的朋友可以參考下2023-05-05使用Java servlet實(shí)現(xiàn)自動(dòng)登錄退出功能
這篇文章主要介紹了使用Java servlet實(shí)現(xiàn)自動(dòng)登錄退出功能,,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11簡(jiǎn)單了解java volatile關(guān)鍵字實(shí)現(xiàn)的原理
這篇文章主要介紹了簡(jiǎn)單了解volatile關(guān)鍵字實(shí)現(xiàn)的原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Java class文件格式之特殊字符串_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
特殊字符串出現(xiàn)在class文件中的常量池中,本著循序漸進(jìn)和減少跨度的原則, 首先把class文件中的特殊字符串做一個(gè)詳細(xì)的介紹, 然后再回過(guò)頭來(lái)繼續(xù)講解常量池,對(duì)java class 文件格式相關(guān)知識(shí)感興趣的的朋友一起學(xué)習(xí)吧2017-06-06Java編程實(shí)現(xiàn)從尾到頭打印鏈表代碼實(shí)例
這篇文章主要介紹了Java編程實(shí)現(xiàn)從尾到頭打印鏈表代碼實(shí)例,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10