【SSH網上商城項目實戰19】訂單信息的級聯入庫以及頁面的緩存問題

購物車這一塊還剩最后兩個問題,就是訂單信息的級聯入庫和頁面緩存,這里的信息是指購物車和購物項,即我們將購物車的信息存入數據庫的同時,也存入每個購物項的信息,而且外鍵都關聯好,這涉及到了Hibernate中的級聯入庫問題;頁面緩存問題指的是當用戶確認了訂單后,如果點后退,又會回到訂單確認頁面,剛剛的訂單確認頁面又出來了,而且session還在,信息還是剛剛的信息,這明顯不是我們想要的結果,我們會在后面一一分析。這一節主要來討論訂單信息的級聯入庫以及頁面的緩存問題。

1. 訂單信息的級聯入庫
? ? ? ? Hibernate中兩張關聯表的級聯入庫,需要配置一下,這里主要介紹注解的配置方式,訂單的POJO是Forder,購物項的POJO是Sorder,Forder與Sorder是一對多的關系,首先我們設置一下它們的注解配置,如下:

 1 @Entity
 2 public class Forder implements java.io.Serializable {
 3     
 4     //省略無關代碼……
 5  
 6     private List<Sorder> sorders = new ArrayList<Sorder>();
 7  
 8     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "forder")
 9     public List<Sorder> getSorders() {
10         return this.sorders;
11     }
12  
13     public void setSorders(List<Sorder> sorders) {
14         this.sorders = sorders;
15     }
16 }
17  
18 @Entity
19 public class Sorder implements java.io.Serializable {
20  
21     //省略無關代碼……
22  
23     private Forder forder;
24  
25     @ManyToOne(fetch = FetchType.LAZY)
26     @JoinColumn(name = "fid")
27     public Forder getForder() {
28         return this.forder;
29     }
30  
31     public void setForder(Forder forder) {
32         this.forder = forder;
33     }
34 }

這樣配置后,當我們save訂單項時,也會save購物項,而且自動關聯外鍵。但是前提是,我們要將它們之間的關系設置好,即forder中要setSorders(),sorder中要setForder(),以及其他相關聯的外鍵對應的實體中的屬性。

?

? ? ? ? 之前我們將購物項加入購物車的時候已經將執行了forder.setSorder(sorder)了,現在我們需要在sorder中加入forder,所以我們在原來的代碼上添加一下,如下:

 1 //這是17節中的代碼,我們在中間插上一句
 2 @Service("sorderService")
 3 public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements
 4         SorderService {
 5  
 6     @Override
 7     public Forder addSorder(Forder forder, Product product) {
 8         boolean isHave = false; //用來標記有沒有重復購物項
 9         //拿到當前的購物項
10         Sorder sorder = productToSorder(product);
11         //判斷當前購物項是否重復,如果重復,則添加數量即可
12         for(Sorder old : forder.getSorders()) {
13             if(old.getProduct().getId().equals(sorder.getProduct().getId())) {
14                 //購物項有重復,添加數量即可
15                 old.setNumber(old.getNumber() + sorder.getNumber());
16                 isHave = true;
17                 break;
18             }
19         }
20         //當前購物項在購物車中不存在,新添加即可
21         if(!isHave) {
22                         //我們在這里插入一句:
23             //在向購物中添加購物項之前,先建立購物項與購物車的關聯,但是此時forder.id為null,
24             //但是在入庫的時候是先入庫購物車,再入庫購物項,那時候就有主鍵了
25             sorder.setForder(forder);
26             forder.getSorders().add(sorder);
27         }
28         
29         return forder;
30     }
31  
32     @Override
33     public Sorder productToSorder(Product product) {
34         Sorder sorder = new Sorder();
35         sorder.setName(product.getName());
36         sorder.setNumber(1);
37         sorder.setPrice(product.getPrice());
38         sorder.setProduct(product);
39         return sorder;
40     }
41 }

? ? ? ? 好了,我們看一下訂單確認時跳轉到了哪個Action:

?

? ? ? ? 所以我們去完成forderAction中的邏輯:

