BootsFaces JSF中实现commandButton onclick先后执行两个AJAX调用
解决BootFaces模态框关闭与AJAX插入的顺序问题
你当前的写法存在一个核心问题:在同一个ajax:块里调用两个服务器端方法时,它们会在同一个AJAX请求中按顺序执行,但页面的更新是所有方法完成后一次性触发的——这意味着你看不到“先关闭模态框再执行插入”的视觉效果;更糟的是,如果cerrarModal里重置了表单数据,还会导致crearUsuario拿不到要插入的用户信息。
下面根据两种常见需求场景,给出可行的解决方案:
场景1:需要视觉上先关闭模态框,再执行插入
这种情况下我们需要拆分两个独立的AJAX请求,确保模态框先在页面上消失,再触发数据库操作:
- 修改原按钮,仅负责关闭模态框,并在请求完成后触发插入逻辑:
<b:commandButton value="Guardar" ajax="true" update="rowModal formTblUsuarios:growlMsg" id="btnGuardarUsuario" look="primary" action="#{admUsuariosBean.cerrarModal()}" oncomplete="triggerCreateUser()" />
- 添加一个隐藏的按钮,专门处理数据库插入操作:
<h:form id="hiddenCreateForm"> <b:commandButton id="hiddenCreateBtn" ajax="true" update="formTblUsuarios:growlMsg formTblUsuarios:tblUsuarios" action="#{admUsuariosBean.crearUsuario()}" style="display: none;" /> </h:form>
- 添加JavaScript函数触发隐藏按钮的点击事件:
function triggerCreateUser() { document.getElementById('hiddenCreateForm:hiddenCreateBtn').click(); }
场景2:先执行插入,成功后再关闭模态框(更符合常规业务逻辑)
通常我们会优先确保数据库操作成功,再关闭模态框(如果插入失败,模态框保留以便用户修正数据),这种实现更简洁:
- 修改Bean中的
crearUsuario方法,在插入成功后调用cerrarModal:
public void crearUsuario() { try { // 执行数据库插入逻辑 yourUserService.save(this.usuario); // 插入成功后关闭模态框 this.cerrarModal(); // 添加成功提示消息 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "成功", "用户已创建")); } catch (Exception e) { // 添加错误提示消息 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "错误", "创建失败:" + e.getMessage())); } }
- 简化按钮代码,仅调用
crearUsuario即可:
<b:commandButton value="Guardar" ajax="true" update="formTblUsuarios:growlMsg formTblUsuarios:tblUsuarios rowModal" id="btnGuardarUsuario" look="primary" action="#{admUsuariosBean.crearUsuario()}" />
补充:确保cerrarModal方法正常工作
你的cerrarModal方法需要正确设置模态框的可见性,按需重置表单数据:
public void cerrarModal() { // 假设模态框绑定的可见性变量是modalVisible this.modalVisible = false; // 可选:重置表单绑定的用户对象,避免下次打开模态框时显示旧数据 this.usuario = new Usuario(); }
内容的提问来源于stack exchange,提问作者Julian David
相关产品推荐
相关产品推荐

