有没有办法从JSF中的托管bean调用(执行)JavaScript函数?
如果这是相关的,我也使用PrimeFaces。
在PrimeFaces 6.2之前,您可以使用RequestContext#execute()
。
public void submit() {
// ...
RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}
在PrimeFaces 6.2及以上版本中:
public void submit() {
// ...
PrimeFaces.current().executeScript("alert('peek-a-boo');");
}
在标准JSF中,没有直接的公共API。最好的方法是将所需的脚本设置为bean属性,并在bean属性不为空时有条件地呈现<h:outputScript>
组件。
<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
// ...
script = "alert('peek-a-boo');";
}
如果您是通过ajax提交表单,请不要忘记将<h:outputScript>
包装在另一个组件中并更改ajax-update。另见Ajax update/render does not work on a component which has rendered attribute。
<h:commandButton ... action="#{bean.submit}">
<f:ajax execute="@form" render="script" />
</h:commandButton>
<h:panelGroup id="script">
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
</h:panelGroup>
至于“没有直接的公共API”声明,奇怪的是PartialResponseWriter
类(负责编写JSF ajax响应)已经有JSF 2.0 startEval()
和endEval()
方法,它们应该使你能够直接写回调脚本到响应,但直到即将到来JSF 2.3令人惊讶地没有在PartialViewContext
中公开的方法,它将委托给那些方法。根据issue 1412 PartialViewContext#getEvalScripts()
最终被添加到公共API。
public void submit() {
// ...
FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}
对于较旧的JSF版本,只能通过创建自定义PartialViewContext
实现来实现。 JSF实用程序库OmniFaces与OmniPartialViewContext
完全一样,可以通过Ajax
utility class使用。
public void submit() {
// ...
Ajax.oncomplete("alert('peek-a-boo');");
}
根据您所使用的Primefaces版本,您可以使用RequestContext.execute("{js here}");
从Primefaces 3.4文档:
RequestContext提供了一种在ajax请求完成时执行javascript的方法,与传递回调参数和执行条件javascript相比,这种方法更容易。下面的示例在ajax请求完成时隐藏对话框;
码
public void save() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute("dialog.hide()");
}
你不能简单。
Managed Bean
适用于浏览器上的服务器和JavaScript。
您可以根据managedbean中设置的值有条件地调用JavaScript
通常,Java提供了一个API来使用脚本引擎来评估字符串。这可以通过javax.script.ScriptEngine和javax.script.ScriptEngineManager类来完成。
我不完全确定你的情况是什么,但是如果你可以将javascript作为字符串传递给托管bean,你可以使用Java脚本API在服务器端运行javascript。
有关更多信息,请查看此链接:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html