在commandButton中执行两个AJAX调用onclick bootsfaces jsf

时间:2018-04-04 19:03:37

标签: ajax jsf bootsfaces

我有一个带有表单的模态,我想要的是首先关闭bean中的模态(方法“cerrarModal”),然后执行AJAX,在数据库中插入(方法“crearUsuario”)。我看到this question,但它对我不起作用。
这是我的按钮:

<b:commandButton value="Guardar" ajax="true" 
                 update="formTblUsuarios:growlMsg formTblUsuarios:tblUsuarios rowModal" 
                 id="btnGuardarUsuario" look="primary" 
                 onclick="ajax:admUsuariosBean.cerrarModal();admUsuariosBean.crearUsuario()" />

这些是我的豆子方法:

public void cerrarModal() {
    RequestContext.getCurrentInstance().execute("$('#usuarioModal').modal('hide');");
}

public void crearUsuario() {
    try {
        if (this.fachada.crearUsuario(getUsr())) {
            this.reestablecerClave();FacesMessages.info("User created.");
        } else {
            FacesMessages.warning("The user was not created.");
        }
    } catch (Exception e) {
        FacesMessages.error("The user was not created.");
}

但服务器抛出此错误:

abr 04,20188 11:02:14 AM com.sun.faces.lifecycle.InvokeApplicationPhase执行 ADVERTENCIA:无法解析表达式[#{admUsuariosBean.cerrarModal(); admUsuariosBean.crearUsuario()}] javax.el.E​​LException:无法解析表达式[#{admUsuariosBean.cerrarModal(); admUsuariosBean.crearUsuario()}]     在org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:145)     在org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:171)     at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:216)     at org.apache.el.E​​xpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:66)     at net.bootsfaces.component.ajax.AJAXBroadcastComponent.evalAsValueExpression(AJAXBroadcastComponent.java:74)     at net.bootsfaces.component.ajax.AJAXBroadcastComponent.executeAjaxCalls(AJAXBroadcastComponent.java:123)     at net.bootsfaces.component.ajax.AJAXBroadcastComponent.broadcast(AJAXBroadcastComponent.java:52)     在javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)     在javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)     at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)     在com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)     在com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)     在javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)     在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)     在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)     在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)     在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)     在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)     在com.abcpagos.otis.beans.Filtro.doFilter(Filtro.java:44)     在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)     在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)     在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)     在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)     在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)     在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)     在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)     在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)     在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)     在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)     at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:611)     at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:316)     在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)     at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)     at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)     在java.lang.Thread.run(Thread.java:748) 引起:org.apache.el.parser.ParseException:遇到“”; “”第1栏第32栏。 期待以下之一:     “}”......     “” ...     “[”......     “&gt;” 中...     “gt”......     “=”......     “ge”......     “


我正在使用BootsFaces 1.2.0,PrimeFaces 6.1,JSF 2.2,(XAMPP)Apache Tomcat 7.0.56。
谢谢。

2 个答案:

答案 0 :(得分:1)

你不需要豆子来关闭模态形式。

gcc: error: murmurhash/mrmr.cpp: No such file or directory
error: command 'gcc' failed with exit status 1

答案 1 :(得分:1)

首先,@ Holger的答案(大部分)是正确的:您的特定用例并不需要AJAX调用。但是,有些用例需要连续两次AJAX调用,所以我仍会问你原来的问题。

我以非常简单的方式实现了BootsFaces的解析器。 onclick处理程序可以由三部分组成:在AJAX调用之前执行的JavaScript部分,AJAX调用,以及在将AJAX请求发送到服务器之后执行的第二个JavaScript部分。请注意,第二个JavaScript位几乎肯定在Java代码之前执行。

理论上,我可以在实现AJAX引擎的同时考虑多个AJAX调用。但是,我没有看到这样做的重点:调用Java方法调用两个方法而不是触发两个AJAX调用更容易,每个调用Java方法并且每个调用DOM都更新。

但是......永远不要说永远。如果您确实需要连续两次AJAX调用,则可以使用<b:remoteCommand>实现此操作。这样的<b:remoteCommand>是一个JavaScript函数,它通过AJAX调用Java方法并更新DOM。因此,您可以调用<b:remoteCommand>处理程序中的onComplete来触发第二个AJAX请求。

有那个。但是,你只想关闭模态,所以我建议像这样实现它:

<b:commandButton value="Guardar"
         update="..." 
         onclick="$('#usuarioModal').modal('hide');ajax:admUsuariosBean.crearUsuario()" />