?

 1 @Controller("forderAction")
 2 @Scope("prototype")
 3 public class ForderAction extends BaseAction<Forder> {
 4     
 5     @Override
 6     public Forder getModel() {
 7         model = (Forder) session.get("forder");
 8         return model;
 9     }
10  
11     //實現購物車(訂單)與購物項(訂單項)級聯入庫功能
12     public String save() {
13 //        // 把session中的購物項交給當前的model對象
14 //        Forder forder = (Forder) session.get("forder");
15 //        //model.setSorders(forder.getSorders());
16 //        forder.setAddress(model.getAddress());
17 //        forder.setName(model.getName());
18 //        forder.setPhone(model.getPhone());
19 //        forder.setRemark(model.getRemark());
20 //        forder.setUser((User)session.get("user"));
21 //        forder.setStatus(new Status(1));
22 //        forder.setPost(model.getPost());
23 //        //級聯入庫(需要在xml或者POJO的注解中配置),需要sorder關聯forder
24 //        //在SorderServiceImpl類中追加sorder.setForder(forder);
25 //        forderService.save(forder);
26         
27         model.setUser((User)session.get("user"));
28         model.setStatus(new Status(1));
29         forderService.save(model);
30         
31         return "bank";
32     }
33 }

從上面的代碼中可以看出,有兩種方法:第一種不覆寫getModel方法(我注釋掉的部分),這個方法比較笨,由于ForderAction繼承了BaseAction,而BaseAction實現了ModelDriven接口,所以傳過來的數據會封裝到model中,model是BaseAction中的一個屬性,然后我們需要將model中的信息全部傳到session中的forder中,然后forder中數據有了才能與Sorder一起級聯入庫,不過這種方法有點笨……所以我們采用第二種方法,重寫getModel方法,直接將forder賦給model即可,然后我們只要將model中級聯的項添加一下即可,即上面非注釋的代碼。這樣用戶點擊訂單確認后,信息入庫,跳轉到支付頁面(支付頁面接下來要做,目前先隨便跳轉到一個jsp即可)。

2. 頁面緩存問題
? ? ? ? 現在訂單信息的級聯入庫解決了,但是如果用戶點擊確認訂單后,再后退,我們發現還是原來的訂單確認頁面,而且信息還是剛剛的信息,session也沒關,也就是說相當于我又要確認訂單信息,這明顯是不妥的,也就是說,當用戶點擊確認訂單后,我們不能讓頁面緩存,這樣的話,當用戶點擊后退,就會顯示頁面已經失效了,我們讓它跳到首頁即可。

? ? ? ? 我們知道,在前臺jsp頁面可以設置讓瀏覽器不緩存數據,所以我們可以在前臺confirm.jsp頁面進行如下設置:

但是問題沒那么簡單,僅僅這樣做是不行的,這樣做的話,用戶點擊后退是會出現頁面已過期的提示,但是當用戶刷新一下又不行了,又會顯示緩存加載原來的數據。所以我們明白了一點,由于session還沒關閉,session中有訂單的信息forder,用戶刷新一下肯定會繼續拿到這個forder,就會顯示原來的訂單信息,所以僅僅在前臺這樣設置根本無法解決問題,我們在后臺也要做相關處理才行。

? ? ? ? 既然知道問題所在了,我們可以這樣做:因為當用戶點擊確認訂單后,會交給ForderAction,然后ForderAction處理完后會跳轉到支付頁面,我們可以在ForderAction中做些手腳:我們將session中原來的forder給清掉,那就不OK了么?這是可行的,但是考慮到后面支付的時候還是需要訂單的相關信息,所以我們可以將session中原來的forder保存到另一個地方,然后將原來的forder清空,所以我們在上面的ForderAction中最后加上兩行代碼,如下:

?

 1 @Controller("forderAction")
 2 @Scope("prototype")
 3 public class ForderAction extends BaseAction<Forder> {
 4     
 5     @Override
 6     public Forder getModel() {
 7         model = (Forder) session.get("forder");
 8         return model;
 9     }
10  
11     //實現購物車(訂單)與購物項(訂單項)級聯入庫功能
12     public String save() {
13 //        // 把session中的購物項交給當前的model對象
14 //        Forder forder = (Forder) session.get("forder");
15 //        //model.setSorders(forder.getSorders());
16 //        forder.setAddress(model.getAddress());
17 //        forder.setName(model.getName());
18 //        forder.setPhone(model.getPhone());
19 //        forder.setRemark(model.getRemark());
20 //        forder.setUser((User)session.get("user"));
21 //        forder.setStatus(new Status(1));
22 //        forder.setPost(model.getPost());
23 //        //級聯入庫(需要在xml或者POJO的注解中配置),需要sorder關聯forder
24 //        //在SorderServiceImpl類中追加sorder.setForder(forder);
25 //        forderService.save(forder);
26         
27         model.setUser((User)session.get("user"));
28         model.setStatus(new Status(1));
29         forderService.save(model);
30         
31         //此時購物車已經入庫,那么原來session中的購物車就應該清空
32         session.put("oldForder", session.get("forder"));//先將原來的購物車信息保存下來,因為后面付款的時候還需要相關信息
33         session.put("forder", new Forder());//new一個新的空購物車(相當于清空了購物車),還可以方便用戶再買~
34         return "bank";
35     }
36 }

