Представление может быть создано двумя путями:
-
программно - созданием экземпляра
View
, например:View view = new View(Order.class) .addProperty("date") .addProperty("amount") .addProperty("customer", new View(Customer.class) .addProperty("name") );
Как правило, таким способом создаются представления, используемые только в каком-то одном месте бизнес-логики.
-
декларативно - путем создания описателя на XML и его развертывания в репозитории представлений
ViewRepository
. При развертывании на основе XML-описателя создаются и кэшируются экземплярыView
. В дальнейшем в любом месте кода приложения требуемое представление можно получить вызовом репозитория с указанием класса сущности и имени представления.
Рассмотрим подробнее декларативный способ создания и работы с представлениями.
ViewRepository
является бином Spring, доступным для всех блоков приложения. Ссылка на ViewRepository
может быть также получена через интерфейс инфраструктуры
Metadata
. Для получения экземпляра View
, содержащегося в репозитории, используются методы getView()
. Для развертывания XML-описателей представлений в репозитории используются методы deployViews()
базовой реализации AbstractViewRepository
.
В репозитории для каждой сущности по умолчанию доступны два представления с именами _local
и _minimal
:
-
_local
включает в себя все локальные атрибуты сущности -
_minimal
включает в себя атрибуты, входящие в имя экземпляра сущности, и задаваемые аннотацией@NamePattern
. Если аннотация@NamePattern
для сущности не указана, данное представление не включает никаких атрибутов.
Подробная структура XML-описателей изложена в Раздел A.11, «views.xml»
Пример описателя представления для сущности Заказ, которое должно обеспечить загрузку всех локальных атрибутов, ассоциированного Покупателя и коллекции Пунктов заказа:
<view class="com.sample.sales.entity.Order" name="orderWithCustomer" extends="_local"> <property name="customer" view="_minimal"/> <property name="items" view="itemsInOrder"/> </view>
Рекомендуемый способ группировки и развертывания описателей представлений:
-
В модуле global в корне
src
создать файлviews.xml
и поместить в него все описатели представлений, которые должны быть доступны глобально, т.е. на всех уровнях приложения. -
Зарегистрировать данный файл в свойстве cuba.viewsConfig блока Middleware и используемых клиентских блоков, т.е. в файле
app.properties
модуля core, в файлеweb-app.properties
модуля web и так далее. Это обеспечит автоматическое развертывание представлений на старте приложения в репозитории Middleware и клиентских блоков (см. методAbstractViewRepository.init()
). -
Если существуют представления, которые необходимы только какому-то одному клиентскому блоку приложения, то можно определить их в аналогичном файле данного блока, например,
web-views.xml
, и добавить этот файл в свойствоcuba.viewsConfig
этого блока, т.е. в данном случае в файлweb-app.properties
.
Если на момент развертывания некоторого представления в репозитории уже есть представление для этого же класса сущности и
с таким же именем, то новое будет проигнорировано. Для того чтобы представление заменило имеющееся в репозитории и гарантированно
было развернуто, в XML-описателе должен быть явно указан атрибут overwrite = "true"
.
Рекомендуется давать представлениям "описательные" имена. Например, не "browse", а "customerBrowse". Это упрощает поиск XML-описателей представлений по имени в процессе разработки приложения.