最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SSH框架網(wǎng)上商城項(xiàng)目第17戰(zhàn)之購(gòu)物車(chē)基本功能

 更新時(shí)間:2016年06月03日 15:22:27   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第17戰(zhàn)之購(gòu)物車(chē)基本功能的實(shí)現(xiàn)過(guò)程,感興趣的小伙伴們可以參考一下

上一節(jié)我們將商品的詳細(xì)頁(yè)面做完了,并使用了Hibernate的二級(jí)緩存加載詳細(xì)頁(yè)面來(lái)提高系統(tǒng)的性能,點(diǎn)擊文章查看:。這節(jié)我們開(kāi)始做購(gòu)物車(chē)部分。

1. 添加新的表
首先我們向數(shù)據(jù)庫(kù)中添加幾張表:用戶(hù)表、訂單狀態(tài)表、訂單表(購(gòu)物車(chē)表)以及購(gòu)物項(xiàng)表。用戶(hù)表中存有用戶(hù)的基本信息,訂單狀態(tài)表中主要存儲(chǔ)訂單的狀態(tài),比如已發(fā)貨這種,訂單表主要存儲(chǔ)用戶(hù)的信息和訂單的狀態(tài),所以跟用戶(hù)表和訂單狀態(tài)表關(guān)聯(lián),購(gòu)物項(xiàng)表存儲(chǔ)某個(gè)商品以及所屬的訂單,所以跟商品表和訂單表相關(guān)聯(lián)。具體的表信息見(jiàn)下面的sql語(yǔ)句:

/*============================*/ 
/* Table: 用戶(hù)表結(jié)構(gòu)    */ 
/*============================*/ 
create table user 
( 
 /* 用戶(hù)編號(hào),自動(dòng)增長(zhǎng) */ 
 id     int primary key not null auto_increment, 
 /* 用戶(hù)登錄名 */ 
 login    varchar(20), 
 /* 用戶(hù)真實(shí)姓名 */ 
 name    varchar(20), 
 /* 用戶(hù)登錄密碼 */ 
 pass    varchar(20), 
 /* 用戶(hù)性別 */ 
 sex     varchar(20), 
 /* 用戶(hù)電話(huà) */ 
 phone    varchar(20), 
 /* 用戶(hù)Email */ 
 email    varchar(20) 
); 
 
/*=============================*/ 
/* Table: 訂單狀態(tài)表結(jié)構(gòu)    */ 
/*=============================*/ 
create table status 
( 
 /* 狀態(tài)編號(hào),自動(dòng)增長(zhǎng) */ 
 id     int primary key not null auto_increment, 
 /* 訂單狀態(tài) */ 
 status    varchar(10) 
); 
 
/*=============================*/ 
/* Table: 購(gòu)物車(chē)(訂單)表結(jié)構(gòu)   */ 
/*=============================*/ 
create table forder 
( 
 /* 訂單編號(hào),自動(dòng)增長(zhǎng) */ 
 id     int primary key not null auto_increment, 
 /* 收件人名字 */ 
 name    varchar(20), 
 /* 收件人電話(huà) */ 
 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, 
 /* 會(huì)員編號(hào) */ 
 uid     int, 
 constraint sid_FK foreign key(sid) references status(id), 
 constraint uid_FK foreign key(uid) references user(id) 
); 
 
/*=============================*/ 
/* Table: 購(gòu)物項(xiàng)表結(jié)構(gòu)    */ 
/*=============================*/ 
 
create table sorder 
( 
 /* 購(gòu)物項(xiàng)編號(hào),自動(dòng)增長(zhǎng) */ 
 id     int primary key not null auto_increment, 
 /* 被購(gòu)買(mǎi)商品的名稱(chēng) */ 
 name    varchar(20), 
 /* 購(gòu)買(mǎi)時(shí)商品的價(jià)格 */ 
 price    decimal(8,2), 
 /* 購(gòu)買(mǎi)的數(shù)量 */ 
 number    int not null, 
 /* 所屬商品編號(hào) */ 
 pid     int, 
 /* 此訂單項(xiàng),所屬的訂單編號(hào) */ 
 fid     int, 
 constraint pid_FK foreign key(pid) references product(id), 
 constraint fid_FK foreign key(fid) references forder(id) 
); 

然后我們將這些表通過(guò)逆向工程轉(zhuǎn)換為POJO,具體不在贅述。

