ADF中实现点击Add Employee按钮弹出表单并无刷新更新数据
ADF实现添加员工后无刷新更新部门统计数据的方案
针对你描述的需求,以下是具体的实现步骤,全程无需整页刷新:
1. 构建员工录入弹窗
- 在
DepartmentDetailsView页面中添加af:dialog组件,将其visible属性绑定到托管Bean的布尔属性(如#{deptBean.isAddEmpDialogVisible}),初始值设为false。 - 在弹窗内嵌套
af:form,添加员工所需的录入字段(姓名、薪资等),字段直接绑定到员工实体的对应属性(如#{bindings.EmpName.inputValue})。 - 给页面上的Add Employee按钮设置
actionListener,触发托管Bean中显示弹窗的方法(如#{deptBean.showAddEmpDialog}),该方法仅需将isAddEmpDialogVisible设为true。
2. 实现无刷新保存与统计数据更新
- 弹窗的Save按钮使用
af:commandButton,action绑定到数据控制层的Commit操作(#{bindings.Commit.execute}),同时添加actionListener处理后续逻辑。 - 在托管Bean的保存监听方法中,完成三个核心操作:
- 刷新部门视图对象:获取
DepartmentsView实例,调用executeQuery()重新执行聚合查询,确保后台统计数据(员工总数、总薪资)已更新。 - 局部刷新统计组件:通过
AdfFacesContext.getCurrentInstance().addPartialTarget(),指定页面上展示员工总数和总薪资的af:outputText组件ID,实现局部刷新。 - 隐藏弹窗:将
isAddEmpDialogVisible设为false。
- 刷新部门视图对象:获取
- 确保
DepartmentsView的员工总数、总薪资字段是基于员工表的聚合计算(如COUNT(EmpId)、SUM(Salary)),视图对象配置正确。
3. 关键代码示例
托管Bean核心逻辑
import oracle.adf.view.rich.context.AdfFacesContext; import oracle.jbo.ViewObject; import oracle.adf.view.rich.component.rich.RichDialog; public class DepartmentBean { private boolean isAddEmpDialogVisible; private RichDialog addEmpDialog; public void showAddEmpDialog() { this.isAddEmpDialogVisible = true; } public void onSaveEmployee() { // 刷新部门视图,获取最新统计数据 ViewObject deptVO = ADFUtil.getAM().findViewObject("DepartmentsView"); deptVO.executeQuery(); // 局部刷新统计组件(需替换为你页面上的组件ID) AdfFacesContext.getCurrentInstance().addPartialTarget(ADFUtil.findComponent("empCountOutput")); AdfFacesContext.getCurrentInstance().addPartialTarget(ADFUtil.findComponent("totalSalaryOutput")); // 关闭弹窗 this.isAddEmpDialogVisible = false; } // Getter & Setter public boolean isAddEmpDialogVisible() { return isAddEmpDialogVisible; } public void setAddEmpDialogVisible(boolean isAddEmpDialogVisible) { this.isAddEmpDialogVisible = isAddEmpDialogVisible; } public RichDialog getAddEmpDialog() { return addEmpDialog; } public void setAddEmpDialog(RichDialog addEmpDialog) { this.addEmpDialog = addEmpDialog; } }
页面弹窗XML代码
<af:dialog id="addEmpDialog" visible="#{departmentBean.addEmpDialogVisible}" title="Add New Employee"> <af:form id="addEmpForm"> <af:inputText label="Employee Name" value="#{bindings.EmpName.inputValue}" required="true" id="empName"/> <af:inputNumberSpinbox label="Salary" value="#{bindings.Salary.inputValue}" required="true" id="empSalary"/> <!-- 根据需求添加其他员工字段 --> <af:commandButton text="Save" action="#{bindings.Commit.execute}" actionListener="#{departmentBean.onSaveEmployee}" id="saveBtn"/> <af:commandButton text="Cancel" actionListener="#{departmentBean.hideAddEmpDialog}" immediate="true" id="cancelBtn"/> </af:form> </af:dialog>
注:ADFUtil是自定义工具类,用于简化获取ApplicationModule和页面组件的操作,你可以根据自己的项目实现替换。
4. 注意事项
- 确保
Commit操作能正确提交员工数据到数据库,若有业务规则需在实体层或ApplicationModule层添加校验。 - 局部刷新的组件必须设置唯一的
id,否则无法精准触发刷新。 - 若使用Task Flow导航,确保部门数据通过共享数据控制传递,避免页面跳转导致的刷新。
内容的提问来源于stack exchange,提问作者Muhammad bakr
相关产品推荐
相关产品推荐

