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
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。