Ответ 1
В 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 для этого" оператора, то, что любопытно, что класс PartialResponseWriter
(ответственный за написание ajax-ответов JSF) уже существует с startEval()
JSF 2.0 startEval()
и endEval()
которые должны позволять вам писать сценарии обратного вызова непосредственно в ответ, но до PartialViewContext
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');");
}