根据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 开始可用。
此答案已在问题发布三年后以上述方式更新。以下为原来的回答,当时还不存在<h:commandScript>
。
我不知道'source'参数(上面的代码使用'this')应该设置成什么值。
它应该是要调用的 UICommand
组件的客户端 ID,例如标准 JSF API 提供的 <h:commandLink>
、<h:commandButton>
等。这样,在应用请求值阶段期间,JSF 将能够在组件树中定位所需的组件,然后将所有已注册的操作(监听器)排队执行。
我也不知道最后一个参数中的 execute 应该设置为什么。
它应该是要在表单提交期间处理的组件的以空格分隔的客户端 ID。它与您通常在 <f:ajax execute>
中使用的完全相同。
我也不知道如何定义要调用的 URL。
只是当前页面,由 <h:form>
生成的 <form>
衍生而来。但您不需要在 jsf.ajax.request()
中指定它。基于 UICommand
组件的客户端 ID,jsf.js
已经确定了它。
'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>
。请参见其展示页面和源代码。JSF组件库PrimeFaces也有一个类似的组件,名为<p:remoteCommand>
。请参见其展示页面。 RichFaces有一个<a4j:jsFunction>
,其功能与前两者相同。请参见其展示页面。
<a4j:jsFunction>
而不需要那个丑陋的jsf.ajax.request或jQuery解决方法 :) - BalusC