Alex
Alex

Reputation: 472

JSF + JSON: Output "plain" text in servlet?

I'm trying to use Mootools (Request.JSON) together with JSF - mainly because I wrote a similar application in CakePHP some time ago and would like to reuse most of the JS part.

Is there any way to return plain text ("application/json") using an request from something like a markup-less facelet?

The only solution I came up with was using an HttpServlet and registering it to a service URL in web.xml. That approach works and really returns an file without any markup, but I'd rather use my Spring-injected ManagedProperties than being restricted to WebApplicationContextUtils.

Did I miss something or is that the recommended way?

Upvotes: 3

Views: 3316

Answers (2)

webstrap
webstrap

Reputation: 1024

If you want to use facelets you can do it like this. (I don't know if spring injected beans work, but if you add @named or @managedBean then it should be accessible in the facelet)

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

Upvotes: 2

BalusC
BalusC

Reputation: 1108742

There is a way. But it's ugly and essentially abuse of JSF/Facelets as in using the wrong tool for the job.

E.g.

<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>

with

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();
}

Much better is to use a JAX-RS web service. I'm not sure if Spring managed beans are injectable in there, but the new Java EE 6 CDI allows you to inject @Named beans everywhere by @Inject, even in a simple @WebServlet.

See also:

Upvotes: 5

Related Questions