? ? ? ? 然后還沒完,我們在前臺確認訂單頁面也得加上下面的代碼:

?

現在的邏輯就清楚了,首先到訂單確認頁面,forder是有數據的,所以不為空,這個判斷無效的,當用戶點擊確認訂單后,在ForderAction中我們將forder換成了一個空的Forder對象,也就是說原來的數據都沒了(我們保存在session中另一個鍵值對中,供后面支付用),這樣當用戶點后退又回到剛剛訂單確認頁面時,那個判斷就生效了,就會跳轉到首頁去,到這里,整個邏輯就完整了,頁面緩存問題解決好了。
?

轉載于:https://www.cnblogs.com/sharpest/p/9916404.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276952.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

exfat分配單元大小選多少_安防監控攝像機視角大小和鏡頭毫米數的基礎知識!...

關于選擇監控鏡頭毫米數的問題&#xff0c;雖然只有新手才有此困惑&#xff0c;但是我們還是要認真地說一說。監控視角&#xff0c;就是指監控照射的鏡頭所能覆蓋到的范圍&#xff0c;就是監控畫面所能看到的角度統稱叫監控視角。我們正常選購監控的時候&#xff0c;除了可以選…

彩信編輯器之預覽功能

html代碼 <table width"200"height"250"border"0"cellpadding"0"cellspacing"0"bgcolor"#666666"><tr><td align"center"valign"middle"><marquee id"MMScreen&qu…

java 幾個實用的小工具

1、除法運算 編程的人都知道&#xff0c;java中的“/”、“%”運算&#xff0c;其中前者為取整&#xff0c;后者取余數。那么有沒有快捷的運算方法取正常的運算結果呢&#xff1f; 查了資料&#xff0c;發現很簡單。代碼如下&#xff1a; public static String txfloat(int a,i…

處理模板頁菜單高亮

//處理模板頁菜單高亮var urlstatus false;$("#indexMenu a").each(function () {if ((location.href /).indexOf($(this).attr(href)) > -1 && $(this).attr(href) ! ) {$(this).parent().addClass(active);urlstatus true;} else {$(this).parent().…

動畫演示 Delphi 2007 IDE 功能[3] - 修改屬性

動畫劇本:添加控件后用 F11 激活 Object Inspector 窗口;可用 ↑ ↓ 選擇屬性;用 Tab 切換屬性名和屬性值;用 Tab 切換到屬性名后, 鍵入屬性名的部分字母, 可迅速定位;用 Tab 切換到屬性值后, 也可以鍵入字母選擇, 而后回車確認.Ctrl↓ 可以選擇其他控件;整個過程可以做到無鼠標…

kali怎么成為管理員_網站死鏈是什么、是怎么引起的以及死鏈對SEO優化的影響?...

網站死鏈是我們在做SEO時必不可少的一個錯誤&#xff0c;對于從事SEO行業的人員來說&#xff0c;網站死鏈最熟悉不過了&#xff0c;但是對于那些剛入SEO行業的新手來說&#xff0c;還是不太熟悉。今天我們就給大家講一下什么是網站死鏈&#xff1f;網站死鏈是怎么引起的&#x…

Map-Reduce入門

1、Map-Reduce的邏輯過程 假設我們需要處理一批有關天氣的數據&#xff0c;其格式如下&#xff1a; 按照ASCII碼存儲&#xff0c;每行一條記錄每一行字符從0開始計數&#xff0c;第15個到第18個字符為年第25個到第29個字符為溫度&#xff0c;其中第25位是符號/-006701199099999…

Java之泛型T T與T的用法

<T> T表示返回值是一個泛型&#xff0c;傳遞啥&#xff0c;就返回啥類型的數據&#xff0c;而單獨的T就是表示限制你傳遞的參數類型&#xff0c;這個案例中&#xff0c;通過一個泛型的返回方式&#xff0c;獲取每一個集合中的第一個數據&#xff0c; 通過返回值<T>…

UrlReWriter 使用經驗小結

UrlRewriter 是微軟封裝好了的一個URL重寫組件。使用它可以讓我節約很多自已開發的時間。 好了&#xff0c;開始講述我的應用經驗&#xff0c;這只是很菜鳥的經驗&#xff0c;高手就不用看了。 第一步&#xff0c;請從此下載此組件。解壓&#xff0c;把UrlRewriter.dll copy到你…

