Existe-t-il un moyen d'appeler (exécuter) une fonction JavaScript à partir d'un bean géré dans JSF?
Si cela est pertinent, j'utilise également PrimeFaces.
Dans PrimeFaces pre 6.2, vous pouvez utiliser RequestContext#execute()
pour cela.
public void submit() {
// ...
RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}
Dans PrimeFaces 6.2 et versions ultérieures:
public void submit() {
// ...
PrimeFaces.current().executeScript("alert('peek-a-boo');");
}
Dans JSF standard, il n'y a pas d'API publique directe pour cela. Le mieux que vous puissiez obtenir est de définir le script souhaité en tant que propriété de bean et de rendre conditionnellement un composant <h:outputScript>
Lorsque la propriété de bean n'est pas vide.
<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
// ...
script = "alert('peek-a-boo');";
}
Dans le cas où vous soumettez le formulaire par ajax, n'oubliez pas d'envelopper le <h:outputScript>
Dans un autre composant et ajax-le mettre à jour à la place. Voir aussi la mise à jour/rendu Ajax ne fonctionne pas sur un composant ayant un attribut rend .
<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>
Quant à la déclaration "il n'y a pas d'API publique directe pour cela", curieusement la classe PartialResponseWriter
(responsable de l'écriture des réponses ajax JSF) a déjà depuis JSF 2.0 startEval()
et endEval()
méthodes qui devraient vous permettre d'écrire des scripts de rappel directement dans la réponse mais jusqu'à JSF 2.3 à venir, il n'y avait étonnamment aucune méthode publique dans PartialViewContext
qui déléguera à ces méthodes. Selon problème 1412PartialViewContext#getEvalScripts()
a finalement été ajouté à l'API publique.
public void submit() {
// ...
FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}
Pour les anciennes versions de JSF, cela ne peut être implémenté qu'en créant une implémentation PartialViewContext
personnalisée. La bibliothèque d'utilitaires JSF OmniFaces a fait exactement cela avec OmniPartialViewContext
qui peut être utilisée via Ajax
classe utilitaire .
public void submit() {
// ...
Ajax.oncomplete("alert('peek-a-boo');");
}
Selon la version de Primefaces sur laquelle vous vous trouvez, vous pouvez utiliser RequestContext.execute("{js here}");
De la documentation Primefaces 3.4:
RequestContext fournit un moyen d'exécuter du javascript une fois la requête ajax terminée, cette approche est plus facile que de passer des paramètres de rappel et d'exécuter du javascript conditionnel. L'exemple ci-dessous masque la boîte de dialogue lorsque la requête ajax est terminée;
Code
public void save() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute("dialog.hide()");
}
La chose la plus proche dans Primefaces est;
http://www.primefaces.org/showcase/ui/callbackParams.jsf
Cela dit, il existe également une amélioration dans 3.0;
Vous ne pouvez pas simplement.
Managed Bean
fonctionne sur le serveur et JavaScript sur le navigateur.
Vous pouvez faire invoquer conditionnellement JavaScript en fonction de la valeur définie dans managedbean
En général, Java fournit une API pour évaluer une chaîne à l'aide d'un moteur de script. Cela peut être accompli par les classes javax.script.ScriptEngine et javax.script.ScriptEngineManager.
Je ne suis pas entièrement sûr de votre situation, mais si vous pouvez transmettre le javascript en tant que chaîne au bean géré, vous pouvez probablement utiliser Java API de script pour exécuter le javascript côté serveur.
Pour plus d'informations, consultez ce lien: http://docs.Oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html