Comment rendre JavaScript comme réponse partielle?

En réponse à une requête Ajax, je souhaite retourner JavaScript qui est exécuté sur le client immédiatement. Je l'ai essayé comme ça, mais cela ne fonctionne pas:

<html xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <h:head></h:head> <h:body> <h:form> <h:commandButton value="js"> <f:ajax event="click" listener="#{myBean.js}"/> </h:commandButton> </h:form> </h:body> </html> 

le haricot:

 package mypackage; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.context.PartialResponseWriter; import javax.inject.Named; @Named public class MyBean { public void js() { System.out.println("called"); FacesContext ctx = FacesContext.getCurrentInstance(); ExternalContext extContext = ctx.getExternalContext(); if (ctx.getPartialViewContext().isAjaxRequest()) { try { extContext.setResponseContentType("text/xml"); extContext.addResponseHeader("Cache - Control ", "no - cache"); PartialResponseWriter writer = ctx.getPartialViewContext() .getPartialResponseWriter(); writer.startDocument(); writer.startEval(); writer.write("alert('Works!');"); writer.endEval(); writer.endDocument(); writer.flush(); ctx.responseComplete(); } catch (Exception e) { System.out.println(e); } } } } 

 writer.write("alert('Works!');"); 

Les citations curly ne sont pas un délimiteur de chaîne valide dans JS. Utilisez des citations directes.

 writer.write("alert('Works!');"); 

Indépendamment du problème concret, en fonction de votre histoire de questions, vous utilisez PrimeFaces, ou du moins vous en connaissez. Dans ce cas, utilisez simplement RequestContext#execute() au lieu de ce désordre.