clickhouse大數據分析技術與實戰_從銷售到經營——大客戶銷售策略與實戰技術...

對于首席客戶代表而言&#xff0c;要走出困局&#xff0c;所需要大客戶銷售策略性的訓練&#xff0c;而不是像基層客戶經理的銷售技巧訓練一樣&#xff1b;新業務的學習固然重要&#xff0c;但更重要的是轉化成實戰績效。從組織變革角度&#xff0c;每次成功的業務轉型背后都意…

Hadoop_NameNode_代碼分析_目錄樹(2)

&#xff08;1&#xff09;NameNode的內存中保存了龐大的目錄樹結構&#xff0c;這個結構用來保存文件目錄結構和文件Block之間的映射&#xff0c;這種結構關系會固化在磁盤上&#xff0c;但是對樹的改動頻繁發生&#xff0c;什么時候將樹寫入磁盤呢&#xff1f;把每次操作應用…

詳解 Visual C# 數據庫編程

詳解 Visual C# 數據庫編程 ******2007-11-05 14:34關于數據庫編程&#xff0c;微軟提供了一個統一的數據對象訪問模型&#xff0c;在Visual Studio6.0中稱為ADO&#xff0c;在.NET中則統一為ADO.NET,掌握ADO.NET就等于掌握了數據庫編程的核心。 針對數據庫編程始終是程序設計語…

swift - 根試圖控制器的手勢返回沖突 - push 新的tabbar控制器手勢沖突

1. 禁用手勢 和開啟手勢extension JYRTSShopListController: UIGestureRecognizerDelegate {/// 禁止使用手勢返回func forbidhenSideBack() {self.isCanSideBack falseif (self.navigationController?.responds(to:#selector(getter: self.navigationController?.interacti…

Acer 4750 安裝黑蘋果_黑蘋果系統安裝通用教程圖文版

在開始之前&#xff0c;不管你要安裝的是臺式組裝機&#xff0c;臺式品牌機&#xff0c;一體機&#xff0c;還是筆記本&#xff0c;都要大概了解一下硬件信息。因為黑蘋果的安裝確實比安裝Windows的系統要復雜的多。不管是前期準備工作&#xff0c;安裝&#xff0c;還是安裝之后…

IIS7中使用集成模式時出現HttpException

癥狀:在iis7在使用集成模式的Pool可能出現HttpException,而程序在經典模式下能正常運行. 解決方法:http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx 轉載于:https://www.cnbl…

教你學會七種維護服務器安全最佳技巧

導讀&#xff1a; 你的計算機上是否存在有至關重要的數據,并且不希望它們落入惡人之手呢?當然,它們完全有這種可能 。而且,近些年來,服務器遭受的風險也比以前更大了.越來越多的病毒,心懷不軌的黑客,以及那些商業間諜都將服務器作為了自己的目標.很顯然,服務器的安全問題是不容…

mysql 快速生成百萬條測試數據

轉自&#xff1a;http://www.cnblogs.com/jiangxiaobo/p/6101072.html 1、生成思路 利用mysql內存表插入速度快的特點&#xff0c;先利用函數和存儲過程在內存表中生成數據&#xff0c;然后再從內存表插入普通表中2、創建內存表及普通表 CREATE TABLE vote_record_memory (id I…

自動化專業學python有用嗎-馬哥教育官網-專業Linux培訓班,Python培訓機構

今天小編要來說一下Python自動化的學習思路&#xff0c; 對于剛剛進入的測試行業的人來說&#xff0c;未來該怎么樣朝著自動化方向發展&#xff0c;即使接觸到了自動化測試&#xff0c;又該從何下手去學呢&#xff1f; 簡單的說&#xff0c; 做測試做的好&#xff0c;會了接口&…

java JVM

每一個Java虛擬機都由一個類加載器子系統&#xff08;class loader subsystem&#xff09;&#xff0c;負責加載程序中的類型&#xff08;類和接口&#xff09;&#xff0c;并賦予唯一的名字。每一個Java虛擬機都有一個執行引擎&#xff08;execution engine&#xff09;負責執…

馬化騰聯手10余位科學家發起科學探索獎,騰訊基金投入10億元啟動資金

11月9日消息&#xff0c;據騰訊科技報道&#xff0c;騰訊基金會于騰訊公司成立20周年之際宣布&#xff0c;騰訊公司董事會主席兼首席執行官&#xff0c;騰訊基金會發起人馬化騰&#xff0c;與北京大學教授饒毅&#xff0c;攜手楊振寧、毛淑德、何華武、鄔賀銓、李培根、陳十一、…