Подтвердить что ты не робот

Как генерировать JSON-ответ от JSF?

Я создал страницу, где я хочу получить ответ JSON со страницы JSF, но когда я пытаюсь получить страницу, она показывает мне всю html-страницу.

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

Ответ 1

JSF - это MVC-инфраструктура, генерирующая HTML, а не какая-то структура веб-сервиса REST. Вы по сути злоупотребляете JSF как веб-службой. Ваша конкретная проблема просто вызвана размещением тегов <html> и т.д. В файле вида.

Если вы действительно настаиваете, вы всегда можете достичь этого, используя <ui:composition> вместо <html>. Вам также необходимо убедиться, что используется правильный тип контента application/json, это значение по умолчанию указано в JSF, а именно: 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>

с

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

Но я настоятельно рекомендую посмотреть JAX-RS или JAX-WS вместо того, чтобы злоупотреблять JSF как веб-службой JSON. Используйте правильный инструмент для задания.

См. также:

Ответ 2

Я даже использую contentType = "text/xhtml" с JSF 2.2, и он отлично работает. Нет необходимости в renderJson() из ответа BalusC выше

<f:view encoding="UTF-8" contentType="text/html"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
 <h:outputText value="#{stationView.getClosestStationen(param.longitude, param.latitude)}" escape="false"/>
</f:view>

Ajax call:

        $.ajax({
            url: requestContextPath + '/rest/stationen.xhtml',
            type: "GET",
            data: {
               "longitude": x,
               "latitude": y
            },
            dataType: "json",
            success: function (data) {
              $.each(data, function (i, station) {
                 ...
              });
            },
            error: function () {
                ...
            }
        })

Ответ 3

Я использовал только facelet для вывода (но JSF 1.2)

<f:view contentType="application/json" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<h:outputText value="#{someBean.getJson()}" escape="false"/>
</f:view>

Ответ 4

Почему вы используете jsf для этого? Используйте сервлет для обслуживания вашего JSON. Мое предложение было бы использовать реализацию jaxrs, например cxf.