How to generate JSON response from JSF?

jsf, json

Solution

JSF is a MVC framework generating HTML, not some kind of a REST web service framework. You're essentially abusing JSF as a web service. Your concrete problem is simply caused by placing `<html>` tags and so on in the view file yourself.

If you really insist, then you can always achieve this by using `<ui:composition>` instead of `<html>`. You also need to make sure that the right content type of `application/json` is been used, this defaults in JSF namely to `text/html`.

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

But I strongly recommend to look at JAX-RS or JAX-WS instead of abusing JSF as a JSON web service. Use the right tool for the job.

See also:

- How to implement JAX-RS RESTful service in JSF framework

- Servlet vs RESTful

- What is the need of JSF, when UI can be achieved from CSS, HTML, JavaScript, jQuery?

Problem

I have created a page where I want to get the JSON response from a JSF page, but when i try to get page it shows me whole html page. ``` <html xmlns="http://www.w3.org/1999/xhtml"><head> <title>Facelet Title</title></head><body> [{"value": "21", "name": "Mick Jagger"},{"value": "43", "name": "Johnny Storm"},{"value": "46", "name": "Richard Hatch"},{"value": "54", "name": "Kelly Slater"},{"value": "55", "name": "Rudy Hamilton"},{"value": "79", "name": "Michael Jordan"}] </body></html> ```

Original source

Related problems