根据 JSF 2.3,您可以使用<h:commandScript>它。另见规范问题 613。
<h:form>
<h:commandScript name="foo" action="#{bean.action}" render="div-to-render" />
</h:form>
function clickAndRender() {
foo();
}
它从Mojarra 2.3.0-m06开始可用。
该答案在问题发布3年后更新为以上。以下是原始答案,可以追溯到<h:commandScript>不存在的时候。
我不知道'source'参数的值(上面的代码使用'this')应该是什么
它应该是UICommand您想要调用的组件的客户端 ID,例如标准 JSF API 提供的<h:commandLink>、<h:commandButton>等。这样,JSF 将在应用请求值阶段能够在组件树中定位所需的组件,然后将所有注册在其上的操作(侦听器)排队。
我也不知道最后一个参数中的执行应该设置为什么。
它应该是您希望在表单提交期间处理的组件的以空格分隔的客户端 ID。它与您通常在<f:ajax execute>.
我也不知道如何定义要调用的 url
只是当前页面,由组件嵌套所在的<form>生成的派生。但您不需要在. 将已经根据组件的客户端 ID 确定它。<h:form>UICommandjsf.ajax.request()jsf.jsUICommand
和“行动”方法。
只需按照通常的方式指定目标组件的actionoractionListener属性即可。UICommand
总而言之,您的具体问题很可能是UICommand视图中没有任何组件,因此您不能使用jsf.ajax.request(). 一种方法是创建一个带有命令组件的表单,该组件被 CSS 隐藏display:none:
<h:form id="foo" style="display:none">
<h:commandLink id="bar" action="#{bean.method}" />
</h:form>
然后你可以foo:bar用作source参数。
jsf.ajax.request('foo:bar', null, {'javax.faces.behavior.event': 'action', 'execute': '@form', 'render': 'div-to-render'});
以上内容与命令组件中的效果相同<f:ajax execute="@form" render="div-to-render">。您也可以选择这条路径,然后使用document.getElementById("foo:bar").click()而不是jsf.ajax.request().
或者,您也可以创建一个自定义UICommand组件,让 JavaScript 用户更轻松。JSF 实用程序库OmniFaces有这样一个组件,即<o:commandScript>. 另请参阅其展示页面和源代码。JSF 组件库PrimeFaces也有一个类似的<p:remoteCommand>. 另请参阅其展示页面。RichFaces具有<a4j:jsFunction>相同的功能。另请参阅其展示页面。