3

我需要计算 jsf 数据表中收到的金额,并在这些字段的总和列中显示。

A) 我需要对 value1 的 EL 表达式中计算的所有项目求和并显示在 total1 字段中。

B)我需要对 value2 的 EL 表达式中计算的所有项目求和并显示在 total2 字段中。

C) 我需要 sum total1 + total2 并在字段 Total 中显示。

观察:我从 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>
4

1 回答 1

2
  1. 首先要指出的事情。做诸如 value="#{(item[0]*160)/100}" 之类的事情是不好的编程习惯。出于各种原因,但显然是为了可维护性,未来的开发人员会发现必须理解为什么 160 或 100 更不用说在这些值发生更改时如何安全地更改这些值
  2. 根据值中的项目是否是有效的“数字”值,您可能会遇到可以在服务器端而不是在 UI 层轻松处理​​的错误

最安全的策略是使用 bean 来计算和保存您需要在 UI 上显示的所有值

- 你听起来像个绿色程序员,所以我会支持你。但是如果仔细考虑,下面的代码仍然可以使用一些改进。

- 我已将 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>
于 2013-06-11T18:46:38.763 回答