JSF + JSON: produit le texte "simple" dans servlet?

J'essaie d'utiliser Mootools ( Request.JSON ) avec JSF – principalement parce que j'ai écrit une application similaire dans CakePHP il y a quelque temps et j'aimerais réutiliser la plupart des JS.

Existe-t-il un moyen de renvoyer du texte brut ("application / json") en utilisant une demande de quelque chose comme un marqueur sans marquage?

La seule solution à laquelle je suis venu était d'utiliser un HttpServlet et de l'enregistrer sur une URL de service dans web.xml. Cette approche fonctionne et renvoie vraiment un fichier sans marquage, mais je préférerais utiliser mes ManagedProperties injectées par Spring, mais limitées à WebApplicationContextUtils.

Ai-je manqué quelque chose ou est-ce la manière recommandée?

Il y a un moyen. Mais c'est moche et essentiellement un abus de JSF / Facelets comme dans l'utilisation du mauvais outil pour le travail.

Par exemple

<ui:composition xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets"> <f:event type="preRenderView" listener="#{bean.renderJson}" /> </ui:composition> 

avec

 public void renderJson() throws IOException { FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); externalContext.setResponseContentType("application/json"); externalContext.setResponseCharacterEncoding("UTF-8"); externalContext.getResponseOutputWriter().write(someJsonString); facesContext.responseComplete(); } 

Beaucoup mieux est d'utiliser un service Web JAX-RS. Je ne sais pas si Spring a réussi des beans sont injectables là-bas, mais le nouveau Java EE 6 CDI vous permet d'injecter @Named beans partout par @Inject , même dans un simple @WebServlet .

Voir également:

  • Servlet vs RESTful
  • Comment utiliser Servlets et Ajax?

Si vous souhaitez utiliser des facettes, vous pouvez le faire de la sorte. (Je ne sais pas si les graines injectées au printemps fonctionnent, mais si vous ajoutez @named ou @managedBean, il devrait être accessible dans le facelet)

 <f:view contentType="application/json" xmlns:f="http://java.sun.com/jsf/core" > { test : 'value' , some : #{someBean.someValue} } </f:view>