2011-10-22 52 views
0

我在我的應用程序中使用JSF2.0。 我的項目中的業務需求是當頁面加載列表顯示時。該列表來自DAO層或Web服務層。讓我們打電話給這個原始列表。 現在我們有2個列表,其中只是原始列表的另一個副本,另一個是有限的JSFJSF不保留原始列表並混合修改後的原始列表或如何在JSF 2.0中執行ArrayList的深層拷貝ModelBean

現在列表是可編輯列表,所以我使用a來顯示列表和每個單元格是一個。 現在點擊保存按鈕,用戶修改的列表(因爲列表可編輯)與原始列表進行比較。 只有當2個列表不同時,修改後的列表纔會被髮送回web服務。 我面臨的問題是,在save()方法本身的第一行中,原始列表和修改列表完全相同,僅指向修改列表。 所以我無法比較2個列表。

我的實現是如下─

的PhaseListener呼籲以下方法在頁面加載

public String populateDataTable() { 

     this.orderList = new ArrayList<ItemOrder>(); 
     this.originalOrderList = new ArrayList<ItemOrder>(); 
     MockWebService mockService = new MockWebService(); 
     this.setOrderList(mockService.mockWSMethod()); 
     this.originalOrderList = this.getOrderList();//i know this is where i am doing something wrong. i need to deep copy a list. but for this i cannot make an additional web service call and call that web service again and store the list in originalOrderList 
     return "view"; 
    } 

在保存按鈕

public String saveAction() { 
     boolean isSame = true; // true if same and false if different 
     for (int i = 0; i < this.originalOrderList.size(); i++) { 
      if (!this.originalOrderList.get(i).equals(this.orderList.get(i))) { 
       isSame = false; 
      } 
     } 
//however both originalOrderList and orderList have the same modified List. 
     if (isSame == true) { 
      System.out.println("Same lists"); 
     } else { 
      System.out.println("Different lists"); 
     } 
     return "default"; 
    } 

請你幫我的點擊。

由於提前, 基蘭

回答

0

至於你提到你所面臨的問題是originalOrderListorderList淺拷貝(假定getOrderList()被返回一個orderList參考)。在你的情況下,orderList和originalOrderList都是指向相同ArrayList對象的引用,並且如果對orderList的值進行了更改,則originalOrderList反映了該更改,因爲它共享相同的引用。

解決的辦法是做你originalOrderList的深層副本:

this.originalOrderList = this.getOrderList().clone(); 

如果您ItemOrder是不可變對象,否則:

public static List<ItemOrder> cloneList(List<ItemOrder> list) { 
    List<ItemOrder> clone = new ArrayList<ItemOrder>(list.size()); 
    for(ItemOrderitem: list) clone.add(item.clone()); 
    return clone; 
} 

,你必須讓你的ItemOrder對象實現Cloneable接口,並實現clone()方法。

相關問題