2. 購(gòu)物車(chē)的后臺(tái)邏輯
2.1 Service層的邏輯
當(dāng)用戶(hù)將某個(gè)商品加入購(gòu)物車(chē)時(shí),我們首先要通過(guò)商品的id獲取該商品信息,然后將該商品添加到購(gòu)物車(chē)中,在添加之前,我們首先得判斷當(dāng)前session中有沒(méi)有購(gòu)物車(chē),如果沒(méi)有的話(huà),我們得先創(chuàng)建一個(gè)購(gòu)物車(chē),如果有,我們將當(dāng)前的購(gòu)物項(xiàng)添加到購(gòu)物車(chē)?yán)?,在添加之前,需要先判斷該?gòu)物項(xiàng)在購(gòu)物車(chē)中是否已經(jīng)存在了,如果存在了只需要增加相應(yīng)的購(gòu)物數(shù)量即可,如果不存在則添加,然后計(jì)算購(gòu)物總價(jià)格,最后將購(gòu)物車(chē)存到session中。整個(gè)流程見(jiàn)下面的示意圖:

接下來(lái)我們來(lái)實(shí)現(xiàn)具體的邏輯,首先新建兩個(gè)Service接口:SorderService和ForderService。SorderService中主要定義了兩個(gè)方法:將用戶(hù)添加的商品轉(zhuǎn)換為購(gòu)物項(xiàng),然后將購(gòu)物項(xiàng)添加到購(gòu)物車(chē);ForderService中主要定義了計(jì)算購(gòu)物車(chē)總價(jià)格的方法,如下:

//SorderService接口 
public interface SorderService extends BaseService<Sorder> { 
 //添加購(gòu)物項(xiàng),返回新的購(gòu)物車(chē) 
 public Forder addSorder(Forder forder, Product product); 
 //把商品數(shù)據(jù)轉(zhuǎn)化為購(gòu)物項(xiàng) 
 public Sorder productToSorder(Product product); 
} 
//ForderService接口 
public interface ForderService extends BaseService<Forder> { 
 //計(jì)算購(gòu)物總價(jià)格 
 public double cluTotal(Forder forder); 
} 

然后我們具體實(shí)現(xiàn)這兩個(gè)接口:

//SorderServiceImpl實(shí)現(xiàn)類(lèi) 
@Service("sorderService") 
public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements 
  SorderService { 
 
 @Override 
 public Forder addSorder(Forder forder, Product product) { 
  boolean isHave = false; //用來(lái)標(biāo)記有沒(méi)有重復(fù)購(gòu)物項(xiàng) 
  //拿到當(dāng)前的購(gòu)物項(xiàng) 
  Sorder sorder = productToSorder(product); 
  //判斷當(dāng)前購(gòu)物項(xiàng)是否重復(fù),如果重復(fù),則添加數(shù)量即可 
  for(Sorder old : forder.getSorders()) { 
   if(old.getProduct().getId().equals(sorder.getProduct().getId())) { 
    //購(gòu)物項(xiàng)有重復(fù),添加數(shù)量即可 
    old.setNumber(old.getNumber() + sorder.getNumber()); 
    isHave = true; 
    break; 
   } 
  } 
  //當(dāng)前購(gòu)物項(xiàng)在購(gòu)物車(chē)中不存在,新添加即可 
  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實(shí)現(xiàn)類(lèi) 
@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; 
 } 
  
} 

 然后我們需要將這兩個(gè)bean注入到BaseAction中,供SorderAction使用:

@Controller("baseAction") 
@Scope("prototype") 
public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> { 
 
 //省略其他無(wú)關(guān)代碼…… 
 
 @Resource 
 protected ForderService forderService; 
 @Resource 
 protected SorderService sorderService; 
 
} 

好了,Service層的邏輯做完了,接下來(lái)準(zhǔn)備做Action部分:
2.2 Action部分的邏輯
我們新建一個(gè)SorderAction,將上面的邏輯圖上顯示的流程走一遍即可完成添加購(gòu)物車(chē)的邏輯了。代碼如下:

@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是否有購(gòu)物車(chē),如果沒(méi)有則創(chuàng)建 
  if(session.get("forder") == null) { 
   //創(chuàng)建新的購(gòu)物車(chē),存儲(chǔ)到session中 
   session.put("forder", new Forder(new HashSet<Sorder>())); 
  } 
 
  //3. 把商品信息轉(zhuǎn)化為sorder,并且添加到購(gòu)物車(chē)中(判斷購(gòu)物項(xiàng)是否重復(fù)) 
  Forder forder = (Forder) session.get("forder"); 
  forder = sorderService.addSorder(forder, product); 
   
  //4. 計(jì)算購(gòu)物的總價(jià)格 
  forder.setTotal(forderService.cluTotal(forder)); 
  //5. 把新的購(gòu)物車(chē)存儲(chǔ)到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)到購(gòu)物車(chē)顯示頁(yè)面showCart.jsp,showCart.jsp中關(guān)于購(gòu)物車(chē)部分的前臺(tái)程序如下:


