Статьи

Как получить ответ JSON от JSF?

Многие виджеты JavaScript ожидают данные и параметры в формате JSON. В настоящее время действительно легко выбрать классный виджет и обернуть его в составной компонент. Но первый вопрос — как отправить запрос AJAX и получить ответ в правильном формате JSON. Этот вопрос часто задают пользователи JSF. Все, что вам нужно, это XHTML-фейслет, как этот:

1
2
3
4
5
6
<f:view encoding="UTF-8" contentType="text/html"
  <h:outputText value="#{stationView.getClosestStations(param.longitude, param.latitude)}" escape="false"/>
</f:view>

Пожалуйста, рассмотрите contentType = ”text / html” (application / json здесь не будет работать) и escape = ”false” в h: outputText. Метод getClosestStations () в компоненте StationView создает вывод JSON для списка специальных объектов Java. Я советую использовать библиотеку Gson для сериализации любого объекта Java в JSON. Краткий пример:

1
2
3
String[] strings = {"abc", "def", "ghi"};
Gson gson = new Gson();
gson.toJson(strings);  ==> prints ["abc", "def", "ghi"]

Файл XHTML выше расположен в веб-контексте. Скажем, по пути /rest/stations.xhtml. Вызов Ajax в вашем коде JavaScript должен выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
$.ajax({
    url: requestContextPath + '/rest/stations.xhtml',
    type: "GET",
    data: {
        "longitude": x,
        "latitude": y
    },
    dataType: "json",
    success: function (data) {
        $.each(data, function (i, station) {
            ...
        });
    },
    error: function () {
        ...
    }
});

Пожалуйста, обратитесь к документации jQuery для получения дополнительной информации о $ .ajax. Примечание: если вы опустите dataType: «json», вам придется анализировать строку JSON вручную.

1
2
3
4
5
success: function (data) {
    $.each($.parseJSON(data), function (i, station) {
        ...
    });
}

Ответ представляет собой чистую строку JSON (без тегов HTML), подобную этой:

1
[{"latitude":46.947045,"longitude":7.443922,"distanz":110,"name":"Bern, Bundesplatz"},{....},...]

Нужно больше примеров для ответа JSON в JSF? В одной из моих следующих публикаций я, вероятно, объясню, как реализовать классный компонент автозаполнения без написания слишком большого количества кода.