SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能
上一節(jié)我們將商品的詳細(xì)頁面做完了,并使用了Hibernate的二級緩存加載詳細(xì)頁面來提高系統(tǒng)的性能,點擊文章查看:。這節(jié)我們開始做購物車部分。
1. 添加新的表
首先我們向數(shù)據(jù)庫中添加幾張表:用戶表、訂單狀態(tài)表、訂單表(購物車表)以及購物項表。用戶表中存有用戶的基本信息,訂單狀態(tài)表中主要存儲訂單的狀態(tài),比如已發(fā)貨這種,訂單表主要存儲用戶的信息和訂單的狀態(tài),所以跟用戶表和訂單狀態(tài)表關(guān)聯(lián),購物項表存儲某個商品以及所屬的訂單,所以跟商品表和訂單表相關(guān)聯(lián)。具體的表信息見下面的sql語句:
/*============================*/ /* Table: 用戶表結(jié)構(gòu) */ /*============================*/ create table user ( /* 用戶編號,自動增長 */ id int primary key not null auto_increment, /* 用戶登錄名 */ login varchar(20), /* 用戶真實姓名 */ name varchar(20), /* 用戶登錄密碼 */ pass varchar(20), /* 用戶性別 */ sex varchar(20), /* 用戶電話 */ phone varchar(20), /* 用戶Email */ email varchar(20) ); /*=============================*/ /* Table: 訂單狀態(tài)表結(jié)構(gòu) */ /*=============================*/ create table status ( /* 狀態(tài)編號,自動增長 */ id int primary key not null auto_increment, /* 訂單狀態(tài) */ status varchar(10) ); /*=============================*/ /* Table: 購物車(訂單)表結(jié)構(gòu) */ /*=============================*/ create table forder ( /* 訂單編號,自動增長 */ id int primary key not null auto_increment, /* 收件人名字 */ name varchar(20), /* 收件人電話 */ phone varchar(20), /* 配送信息 */ remark varchar(20), /* 下單日期 */ date timestamp default CURRENT_TIMESTAMP, /* 訂單總金額 */ total decimal(8,2), /* 收件人郵編 */ post varchar(20), /* 收件人郵編 */ address varchar(200), /* 訂單狀態(tài) */ sid int default 1, /* 會員編號 */ uid int, constraint sid_FK foreign key(sid) references status(id), constraint uid_FK foreign key(uid) references user(id) ); /*=============================*/ /* Table: 購物項表結(jié)構(gòu) */ /*=============================*/ create table sorder ( /* 購物項編號,自動增長 */ id int primary key not null auto_increment, /* 被購買商品的名稱 */ name varchar(20), /* 購買時商品的價格 */ price decimal(8,2), /* 購買的數(shù)量 */ number int not null, /* 所屬商品編號 */ pid int, /* 此訂單項,所屬的訂單編號 */ fid int, constraint pid_FK foreign key(pid) references product(id), constraint fid_FK foreign key(fid) references forder(id) );
然后我們將這些表通過逆向工程轉(zhuǎn)換為POJO,具體不在贅述。
2. 購物車的后臺邏輯
2.1 Service層的邏輯
當(dāng)用戶將某個商品加入購物車時,我們首先要通過商品的id獲取該商品信息,然后將該商品添加到購物車中,在添加之前,我們首先得判斷當(dāng)前session中有沒有購物車,如果沒有的話,我們得先創(chuàng)建一個購物車,如果有,我們將當(dāng)前的購物項添加到購物車?yán)?,在添加之前,需要先判斷該購物項在購物車中是否已?jīng)存在了,如果存在了只需要增加相應(yīng)的購物數(shù)量即可,如果不存在則添加,然后計算購物總價格,最后將購物車存到session中。整個流程見下面的示意圖:

