【问题标题】:JSF Expression Language Operations and sum values fieldsJSF 表达式语言操作和总和值字段
【发布时间】:2013-06-11 18:35:49
【问题描述】:

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

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

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

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

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>

【问题讨论】:

    标签: java jsf sum el


    【解决方案1】:
    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>
    

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 2011-06-24
      • 2015-02-03
      • 2011-07-14
      • 1970-01-01
      • 2012-07-05
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多