Data Components

Data components are non-visual elements of screens that provide loading of data from the middle tier, binding it to data-aware visual components and saving changed data back to the middle tier. There are the following categories of data components:

  • Containers provide the thin layer between entities and data-aware visual components. Different types of containers hold either single instances or collections of entities.

  • Loaders load data from the middle tier to containers.

  • DataContext tracks changes in entities and saves changed instances back to the middle tier upon request.

Usually, data components are defined in the screen XML descriptor in the <data> element:

<data readOnly="true">
    <collection id="departmentsDc"
                class="ui.ex1.entity.Department">
        <fetchPlan extends="_base">
            <property name="employee" fetchPlan="_base"/>
        </fetchPlan>
        <loader id="departmentsDl">
            <query>
                <![CDATA[select e from uiex1_Department e]]>
                <condition>
                    <c:jpql>
                        <c:where>e.name like :name</c:where>
                    </c:jpql>
                </condition>
            </query>

        </loader>
        <collection id="employeesDc" property="employee"/>
    </collection>
</data>

Data components can be injected into the controller in the same way as visual components:

@Autowired
private CollectionLoader<Department> departmentsDl;

private String departmentName;

@Subscribe
public void onBeforeShow(BeforeShowEvent event) {
    departmentsDl.setParameter("name", departmentName);
    departmentsDl.load();
}

Data components of a particular screen are registered in the ScreenData object which is associated with the screen controller and available through its getScreenData() method. This object is useful when you need to load all data for the screen, for example:

@Subscribe
public void onAfterShow(AfterShowEvent event) {
    getScreenData().loadAll();
}
Use DataLoadCoordinator facet for declarative linking of data loaders to data containers, visual components and screen events. In case you need to set some loading parameters, you can use programmatic loading.