3.2.3.1. Создание представлений
Представление может быть создано двумя путями:
-
программно - созданием экземпляра
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
и _base
:
-
_local
включает в себя все локальные атрибуты сущности -
_minimal
включает в себя атрибуты, входящие в имя экземпляра сущности, и задаваемые аннотацией @NamePattern. Если аннотация@NamePattern
для сущности не указана, данное представление не включает никаких атрибутов. -
_base
включает в себя все локальные несистемные атрибуты и атрибуты, заданные в аннотации@NamePattern
(т.е. фактически_minimal
+_local
).
Подробная структура XML-описателей изложена здесь.
Пример описателя представления для сущности Заказ, которое должно обеспечить загрузку всех локальных атрибутов, ассоциированного Покупателя и коллекции Пунктов заказа:
<view class="com.sample.sales.entity.Order"
name="order-with-customer"
extends="_local">
<property name="customer" view="_minimal"/>
<property name="items" view="itemInOrder"/>
</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-описателей представлений по имени в процессе разработки приложения. |