2013-06-11 33 views
2

我需要計算在jsf數據表中收到的金額並以這些字段的總和顯示。JSF表達式語言操作和總和值字段

A)我需要總和所有計算在EL值表達式中的值,並顯示在total1字段中。 B)我需要將在EL表達式2中計算出的所有項目總和並顯示在total2字段中。

C)我需要total1 + total2和總計字段中顯示。

Obs .:我收到來自DatabaseBean的值。

<p:dataTable id="table" value="#{valueBean.values}" var="item"> 
<p:column > 
<h:outputText id="value1" value="#{(item[0]*160)/100}" /> 
<f:facet name="footer"> 
    <h:outputText id="total1" value="#...????" /> 
</f:facet> 
</p:column > 
<p:column > 
<h:outputText id="value2" value="#{(item[1]*160)/100}" /> 
<f:facet name="footer"> 
    <h:outputText id="total2" value="#...????" /> 
</f:facet> 
</p:column > 
<h:outputText id="total" value="#...????" /> 
... 
</p:dataTable> 

回答

1
  1. 旅遊首先指出。做價值=「#{(item [0] * 160)/ 100}」這樣的事情是不好的編程習慣。由於各種原因,但顯然對於可維護性,未來的開發人員會發現它必須理解爲什麼160或100更不用說如果他們改變如何安全地更改這些值
  2. 取決於值中的項是否是有效的「數值」值有一個可以很容易地處理服務器端,而不是UI層

最安全的策略是採用豆使用計算和保存你需要顯示的UI

- 你的所有值上的錯誤聽起來像一個綠色的程序員,所以我會給你一個腿。但是,如果您仔細思考,下面的代碼仍然可以使用一些改進。

-I已經將Item bean定義爲下面的內部類,但是如果您對此感到滿意,您總是可以將它分解爲自己的類。

- 此策略允許您在需要的地方添加支票,並在需要的地方添加錯誤處理,但我沒有收入。

- 我還假定初始數據來自DatabaseBean的列表,該列表在數組中保存了一些2個值。

import java.util.ArrayList; 
import java.util.List; 

public class BagOfItems { 

    private static int COMMON_MULTIPLIER = 160;//here document where this comes from 
    private static int COMMON_DIVISOR = 100; //here document where this comes from 

    private class Item{ 
     private int value1; 
     private int value2; 
     private int calculatedValue1; 
     private int calculatedValue2; 

     public Item(int[] values){ 
      value1 = values[0]; 
      value2 = values[1]; 
      calculateValues(); 
     } 

     public int getValue1() { 
      return value1; 
     } 
     public void setValue1(int value1) { 
      this.value1 = value1; 
     } 
     public int getValue2() { 
      return value2; 
     } 
     public void setValue2(int value2) { 
      this.value2 = value2; 
     } 

     public int getCalculatedValue1() { 
      return calculatedValue1; 
     } 

     public void setCalculatedValue1(int calculatedValue1) { 
      this.calculatedValue1 = calculatedValue1; 
     } 

     public int getCalculatedValue2() { 
      return calculatedValue2; 
     } 

     public void setCalculatedValue2(int calculatedValue2) { 
      this.calculatedValue2 = calculatedValue2; 
     } 

     public void calculateValues(){ 
      calculatedValue1 = (value1 * COMMON_MULTIPLIER)/COMMON_DIVISOR; 
      calculatedValue2 = (value2 * COMMON_MULTIPLIER)/COMMON_DIVISOR; 
     } 
    } 


    private int totalValues1 = 0; 
    private int totalValues2 = 0; 

    private List<Item> items = new ArrayList<Item>(); 

    public BagOfItems(List<DatabaseBean> databaseBeans){ 
     initItems(databaseBeans); 
    } 

    private void initItems(List<DatabaseBean> databaseBeans){ 
     for(DatabaseBean databaseBean : databaseBeans){ 
      Item item = new Item(databaseBean.values); 
      items.add(item); 
     } 
    } 

    protected void sum(){ 
     for(Item item : items){ 
      totalValues1 += item.getCalculatedValue1(); 
      totalValues2 += item.getCalculatedValue2(); 
     } 
    } 

    public int getTotalValues1() { 
     return totalValues1; 
    } 

    public void setTotalValues1(int totalValues1) { 
     this.totalValues1 = totalValues1; 
    } 

    public int getTotalValues2() { 
     return totalValues2; 
    } 

    public void setTotalValues2(int totalValues2) { 
     this.totalValues2 = totalValues2; 
    } 

    public List<Item> getItems() { 
     return items; 
    } 

    public void setItems(List<Item> items) { 
     this.items = items; 
    } 

    public int getTotal(){ 
     return (totalValues1 + totalValues2); 
    } 

} 

的UI然後會是這個樣子

<p:dataTable id="table" value="#{bagOfItems.items}" var="item"> 
<p:column > 
<h:outputText id="value1" value="#{item.calculatedValue1}" /> 
<f:facet name="footer"> 
    <h:outputText id="total1" value="#{bagOfItems.totalValues1}" /> 
</f:facet> 
</p:column > 
<p:column > 
<h:outputText id="value2" value="#{item.calculatedValue2}" /> 
<f:facet name="footer"> 
    <h:outputText id="total2" value="#{bagOfItems.totalValues2}" /> 
</f:facet> 
</p:column > 
<h:outputText id="total" value="#{bagOfItems.total}" /> 
... 
</p:dataTable>