接下來我們來實現(xiàn)具體的邏輯,首先新建兩個Service接口:SorderService和ForderService。SorderService中主要定義了兩個方法:將用戶添加的商品轉(zhuǎn)換為購物項,然后將購物項添加到購物車;ForderService中主要定義了計算購物車總價格的方法,如下:
//SorderService接口
public interface SorderService extends BaseService<Sorder> {
//添加購物項,返回新的購物車
public Forder addSorder(Forder forder, Product product);
//把商品數(shù)據(jù)轉(zhuǎn)化為購物項
public Sorder productToSorder(Product product);
}
//ForderService接口
public interface ForderService extends BaseService<Forder> {
//計算購物總價格
public double cluTotal(Forder forder);
}
然后我們具體實現(xiàn)這兩個接口:
//SorderServiceImpl實現(xiàn)類
@Service("sorderService")
public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements
SorderService {
@Override
public Forder addSorder(Forder forder, Product product) {
boolean isHave = false; //用來標(biāo)記有沒有重復(fù)購物項
//拿到當(dāng)前的購物項
Sorder sorder = productToSorder(product);
//判斷當(dāng)前購物項是否重復(fù),如果重復(fù),則添加數(shù)量即可
for(Sorder old : forder.getSorders()) {
if(old.getProduct().getId().equals(sorder.getProduct().getId())) {
//購物項有重復(fù),添加數(shù)量即可
old.setNumber(old.getNumber() + sorder.getNumber());
isHave = true;
break;
}
}
//當(dāng)前購物項在購物車中不存在,新添加即可
if(!isHave) {
forder.getSorders().add(sorder);
}
return forder;
}
@Override
public Sorder productToSorder(Product product) {
Sorder sorder = new Sorder();
sorder.setName(product.getName());
sorder.setNumber(1);
sorder.setPrice(product.getPrice());
sorder.setProduct(product);
return sorder;
}
}
//ForderServiceImpl實現(xiàn)類
@Service("forderService")
public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService {
@Override
public double cluTotal(Forder forder) {
double total = 0.0;
for(Sorder sorder : forder.getSorders()) {
total += sorder.getNumber() * sorder.getPrice();
}
return total;
}
}
然后我們需要將這兩個bean注入到BaseAction中,供SorderAction使用:
@Controller("baseAction")
@Scope("prototype")
public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> {
//省略其他無關(guān)代碼……
@Resource
protected ForderService forderService;
@Resource
protected SorderService sorderService;
}
好了,Service層的邏輯做完了,接下來準(zhǔn)備做Action部分:
2.2 Action部分的邏輯
我們新建一個SorderAction,將上面的邏輯圖上顯示的流程走一遍即可完成添加購物車的邏輯了。代碼如下:
@Controller
@Scope("prototype")
public class SorderAction extends BaseAction<Sorder> {
public String addSorder() {
//1. 根據(jù)product.id獲取相應(yīng)的商品數(shù)據(jù)
Product product = productService.get(model.getProduct().getId());
//2. 判斷當(dāng)前session是否有購物車,如果沒有則創(chuàng)建
if(session.get("forder") == null) {
//創(chuàng)建新的購物車,存儲到session中
session.put("forder", new Forder(new HashSet<Sorder>()));
}
//3. 把商品信息轉(zhuǎn)化為sorder,并且添加到購物車中(判斷購物項是否重復(fù))
Forder forder = (Forder) session.get("forder");
forder = sorderService.addSorder(forder, product);
//4. 計算購物的總價格
forder.setTotal(forderService.cluTotal(forder));
//5. 把新的購物車存儲到session中
session.put("forder", forder);
return "showCart";
}
}
配置一下struts.xml文件:
<action name="sorder_*" class="sorderAction" method="{1}">
<result name="showCart">/showCart.jsp</result>
</action>
然后跳轉(zhuǎn)到購物車顯示頁面showCart.jsp,showCart.jsp中關(guān)于購物車部分的前臺程序如下:

3. 前臺鏈接的跳轉(zhuǎn)
后臺部分全部做完了,接下來將前臺detail.jsp頁面添加購物車的鏈接地址該成訪問SorderAction即可:

這樣就能正確跳轉(zhuǎn)了,下面我們看一下購物車顯示頁面的具體效果:

這樣我們購物車的基本功能就做完了,后面我們再對其做一些完善。
原文地址:http://blog.csdn.net/eson_15/article/details/51418350
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 用ajax自動加載blogjava和博客園的rss
- java AJAX實現(xiàn)級聯(lián)下拉框
- ajax java 實現(xiàn)自動完成功能
- 深入Ajax代理的Java Servlet的實現(xiàn)詳解
- 在Java的Struts中判斷是否調(diào)用AJAX及用攔截器對其優(yōu)化
- AJAX省市區(qū)三級聯(lián)動下拉菜單(java版)
- SSH框架網(wǎng)上商城項目第14戰(zhàn)之商城首頁UI的設(shè)計
- SSH框架網(wǎng)上商城項目第22戰(zhàn)之銀行圖標(biāo)以及支付頁面顯示
- SSH框架網(wǎng)上商城項目第23戰(zhàn)之在線支付功能實現(xiàn)
- SSH框架網(wǎng)上商城項目第28戰(zhàn)之使用Ajax技術(shù)局部更新商品數(shù)量和總價
相關(guān)文章
SpringBoot整合Mybatis無法掃描xml文件的解決
這篇文章主要介紹了SpringBoot整合Mybatis無法掃描xml文件的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Java8內(nèi)存模型PermGen Metaspace實例解析
這篇文章主要介紹了Java8內(nèi)存模型PermGen Metaspace實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
詳解Java虛擬機(jī)管理的內(nèi)存運行時數(shù)據(jù)區(qū)域
這篇文章主要介紹了詳解Java虛擬機(jī)管理的內(nèi)存運行時數(shù)據(jù)區(qū)域的相關(guān)資料,需要的朋友可以參考下2017-03-03
Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)
這篇文章主要介紹了Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
SpringBoot整合Spring Security構(gòu)建安全的Web應(yīng)用
pring Security是一個強(qiáng)大的身份驗證和訪問控制框架,本文主要介紹了SpringBoot整合Spring Security構(gòu)建安全的Web應(yīng)用,具有一定的參考價值,感興趣的可以了解一下2024-01-01
看動畫學(xué)算法之Java實現(xiàn)doublyLinkedList
這篇文章主要介紹Java實現(xiàn)doublyLinkedList,LinkedList:doublyLinkedList相對比較復(fù)雜,今天就來簡單學(xué)習(xí)一下doublyLinkedList的基本操作和概,感興趣的小伙伴可以參考下面具體文章內(nèi)容2021-10-10
Mybatis如何實現(xiàn)關(guān)聯(lián)屬性懶加載
這篇文章主要介紹了Mybatis如何實現(xiàn)關(guān)聯(lián)屬性懶加載的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

