根据 JSF 2.3,您可以为此使用 <h:commandScript>。另见spec issue 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,例如<h:commandLink>、<h:commandButton> 等由标准 JSF API 提供。这样,JSF 将在应用请求值阶段能够在组件树中找到所需的组件,然后将所有注册在其上的操作(侦听器)排队。
我也不知道最后一个参数中的执行应该设置成什么。
它应该是您希望在表单提交期间处理的组件的以空格分隔的客户端 ID。它与您通常在<f:ajax execute> 中使用的完全相同。
我也不知道怎么定义要调用的url
只是当前页面,从<h:form> 生成的<form> 派生,UICommand 组件嵌套在其中。但您不需要在jsf.ajax.request() 中指定它。 jsf.js 已经根据 UICommand 组件的客户端 ID 确定它。
还有“action”方法。
只需按常规方式指定目标UICommand 组件的action 或actionListener 属性即可。
总而言之,您的具体问题可能是您的视图中没有任何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>。另见其showcase page 和source code。 JSF 组件库PrimeFaces 也有一个类似的组件<p:remoteCommand>。另请参阅其showcase page。 RichFaces 有一个 <a4j:jsFunction>,它的作用相同。另见其showcase page。