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
(调用时提供实体类和视图名称),可以在应用程序代码的任何部分中获取所需的视图。
下面看看使用声明式方式创建和使用视图的细节。
ViewRepository
是一个 Spring bean,所有应用程序 block 都可以访问这个 bean。可以使用注入或通过元数据基础接口得到 ViewRepository
的引用。然后用 ViewRepository.getView()
方法从视图库中获取视图实例。AbstractViewRepository
基实现中的 deployViews()
方法用于将 XML 描述部署到视图库。
默认情况下,每个实体的视图库中都有三个名为 _local
、 _minimal
和 _base
的视图:
-
_local
包含所有本地实体属性。 -
_minimal
包含实体实例名称中包含的属性,这些属性通过@NamePattern注解指定。如果未在实体中指定@NamePattern
注解,则此视图不包含任何属性。 -
_base
包括所有本地非系统属性和由@NamePattern
定义的属性(实际上是_minimal
+_local
)。
视图 XML 描述的详细结构说明在这里。
下面的示例展示了 Order
实体的视图描述,它提供了所有本地属性、关联的 Customer
和 Items
集合的加载。
<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文件,并将所有可全局(即在所有应用程序层)访问的视图描述放入其中。 -
在所有 block 的 cuba.viewsConfig应用程序属性中注册此文件,即 core 模块的
app.properties
、 web 模块的web-app.properties
,这将确保在应用程序启动时自动部署视图到视图库中。 -
如果视图仅在一个应用程序 block 中使用,则可以在此 block 的类似文件中定义,例如,
web-views.xml
,然后只在这个 block 的cuba.viewsConfig属性中注册。如果视图库已经包含某个实体的特定名称的视图,则不会为此实体部署其它同名视图。如果需要使用新的视图替换视图库中的现有视图并保证其部署,需要为新视图指定
overwrite="true"
属性。
建议为视图提供描述性名称。例如,不仅仅是 "browse",而是 "customerBrowse"。这样可以简化 XML 描述中视图的搜索。