SSH框架網上商城項目第19戰之定單信息級聯入庫和頁面緩存成績。本站提示廣大學習愛好者:(SSH框架網上商城項目第19戰之定單信息級聯入庫和頁面緩存成績)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第19戰之定單信息級聯入庫和頁面緩存成績正文
購物車這一塊還剩最初兩個成績,就是定單信息的級聯入庫和頁面緩存,這裡的信息是指購物車和購物項,即我們將購物車的信息存入數據庫的同時,也存入每一個購物項的信息,並且外鍵都聯系關系好,這觸及到了Hibernate中的級聯入庫成績;頁面緩存成績指的是當用戶確認了定單後,假如點撤退退卻,又會回到定單確認頁面,方才的定單確認頁面又出來了,並且session還在,信息照樣方才的信息,這顯著不是我們想要的成果,我們會在前面逐個剖析。這一節重要來評論辯論定單信息的級聯入庫和頁面的緩存成績。
1. 定單信息的級聯入庫
Hibernate中兩張聯系關系表的級聯入庫,須要設置裝備擺設一下,這裡重要引見注解的設置裝備擺設方法,定單的POJO是Forder,購物項的POJO是Sorder,Forder與Sorder是一對多的關系,起首我們設置一下它們的注解設置裝備擺設,以下:
@Entity public class Forder implements java.io.Serializable { //省略有關代碼…… private List<Sorder> sorders = new ArrayList<Sorder>(); @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "forder") public List<Sorder> getSorders() { return this.sorders; } public void setSorders(List<Sorder> sorders) { this.sorders = sorders; } } @Entity public class Sorder implements java.io.Serializable { //省略有關代碼…… private Forder forder; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fid") public Forder getForder() { return this.forder; } public void setForder(Forder forder) { this.forder = forder; } }
如許設置裝備擺設後,當我們save定單項時,也會save購物項,並且主動聯系關系外鍵。然則條件是,我們要將它們之間的關系設置好,即forder中要setSorders(),sorder中要setForder(),和其他相干聯的外鍵對應的實體中的屬性。
之前我們將購物項參加購物車的時刻曾經將履行了forder.setSorder(sorder)了,如今我們須要在sorder中參加forder,所以我們在本來的代碼上添加一下,以下:
//這是17節中的代碼,我們在中央插上一句 @Service("sorderService") public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements SorderService { @Override public Forder addSorder(Forder forder, Product product) { boolean isHave = false; //用來標志有無反復購物項 //拿到以後的購物項 Sorder sorder = productToSorder(product); //斷定以後購物項能否反復,假如反復,則添加數目便可 for(Sorder old : forder.getSorders()) { if(old.getProduct().getId().equals(sorder.getProduct().getId())) { //購物項有反復,添加數目便可 old.setNumber(old.getNumber() + sorder.getNumber()); isHave = true; break; } } //以後購物項在購物車中不存在,新添加便可 if(!isHave) { //我們在這裡拔出一句: //在向購物中添加購物項之前,先樹立購物項與購物車的聯系關系,然則此時forder.id為null, //然則在入庫的時刻是先入庫購物車,再入庫購物項,那時刻就有主鍵了 sorder.setForder(forder); 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; } }
好了,我們看一下定單確認時跳轉到了哪一個Action:
所以我們去完成forderAction中的邏輯:
@Controller("forderAction") @Scope("prototype") public class ForderAction extends BaseAction<Forder> { @Override public Forder getModel() { model = (Forder) session.get("forder"); return model; } //完成購物車(定單)與購物項(定單項)級聯入庫功效 public String save() { // // 把session中的購物項交給以後的model對象 // Forder forder = (Forder) session.get("forder"); // //model.setSorders(forder.getSorders()); // forder.setAddress(model.getAddress()); // forder.setName(model.getName()); // forder.setPhone(model.getPhone()); // forder.setRemark(model.getRemark()); // forder.setUser((User)session.get("user")); // forder.setStatus(new Status(1)); // forder.setPost(model.getPost()); // //級聯入庫(須要在xml或許POJO的注解中設置裝備擺設),須要sorder聯系關系forder // //在SorderServiceImpl類中追加sorder.setForder(forder); // forderService.save(forder); model.setUser((User)session.get("user")); model.setStatus(new Status(1)); forderService.save(model); return "bank"; } }
從下面的代碼中可以看出,有兩種辦法:第一種不覆寫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中最初加上兩行代碼,以下:
@Controller("forderAction") @Scope("prototype") public class ForderAction extends BaseAction<Forder> { @Override public Forder getModel() { model = (Forder) session.get("forder"); return model; } //完成購物車(定單)與購物項(定單項)級聯入庫功效 public String save() { // // 把session中的購物項交給以後的model對象 // Forder forder = (Forder) session.get("forder"); // //model.setSorders(forder.getSorders()); // forder.setAddress(model.getAddress()); // forder.setName(model.getName()); // forder.setPhone(model.getPhone()); // forder.setRemark(model.getRemark()); // forder.setUser((User)session.get("user")); // forder.setStatus(new Status(1)); // forder.setPost(model.getPost()); // //級聯入庫(須要在xml或許POJO的注解中設置裝備擺設),須要sorder聯系關系forder // //在SorderServiceImpl類中追加sorder.setForder(forder); // forderService.save(forder); model.setUser((User)session.get("user")); model.setStatus(new Status(1)); forderService.save(model); //此時購物車曾經入庫,那末本來session中的購物車就應當清空 session.put("oldForder", session.get("forder"));//先將本來的購物車信息保留上去,由於前面付款的時刻還須要相干信息 session.put("forder", new Forder());//new一個新的空購物車(相當於清空了購物車),還可以便利用戶再買~ return "bank"; } }
然後還沒完,我們在前台確認定單頁面也得加高低面的代碼:
如今的邏輯就清晰了,起首到定單確認頁面,forder是稀有據的,所以不為空,這個斷定有效的,當用戶點擊確認定單後,在ForderAction中我們將forder換成了一個空的Forder對象,也就是說本來的數據都沒了(我們保留在session中另外一個鍵值對中,供前面付出用),如許當用戶點撤退退卻又回到方才定單確認頁面時,誰人斷定就失效了,就會跳轉到首頁去,到這裡,全部邏輯就完全了,頁面緩存成績處理好了。
原文地址:http://blog.csdn.net/eson_15/article/details/51433247
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。