3.5.1.1.1. Аннотации контроллеров

Аннотации на классе контроллера используются для предоставления фреймворку информации об экране. Некоторые аннотации применимы для любого типа экрана, некоторые должны быть использованы только в экранах редактирования или поиска.

Следующий пример демонстрирует использование общих аннотаций:

package com.company.demo.web.screens;

import com.haulmont.cuba.gui.screen.*;

@UiController("demo_FooScreen")
@UiDescriptor("foo-screen.xml")
@LoadDataBeforeShow
@MultipleOpen
@DialogMode(forceDialog = true)
public class FooScreen extends Screen {
}
  • @UiController - указывает, что данный класс является контроллером экрана. Значение аннотации задает id экрана, который используется для ссылки на экран из главного меню или при открытии экрана программно.

  • @UiDescriptor - соединяет контроллер с XML-дескриптором. Значение аннотации указывает путь к файлу. Если значение содержит только имя файла, подразумевается что файл находится в том же пакете что и класс контроллера.

  • @LoadDataBeforeShow - указывает, что все загрузчики данных должны быть запущены автоматически перед показом экрана. Точнее, данные загружаются после вызова всех обработчиков BeforeShowEvent, но до обработчиков AfterShowEvent. Если вам необходимо выполнить какие-либо действия при загрузке данных перед показом экрана, удалите данную аннотацию или установите ее значение в false и используйте метод getScreenData().loadAll() или методы load() нужных загрузчиков в слушателе события BeforeShowEvent. Рассмотрите также использование фасета DataLoadCoordinator для декларативного управления загрузкой данных.

  • @MultipleOpen - указывает, что из главного меню можно открыть несколько экземпляров данного экрана. По умолчанию, когда пользователь выбирает пункт главного меню, фреймворк проверяет, не открыт ли уже наверху какой-либо вкладки главного окна экран с тем же классом и id. Если такой экран найден, он закрывается, и новый экран открывается в новой вкладке. Когда на экране присутствует аннотация @MultipleOpen, никаких проверок не производится, и новый экземпляр экрана просто открывается в новой вкладке.

    Можно предоставить собственный способ проверки, является ли экран тем же самым, если переопределить метод isSameScreen() контроллера.

  • @DialogMode - позволяет указать параметры геометрии и поведения экрана при открытии его в диалоговом окне. Данная аннотация соответствует элементу <dialogMode> дексриптора экрана и может быть использована вместо него. Значения из XML имеют более высокий приоритет для всех параметров кроме forceDialog. Значение параметра forceDialog объединяется: если оно установлено в true или в XML, или в аннотации, то экран всегда открывается в диалоге.

Пример аннотаций, специфичных для экранов выбора:

package com.company.demo.web.screens;

import com.haulmont.cuba.gui.screen.*;
import com.company.demo.entity.Customer;

// common annotations
@UiController("demo_Customer.browse")
@UiDescriptor("customer-browse.xml")
@LoadDataBeforeShow
// lookup-specific annotations
@LookupComponent("customersTable")
@PrimaryLookupScreen(Customer.class)
public class CustomerBrowse extends StandardLookup<Customer> {
}
  • @LookupComponent - указывает id UI-компонента, который должен быть использован для получения значения из экрана выбора.

    Вместо использования данной аннотации, можно указать компонент выбора программно, если переопределить метод контроллера getLookupComponent().

  • @PrimaryLookupScreen - указывает, что данный экран является экраном выбора по умолчанию для сущностей заданного типа. Данная аннотация имеет больший приоритет чем конвенция {entity_name}.lookup / {entity_name}.browse.

Пример аннотаций, специфичных для экранов редактирования:

package com.company.demo.web.data.sort;

import com.haulmont.cuba.gui.screen.*;
import com.company.demo.entity.Customer;

// common annotations
@UiController("demo_Customer.edit")
@UiDescriptor("customer-edit.xml")
@LoadDataBeforeShow
// editor-specific annotations
@EditedEntityContainer("customerDc")
@PrimaryEditorScreen(Customer.class)
public class CustomerEdit extends StandardEditor<Customer> {
}
  • @EditedEntityContainer - указывает контейнер данных, содержащий редактируемую сущность.

    Вместо использования данной аннотации, можно указать контейнер программно, если переопределить метод контроллера getEditedEntityContainer()

  • @PrimaryEditorScreen - указывает, что данный экран является экраном редактирования по умолчанию для сущностей заданного типа. Данная аннотация имеет больший приоритет чем конвенция {entity_name}.edit.