3. 前臺(tái)鏈接的跳轉(zhuǎn)

后臺(tái)部分全部做完了,接下來(lái)將前臺(tái)detail.jsp頁(yè)面添加購(gòu)物車(chē)的鏈接地址該成訪問(wèn)SorderAction即可:


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

這樣我們購(gòu)物車(chē)的基本功能就做完了,后面我們?cè)賹?duì)其做一些完善。

原文地址:http://blog.csdn.net/eson_15/article/details/51418350
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解如何使用MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)的CRUD

    詳解如何使用MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)的CRUD

    這篇文章主要為大家詳細(xì)介紹了如何使用MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)的CRUD操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過(guò)程解析

    Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過(guò)程解析

    在Mybatis中,我們需要?jiǎng)?chuàng)建一個(gè)與實(shí)體類(lèi)對(duì)應(yīng)的Mapper接口,然后在該接口上添加方法,這些方法對(duì)應(yīng)著SQL語(yǔ)句,這篇文章主要介紹了Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過(guò)程,需要的朋友可以參考下
    2023-11-11
  • Datagram Scoket雙向通信

    Datagram Scoket雙向通信

    這篇文章主要介紹了Datagram Scoket雙向通信,需要的朋友可以參考下
    2014-04-04
  • 全面解讀Java?NIO(看這篇就夠了)

    全面解讀Java?NIO(看這篇就夠了)

    Java?NIO是Java1.4之后推出來(lái)的一套IO接口,NIO提供了一種完全不同的操作方式,?NIO支持面向緩沖區(qū)的、基于通道的IO操作,這篇文章主要介紹了Java?NIO詳解(看這篇就夠了),需要的朋友可以參考下
    2023-05-05
  • Java ArrayList集合詳解(Java動(dòng)態(tài)數(shù)組)

    Java ArrayList集合詳解(Java動(dòng)態(tài)數(shù)組)

    這篇文章主要介紹了Java ArrayList集合詳解(Java動(dòng)態(tài)數(shù)組),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • springboot2中HikariCP連接池的相關(guān)配置問(wèn)題

    springboot2中HikariCP連接池的相關(guān)配置問(wèn)題

    這篇文章主要介紹了springboot2中HikariCP連接池的相關(guān)配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn)

    Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn)

    這篇文章主要介紹了Java使用Maven BOM統(tǒng)一管理版本號(hào)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 使用java代碼獲取新浪微博應(yīng)用的access token代碼實(shí)例

    使用java代碼獲取新浪微博應(yīng)用的access token代碼實(shí)例

    這篇文章主要介紹了使用java代碼獲取新浪微博應(yīng)用的access token實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java實(shí)現(xiàn)多線程下載和斷點(diǎn)續(xù)傳

    Java實(shí)現(xiàn)多線程下載和斷點(diǎn)續(xù)傳

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程下載和斷點(diǎn)續(xù)傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 一文教你如何更改IDEA已有項(xiàng)目的路徑/名稱(chēng)

    一文教你如何更改IDEA已有項(xiàng)目的路徑/名稱(chēng)

    由于IDEA項(xiàng)目路徑中有中文、空格等特殊符號(hào),影響正常使用,想要修改路徑名稱(chēng),怎么正確修改IDEA項(xiàng)目名稱(chēng),使其正常運(yùn)行呢?所以本文小編講給大家詳細(xì)的介紹了更改IDEA已有項(xiàng)目的路徑/名稱(chēng)解決方案,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

丰城市| 咸宁市| 土默特右旗| 余干县| 孟村| 清流县| 武隆县| 滁州市| 赣州市| 怀化市| 大同县| 公安县| 青冈县| 湾仔区| 龙江县| 宝坻区| 德江县| 峡江县| 沛县| 乳源| 二手房| 南投市| 辽宁省| 海兴县| 永清县| 永寿县| 平山县| 普洱| 神木县| 阜南县| 子长县| 松滋市| 彰化县| 陵水| 朝阳区| 滨州市| 巧家县| 虹口区| 米脂县| 定西市| 古蔺县|