Статьи

Визуализация данных REST XML в элементах управления JavaFX

В настоящее время я работаю над рядом проектов, которые используют JavaFX. Одной из характеристик, которыми обладают все эти проекты, является требование иметь возможность общаться с корпоративным бэкэндом. Это оправдывает работу, которую я трачу на RedFX и DataFX, две библиотеки JavaFX, которые занимаются извлечением, рендерингом и синхронизацией данных.

В центре внимания RedFX находится связь между клиентами JavaFX и серверами Java EE. RedFX позволяет клиентам обмениваться данными друг с другом и с внутренними модулями. Оригинальный код был основан на JavaFX 1.3.1 и был портирован на JavaFX 2.0. Ряд смелых бета-тестеров сейчас работают с новым кодом, и скоро будет доступен публичный релиз.

Проект DataFX позволяет разработчикам клиентов заполнять элементы управления JavaFX данными, поступающими из разных источников, и отображать эти данные удобным способом без необходимости написания большого количества стандартного кода.

В этой записи блога я быстро покажу, как вы можете использовать библиотеку DataFX для извлечения и визуализации данных XML, полученных с помощью вызова REST.
Сегодня многие корпоративные проекты предоставляют свои данные через вызовы REST. Результатом вызова REST часто является документ XML, содержащий много информации. Не вся эта информация относится к конкретному проекту JavaFX. Извлечение соответствующих частей и заполнение TableView этой информацией может стать довольно громоздким.
По этой причине проект DataFX содержит класс XMLDataSource. Используя этот класс, разработчики могут заполнить TableView нужными им частями в XML, не анализируя XML вручную.

Я сам использую класс XMLDataSource в проекте Uitpas, который
LodgON и
ACA-IT Solutions создают для
Cultuurnet Vlaanderen . Проект содержит бэкэнд, который (среди прочего) может быть запрошен для получения информации о культурных событиях. Интерфейс JavaFX должен показывать события, относящиеся к данному местоположению, а операторы должны получать представление этих событий в виде списка. Несколько упрощенный XML-код, возвращаемый из внутреннего вызова, выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CultureEvents xmlns:ns2="http://www.cultuurdatabank.com/XMLSchema/CdbXSD/3.1/FINAL">
    <event>
        <cdbid>77f811ca-ac5d-40a4-9d73-80335b6288cd</cdbid>
        <discountPrice>5.0</discountPrice>
        <id>1</id>
        <item title="Biljarten" cdbid="77f811ca-ac5d-40a4-9d73-80335b6288cd"/>
        <normalPrice>20.0</normalPrice>
        <promotion>false</promotion>
    </event>
    <event>
       ...
    </event>
    <event>
       ...
    </event>
</CultureEvents>

Нерелевантные части уже опущены в этом примере. В TableView мы хотим показать название событий (в первом случае это «Biljarten», обычная цена (5 евро) и цена со скидкой (20 евро). Следующий код достигнет этого): 

NetworkSource ns = new NetworkSource("http://192.168.130.115:8080/uitpas/rest/uitpas/cultureevent?from=2011-11-01&to=2011-11-15");
XMLDataSource dataSource = new XMLDataSource(ns,"event","item/@title","normalPrice", "discountPrice");
TableView tv = new TableView();
tv.setItems(dataSource);
tv.getColumns().setAll(dataSource.getColumns());

Визуализация TableView покажет таблицу с 3 столбцами: заголовок, нормальная цена и цена со скидкой. Каждое событие будет в одной строке таблицы.
Конструктор XMLDataSource, используемый в этом примере, принимает ряд аргументов:

  • DataSourceReader. В данном случае это URL-адрес конечной точки REST. Однако для моей локальной разработки я храню возвращенный XML в локальном файле и использую FileSource вместо NetworkSource.
  • тэг, который разделяет различные «строки», которые мы хотим визуализировать. В этом случае мы хотим одну строку для одного «события»
  • количество столбцов, которые мы хотим показать. XMLDataSource принимает выражения xpath и может отображать как элементы XML (например, normalPrice), так и атрибуты (например, атрибут «title» в элементе «item»)

Проект DataFX содержит еще одну очень полезную часть: удобные CellFactories. Валюта CellFactory может использоваться для визуализации обычной цены и цены со скидкой.

Я хочу подчеркнуть, что существует множество способов взаимодействия между настольными клиентами и удаленными бэкэндами. Нет единого решения всех проблем. Разработчики должны знать об этом. Я убежден, что и DataFX, и RedFX могут способствовать более быстрой разработке приложений JavaFX для предприятий, но мы хотим услышать от разработчиков то, что, по их мнению, отсутствует, или почему мы должны поддерживать разные шаблоны.

От http://66.240.233.40/johan/blog/Visualizing_REST_XML_Data_in_JavaFX_controls