3.5.3.4.1. Декларативное создание компонентов данных

Самый простой способ создать компоненты данных - это определить их в XML-дескрипторе экрана внутри элемента <data>.

Рассмотрим для примера модель данных, содержащую сущности Customer, Order и OrderLine. Дескриптор экрана редактирования сущности Order может иметь следующее определение:

<data>
    <instance id="orderDc" class="com.company.sales.entity.Order" view="order-edit">
        <loader/>

        <collection id="linesDc" property="lines"/>
    </instance>

    <collection id="customersDc" class="com.company.sales.entity.Customer" view="_minimal">
        <loader>
            <query><![CDATA[select e from sales_Customer e]]></query>
        </loader>
    </collection>
</data>

В этом случае будут созданы следующие компоненты данных:

  • Экземпляр DataContext.

  • Контейнер InstanceContainer с идентификатором orderDc и InstanceLoader для сущности Order.

  • Контейнер CollectionPropertyContainer с идентификатором linesDc для сущности OrderLines. Этот контейнер привязан к атрибуту-коллекции Order.lines.

  • Контейнер CollectionContainer с идентификатором customersDc для сущности Customer. Он загружается с помощью CollectionLoader и определённого запроса.

Контейнеры данных используются в визуальных компонентах следующим образом:

<layout>
    <dateField dataContainer="orderDc" property="date"/> (1)
    <form id="form" dataContainer="orderDc"> (2)
        <column>
            <textField property="amount"/>
            <lookupPickerField id="customerField" property="customer"
                               optionsContainer="customersDc"/> (3)
        </column>
    </form>
    <table dataContainer="linesDc"> (4)
        <columns>
            <column id="product"/>
            <column id="quantity"/>
        </columns>
    </table>
1 Отдельные поля имеют атрибуты dataContainer и property.
2 Элемент form распространяет свой dataContainer на все вложенные поля, поэтому они требуют только указания атрибута property.
3 Поля выбора имеют атрибут optionsContainer.
4 У таблиц есть только атрибут dataContainer.