Primefaces数据表实现列合计显示并随过滤器动态更新的方法咨询
PrimeFaces过滤表格动态更新汇总行实现方案
方案1:使用内置p:summaryRow组件(非懒加载场景首选)
- 首先给
p:dataTable组件绑定filteredValue属性,对应后端Bean中存储过滤后数据的列表变量,PrimeFaces会在每次过滤触发后自动更新该变量的内容 - 启用表格过滤功能,给需要过滤的列添加
filterBy属性配置过滤规则 - 使用PrimeFaces原生的
<p:summaryRow>标签定义汇总行,汇总值直接基于filteredValue对应的列表计算即可 - 给表格添加
filter事件的AJAX监听,过滤触发后自动刷新表格区域实现汇总值同步更新
示例前端代码:
<h:form id="dataForm"> <p:dataTable id="bizTable" var="item" value="#{bizBean.allDataList}" filteredValue="#{bizBean.filteredDataList}" widgetVar="bizTableVar"> <!-- 带过滤功能的普通列 --> <p:column headerText="订单金额" filterBy="#{item.orderAmount}" filterMatchMode="gte"> #{item.orderAmount} </p:column> <p:column headerText="订单数量" filterBy="#{item.orderCount}" filterMatchMode="eq"> #{item.orderCount} </p:column> <!-- 汇总行定义 --> <p:summaryRow> <p:column colspan="1" style="text-align:right;font-weight:bold">合计:</p:column> <p:column style="font-weight:bold"> #{bizBean.calcTotalAmount(bizBean.filteredDataList)} </p:column> <p:column style="font-weight:bold"> #{bizBean.calcTotalCount(bizBean.filteredDataList)} </p:column> </p:summaryRow> <!-- 过滤事件触发表格刷新 --> <p:ajax event="filter" update=":dataForm:bizTable" /> </p:dataTable> </h:form>
示例后端Bean代码:
@Named @ViewScoped public class BizBean implements Serializable { private List<BizData> allDataList; private List<BizData> filteredDataList; // 初始化全量数据的逻辑省略 public BigDecimal calcTotalAmount(List<BizData> dataList) { if (CollectionUtils.isEmpty(dataList)) return BigDecimal.ZERO; return dataList.stream().map(BizData::getOrderAmount).reduce(BigDecimal.ZERO, BigDecimal::add); } public Integer calcTotalCount(List<BizData> dataList) { if (CollectionUtils.isEmpty(dataList)) return 0; return dataList.stream().mapToInt(BizData::getOrderCount).sum(); } // getter、setter省略 }
方案2:前端JS计算(小数据量无后端交互场景)
- 如果表格使用前端模式过滤(全量数据已加载到前端、懒加载关闭),可以直接通过JS获取表格当前可见行的数值,计算后填充到自定义的汇总行
- 给表格绑定客户端过滤回调事件,每次过滤完成后自动执行计算逻辑,无需发起后端请求,响应速度更快
方案3:懒加载模式适配方案
- 如果表格使用懒加载(
lazy="true"),需要在自定义LazyDataModel的load方法中,同步查询当前过滤条件对应的汇总值,存入Bean的变量中 - 汇总行直接读取预计算的汇总变量即可,每次过滤、分页、排序触发
load方法时同步更新汇总值
注意:如果需要统计所有过滤后的数据而非当前分页的数据,需要单独编写聚合查询逻辑,不可直接用当前分页的列表计算
内容的提问来源于stack exchange,提问作者Buddhika Ariyaratne
相关产品推荐
相关产品推荐

