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