在 commandButton onclick bootsfaces jsf 中执行两个 AJAX 调用
Execute two AJAX calls in commandButton onclick bootsfaces jsf
我有一个带有表单的模态,我想要的是首先从 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()" />
这些是我的 bean 方法:
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.");
}
但是服务器抛出这个错误:
2018 年 4 月 11:02:14 上午 com.sun.faces.lifecycle.InvokeApplicationPhase 执行
ADVERTENCIA:无法解析表达式 [#{admUsuariosBean.cerrarModal();admUsuariosBean.crearUsuario()}]
javax.el.ELException: 无法解析表达式 [#{admUsuariosBean.cerrarModal();admUsuariosBean.crearUsuario()}]
在 org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:145)
在 org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:171)
在 org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:216)
在 org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:66)
在 net.bootsfaces.component.ajax.AJAXBroadcastComponent.evalAsValueExpression(AJAXBroadcastComponent.java:74)
在 net.bootsfaces.component.ajax.AJAXBroadcastComponent.executeAjaxCalls(AJAXBroadcastComponent.java:123)
在 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)
在 com.sun.faces.lifecycle.InvokeApplicationPhase. 执行(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)
在 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)
在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
在 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" ...
“=” ...
"ge" ...
“
我正在使用 BootsFaces 1.2.0、PrimeFaces 6.1、JSF 2.2、(XAMPP) Apache Tomcat 7.0.56。
谢谢。
您不需要 bean 来关闭模式窗体。
<b:commandButton value="Guardar" ajax="true"
update="formTblUsuarios:growlMsg formTblUsuarios:tblUsuarios rowModal"
id="btnGuardarUsuario" look="primary"
actionListener="#{admUsuariosBean.crearUsuario()}"
oncomplete="$('#usuarioModal').modal('hide')"
/>
首先,@Holger 的回答(大部分)是正确的:您的特定用例不需要 AJAX 调用。但是,有些用例需要连续两次 AJAX 调用,所以我还是会问你原来的问题。
我已经以非常简单的方式实现了 BootsFaces 的解析器。 onclick
处理程序可能由三部分组成:在 AJAX 调用之前执行的 JavaScript 部分、AJAX 调用和第二个 JavaScript 部分在向服务器发送 AJAX 请求后执行。请注意,第二个 Java 脚本位几乎肯定会在 Java 代码之前执行。
理论上,我本可以在考虑多个 AJAX 调用的情况下实现 AJAX 引擎。但是,我没有看到这样做的意义:调用一个 Java 方法调用两个方法比触发两个 AJAX 调用更容易,每个调用一个 Java 方法并每次更新DOM.
但是……永远不要说永远。如果你真的需要两个连续的 AJAX 调用,你可以使用 <b:remoteCommand>
来实现。这样的 <b:remoteCommand>
是一个 Java 脚本函数,通过 AJAX 调用 Java 方法并更新 DOM。所以你可以调用 onComplete
处理程序中的 <b:remoteCommand>
来触发第二个 AJAX 请求。
就是这样。然而,你只是想关闭模态,所以我建议这样实现它:
<b:commandButton value="Guardar"
update="..."
onclick="$('#usuarioModal').modal('hide');ajax:admUsuariosBean.crearUsuario()" />
我有一个带有表单的模态,我想要的是首先从 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()" />
这些是我的 bean 方法:
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.");
}
但是服务器抛出这个错误:
我正在使用 BootsFaces 1.2.0、PrimeFaces 6.1、JSF 2.2、(XAMPP) Apache Tomcat 7.0.56。
谢谢。
您不需要 bean 来关闭模式窗体。
<b:commandButton value="Guardar" ajax="true"
update="formTblUsuarios:growlMsg formTblUsuarios:tblUsuarios rowModal"
id="btnGuardarUsuario" look="primary"
actionListener="#{admUsuariosBean.crearUsuario()}"
oncomplete="$('#usuarioModal').modal('hide')"
/>
首先,@Holger 的回答(大部分)是正确的:您的特定用例不需要 AJAX 调用。但是,有些用例需要连续两次 AJAX 调用,所以我还是会问你原来的问题。
我已经以非常简单的方式实现了 BootsFaces 的解析器。 onclick
处理程序可能由三部分组成:在 AJAX 调用之前执行的 JavaScript 部分、AJAX 调用和第二个 JavaScript 部分在向服务器发送 AJAX 请求后执行。请注意,第二个 Java 脚本位几乎肯定会在 Java 代码之前执行。
理论上,我本可以在考虑多个 AJAX 调用的情况下实现 AJAX 引擎。但是,我没有看到这样做的意义:调用一个 Java 方法调用两个方法比触发两个 AJAX 调用更容易,每个调用一个 Java 方法并每次更新DOM.
但是……永远不要说永远。如果你真的需要两个连续的 AJAX 调用,你可以使用 <b:remoteCommand>
来实现。这样的 <b:remoteCommand>
是一个 Java 脚本函数,通过 AJAX 调用 Java 方法并更新 DOM。所以你可以调用 onComplete
处理程序中的 <b:remoteCommand>
来触发第二个 AJAX 请求。
就是这样。然而,你只是想关闭模态,所以我建议这样实现它:
<b:commandButton value="Guardar"
update="..."
onclick="$('#usuarioModal').modal('hide');ajax:admUsuariosBean.crearUsuario()" />