程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SSH框架網上商城項目第19戰之定單信息級聯入庫和頁面緩存成績

SSH框架網上商城項目第19戰之定單信息級聯入庫和頁面緩存成績

編輯:關於JAVA

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

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved