В 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.Лучшее, что вы можете получить, это установить желаемый скрипт в качестве свойства компонента и условно отобразить компонент <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.См. Также Обновление / рендеринг Ajax не работает с компонентом, который имеет атрибут рендеринга .
<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», любопытно, что * Класс 1022 * (ответственный за написание ajax-ответов JSF) уже существует с JSF 2.0 startEval()
и endEval()
методов, которые должны позволять вам напрямую писать сценарии обратного вызовак ответу, но до предстоящей JSF 2.3, на удивление, в PartialViewContext
не было публичного метода, который делегировал бы этим методам.В соответствии с выпуском 1412 PartialViewContext#getEvalScripts()
наконец-то добавлено в публичный API.
public void submit() {
// ...
FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}
Для более старых версий JSF это можно реализовать только путем создания пользовательской реализации PartialViewContext
.Служебная библиотека JSF OmniFaces сделала именно это с OmniPartialViewContext
, который можно использовать с помощью Ajax
служебного класса .
public void submit() {
// ...
Ajax.oncomplete("alert('peek-a-boo');");
}
См. Также: