CUBA 7的新功能

三年前,我们宣布了该框架的第二个公开可用的主要版本。 CUBA 6是改变游戏规则的版本–许可从专有转为Apache 2.0。 那些日子,我们甚至无法猜测从长远来看它将把框架带到哪里。 CUBA社区开始呈指数级增长,因此我们了解了开发人员如何使用框架的许多可能(有时甚至是不可能的)方法。 现在,我们很高兴地宣布CUBA 7 ,我们希望这将使所有社区成员(从刚开始CUBA和Java之旅的人到熟练的企业开发人员和Java专家)的开发工作都更加连贯和欢乐。

古巴7

开发工具

显然,我们在很大程度上要归功于CUBA Studio 。 它显着简化了过度使用的Java企业例程,在许多地方使它得以简化,从而在可视化设计器中进行了琐碎的配置:无需了解Persistence API或Gradle甚至Spring来开发完整的功能丰富的CRUD应用程序– Studio会做的它给你。

古巴7

Studio是一个单独的Web应用程序,这个事实造成了一些重大限制:

  • 首先,Studio不是功能齐全的IDE,因此开发人员必须在Studio和IntelliJ IDEA或Eclipse之间切换才能开发业务逻辑,并从便利的导航,代码完成和其他必要的事情中受益,这很烦人。
  • 其次,这种神奇的简单性是建立在大量源代码解析和生成之上的。 改进代码生成功能将意味着朝着开发功能齐全的IDE的方向迈进。

我们决定依靠另一个巨人的肩膀来克服这些限制。 Studio由JetBrains合并到IntelliJ IDEA中。 现在,您可以将其作为IntelliJ IDEA的插件安装,也可以作为单独的独立捆绑包下载。

古巴7

这开辟了新的视野:

  • 其他JVM语言支持(首先是Kotlin)
  • 改进的热部署
  • 整个项目的直观导航
  • 更智能的提示和代码生成器

目前,新Studio正在积极开发中:我们正在移植旧版本中的功能。 短期计划还计划使用本机IntelliJ UI重新实现基于Web的设计师,并改善项目导航体验。

堆栈升级

传统上,基础堆栈也已进行了重大升级,例如Java 8/11,Vaadin 8,Spring 5。

古巴7

默认情况下,新项目使用Java 8,但是您可以通过在build.gradle文件中添加以下子句来指定Java版本:

subprojects {sourceCompatibility = JavaVersion.VERSION_11targetCompatibility = JavaVersion.VERSION_11
}

由于Vaadin数据绑定API的重大更改,升级到Vaadin 8是一个巨大的挑战。 幸运的是,CUBA通过将开发人员包装到其自己的API层中,从Vaadin内部提取了开发人员。 CUBA团队在重新实现内部结构方面做得很出色,保持了自己的API不变。 这意味着完全可以保存兼容性,并且可以在将项目迁移到CUBA 7之后立即使用Vaadin 8,而无需进行任何重构。

官方发行说明中提供了更新后的依赖项的完整列表。

新屏幕API

此部分也可以称为“第一个屏幕API”,因为CUBA从未在Web客户端层中有任何正式声明的API。 它来自框架的历史以及在第一阶段做出的某些假设:

以声明为中心的方法–可以以声明方式描述的所有内容,都应在屏幕描述符中声明,而不是在其控制器中进行编码

标准屏幕(浏览器和编辑器)提供了具体的通用功能,无需修改它

自从第一千名成员加入我们的社区以来,我们意识到“标准” CRUD屏幕的要求范围之广–远远超出了最初设计的功能集。 尽管如此,很长一段时间以来,即使没有API层,我们也能够处理自定义行为的请求-这要归功于另一个第一步假设-开放继承。 有效地,“开放继承”意味着您可以覆盖基础类的任何公共或受保护方法,以根据需要调整其行为。 这听起来似乎可以治愈所有疾病,但是实际上,它甚至无法给您带来短期合同:如果重写的方法将被重命名,删除或在框架的未来版本中根本不使用怎么办?

古巴7
@UiController("new-screen")  // screen id
public class NewScreen extends Screen {
}

从上面的示例中,我们可以看到屏幕标识符已在控制器类的上方明确定义。 换句话说,屏幕ID和控制器类现在彼此唯一对应。 因此,好消息是,现在可以通过其控制器类以安全的方式直接处理屏幕:

@Inject
private ScreenBuilders screenBuilders;@Subscribe
private void onBeforeClose(BeforeCloseEvent event) {screenBuilders.screen(this).withScreenClass(SomeConfirmationScreen.class).build().show();
}

屏幕描述符成为补充部分,而不是必需的。 可以以编程方式创建布局,也可以将其声明为XML屏幕描述符,该描述符由控制器类上的@UiDescriptor批注定义。 这使控制器和布局更易于阅读和理解–这种方法与Android开发中使用的方法非常相似。

之前还需要在web-screens.xml文件中注册屏幕描述符并为其分配标识符。 在CUBA 7中,由于兼容性原因而保留了该文件,但是,以新的方式创建屏幕不需要进行此类注册。

屏幕生命周期

新的API引入了清晰明了的屏幕生命周期事件:

  • 在里面
  • 初始化后
  • 演出前
  • 表演后
  • 收盘前
  • 收盘后

可以按以下方式订阅CUBA 7中所有与屏幕相关的事件:

@UiController("new-screen")
public class NewScreen extends Screen {@Subscribeprivate void onInit(InitEvent event) { }@Subscribeprivate void onBeforeShow(BeforeShowEvent event) {      }}

将新的API与旧的方法进行比较,您可以看到我们没有覆盖钩子方法,钩子方法在父类的层次结构中被模糊地调用,但是在屏幕生命周期的明确预定义点中定义了逻辑。

事件处理和功能代表

在上一节中,我们学习了如何订阅生命周期事件,那么其他组件呢? 我们是否应该像在6.x版本中那样将所有必需的侦听器分散在屏幕初始化上? 新的API非常统一,因此订阅其他事件与生命周期绝对相似。

让我们以具有两个UI元素的简单示例为例:一个按钮和一个Currency字段,因此其XML描述符如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<window xmlns="http://schemas.haulmont.com/cuba/screen/window.xsd"caption="msg://caption"messagesPack="com.company.demo.web"><layout><hbox spacing="true"><currencyField id="currencyField" currency="$"currencyLabelPosition="LEFT"/><button id="calcPriceBtn" caption="Calculate Price"/></hbox></layout>
</window>

通过单击按钮,我们称为中间件服务,返回一个数字,该数字转到货币字段。 货币字段应根据价格值更改其样式。

@UiController("demo_MyFirstScreen")
@UiDescriptor("my-first-screen.xml")
public class MyFirstScreen extends Screen {@Injectprivate PricingService pricingService;@Injectprivate CurrencyFieldcurrencyField;@Subscribe("calcPriceBtn")private void onCalcPriceBtnClick(Button.ClickEvent event) {currencyField.setValue(pricingService.calculatePrice());}@Subscribe("currencyField")private void onPriceChange(HasValue.ValueChangeEventevent) {BigDecimal price = pricingService.calculatePrice();currencyField.setStyleName(getStyleNameByPrice(price));}private String getStyleNameByPrice(BigDecimal price) {...}}

在上面的示例中,我们可以看到两个事件处理程序:一个事件处理程序在单击按钮时被调用,另一个事件处理程序在currency字段更改其值时被执行-就这么简单。

现在,让我们想象一下,我们需要验证价格并检查其价格是否为正。 直接的方法是在屏幕初始化时添加验证器:

@UiController("demo_MyFirstScreen")
@UiDescriptor("my-first-screen.xml")
public class MyFirstScreen extends Screen {@Injectprivate CurrencyField<BigDecimal> currencyField;@Subscribeprivate void onInit(InitEvent event) {currencyField.addValidator(value -> {if (value.compareTo(BigDecimal.ZERO) <= 0)throw new ValidationException("Price should be greater than zero");});}}

在现实世界的应用程序中,屏幕入口点通常会被此类屏幕元素初始化程序所丢弃。 为了解决此问题,CUBA提供了有用的注释@Install 。 让我们看看它对我们的案例有何帮助:

@UiController("demo_MyFirstScreen")
@UiDescriptor("my-first-screen.xml")
public class MyFirstScreen extends Screen {@Injectprivate CurrencyField<BigDecimal> currencyField;@Install(to = "currencyField", subject = "validator")private void currencyFieldValidator(BigDecimal value) {if (value.compareTo(BigDecimal.ZERO) <= 0)throw new ValidationException("Price should be greater than zero");}}

实际上,我们将验证逻辑从货币字段委派给屏幕中的currencyFieldValidator方法。 这可能看起来有些复杂,但是,开发人员以惊人的速度采用了此功能。

屏幕构建器/通知/对话框

古巴7

CUBA 7还通过流畅的API引入了一组有用的组件:

  • ScreenBuilders结合了流利的工厂来生成标准的查找,编辑器和自定义屏幕。 以下示例显示了如何从另一个屏幕打开一个屏幕。 请注意, build()方法返回正确类型的屏幕实例,而无需不安全地强制转换它。
CurrencyConversions currencyConversions = screenBuilders.screen(this).withScreenClass(CurrencyConversions.class).withLaunchMode(OpenMode.DIALOG).build();
currencyConversions.setBaseCurrency(Currency.EUR);
currencyConversions.show();
  • 屏幕组件为创建和显示屏幕提供了较低层次的抽象,而不是ScreenBuilders 。 如果需要进行遍历,它还提供对CUBA应用程序中所有打开的屏幕( Screens#getOpenedScreens )的信息的访问。
  • 通知对话框组件都引入了方便的自说明界面。 这是创建和显示对话框和通知的示例:
dialogs.createOptionDialog().withCaption("My first dialog").withMessage("Would you like to thank CUBA team?")
.withActions(new DialogAction(DialogAction.Type.YES).withHandler(e -> 
notifications.create().withCaption("Thank you!").withDescription("We appreciate all community members").withPosition(Notifications.Position.MIDDLE_CENTER).withHideDelayMs(3000).show()),new DialogAction(DialogAction.Type.CANCEL)
).show();

数据绑定

CUBA不仅可以通过提供具有广泛代码生成功能的高级可视化工具,还可以通过即用型的丰富数据感知组件集,来快速开发后台UI。 这些组件只需要知道它们使用什么数据,其余的将自动进行管理,例如查找列表,选择器字段,具有CRUD操作的各种网格等。

在版本7之前,数据绑定是通过所谓的数据源实现的-数据对象包装单个实体或实体集合,以将其与数据感知组件进行反应性绑定。 这种方法效果很好,但是在实现方面却是一个整体。 整体架构通常会导致其自定义问题,因此,在CUBA 7中,这种坚固的巨石被分为3个数据组件:

  • 数据加载器是数据容器的数据提供者。 数据加载器不保留数据,它们只是将所有必需的查询参数传递到数据存储区,并使用结果数据集提供数据容器。
  • 数据容器保留加载的数据(单个实体或多个实体),并以反应方式将其提供给数据感知组件:包装实体的所有更改都暴露给相应的UI组件,反之亦然, UI组件将导致其数据容器中的相应更改。
  • 数据上下文是功能强大的数据修改管理器,可跟踪更改并提交所有修改的实体。 实体可以合并到数据上下文中,因此它将提供原始实体的副本,但唯一但非常重要的区别是:将跟踪,存储和修改对所得实体及其引用的所有实体(包括集合)的所有修改作出相应的承诺。

数据组件可以在屏幕描述符中声明,也可以使用专门的工厂DataComponents以编程方式实例化。

介绍了Ufff,它是新屏幕API的最重要部分,因此让我简要列出Web客户端层中的其他重要功能:

  • URL历史记录和导航 。 此功能通过Web浏览器中的“返回”按钮解决了SPA的一个非常普遍的问题,提供了一种将路由分配给应用程序屏幕的简便方法,并使API能够在其URL中反映屏幕的当前状态。
  • 窗体而不是FieldGroup。 FieldGroup是一个数据感知组件,用于显示和修改单个实体的字段。 它推断运行时为字段显示的实际UI。 换句话说,如果您的实体中有一个Date字段,它将显示为DateField 。 但是,如果您希望通过编程方式对此字段进行操作,则需要将该字段注入到屏幕控制器,然后手动将其强制转换为正确的类型(在我们的示例中为DateField )。 稍后,我们将字段类型更改为其他类型,并且应用程序在运行时崩溃…Form通过显式字段类型声明解决了此问题。 在此处找到有关此新组件的更多信息。
  • 第三方 JavaScript组件的集成已大大简化,请按照文档将自定义JavaScript组件嵌入到CUBA应用程序中。
  • 现在,可以从xml屏幕描述符中轻松定义HTML / CSS属性,也可以通过编程方式对其进行设置。 在此处查找更多信息。

中间件功能

之前有关新屏幕API的内容超出了我的预期,因此在本节中,我将力求简洁!

实体变更事件

Entity Changed Event是一个Spring应用程序事件,当您的实体进入数据存储,被物理插入并距离提交一英寸以内时,将触发该事件。 在这里,您可以提供一些附加检查(例如,在确认订单之前检查库存中的产品可用性),并在其他交易将其可见之前(当然,已读取提交的隔离级别)对其进行修改(例如,重新计算总计)。 您还可以使用此事件作为通过抛出异常来中断提交事务的最后机会–在某些特殊情况下可能很有用。

还有一种在提交发生后立即捕获Entity Changed Event的方法。

请遵循文档的本章以查看示例。

交易数据管理器

在开发应用程序时,我们通常使用分离的实体(即不受任何事务管理的实体)进行操作。 但是,并非总是可以使用分离的实体,尤其是在尝试满足ACID要求时-可以使用事务数据管理器时就是这种情况。 它看起来与普通的数据管理器非常相似,但在以下方面有所不同:

  • 它可以加入现有事务(如果在事务上下文中被调用)或创建自己的事务。
  • 它没有提交方法,但是有保存方法,它不会导致立即提交,但是要等到附加的事务被提交后再进行。

在此处找到使用它的示例。

JPA生命周期回调

最后,CUBA 7支持JPA生命周期回调。 为了不复制有关这些回调的用途的写得很好的信息,让我分享一下此链接 , 该链接完全涵盖了该主题。

兼容性呢?

古巴7

对于任何主要发行版,这都是一个公平的问题,尤其是当有太多看似重大的更改时! 我们在设计所有这些新功能和API时都考虑了向后兼容性:

  • CUBA 7支持旧的屏幕API,并通过幕后的新屏幕API实现:)
  • 我们还提供了用于旧数据绑定的适配器,这些适配器可继续用于旧屏幕。

因此,好消息是,从版本6到版本7的迁移路径应该非常简单。

结论

在结束本技术概述时,我想提到还有其他重要的创新,尤其是在许可方面:

  • Studio的10个实体限制现已消失
  • 现在免费提供报告,BPM,图表和地图以及全文搜索插件。
  • Studio的商业版本为实体,屏幕,菜单和其他平台元素的视觉设计师带来了额外的开发舒适度,而免费版本则专注于使用代码
  • 请注意,对于6.x和更早版本的Platform和Studio许可条款保持不变!

最后,让我再次感谢社区成员的所有支持和反馈。 希望您会喜欢版本7! 更改的完整列表通常在发行说明中提供 。

翻译自: https://www.javacodegeeks.com/2019/04/whats-new-cuba-7.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光模块功能失效的原因有哪些?

光模块主要用来将设备&#xff08;一般指的是交换机或者路由器设备&#xff09;中的电信号转换成光信号&#xff0c;然后通过一根光纤发射出去&#xff08;由光模块的发射端实现&#xff09;&#xff0c;同时可以接收外部一根光纤发射过来的光信号且转换成电信号&#xff08;通…

高速连传与LORA的区别和优势

高速连传电台&#xff0c;支持Modbus协议&#xff0c;超远距离&#xff0c;不限包长&#xff0c;不间断连续传输&#xff0c;实现低延迟/高响应的半双工通讯&#xff1b;多种功率可选&#xff0c;同时支持RS232与RS485接口&#xff0c;适合于&#xff1a;高速连续传输、工控Mod…

光模块兼容性介绍,如何测试兼容光模块的兼容性?

经常买光模块的人都知道&#xff0c;光纤模块通常需要确认兼容码&#xff0c;因为目前市面上存在2种&#xff0c;一种是高性能的兼容模块&#xff0c;一种是原交换机品牌光模块&#xff0c;两者之间的价格差距较大。接下来就由飞畅科技的小编来为大家介绍下光模块的兼容性&…

无线传感器网络详解

随着传感器技术、嵌入式技术、分布式信息处理技术和无线通信技术的发展&#xff0c;以大量的具有微处理能力的微型传感器节点组成的无线传感器网络(WSN)逐渐成为研究热点问题。 与传统无线通信网络Ad Hoc网络相比&#xff0c;WSN的自组织性、动态性、可靠性和以数据为中心等特点…

4G与5G网络有哪些区别

一、帧结构比较 4G和5G相同之处 帧和子帧长度均为&#xff1a;10ms和1ms。最小调度单位资源&#xff1a;RB4G和5G不同之处 1)&#xff1b;子载波宽度 4G&#xff1a;固定为15kHz。5G&#xff1a;多种选择&#xff0c;15kHz、30kHz、60kHz、120kHz、240kHz&#xff0c;且一个…

什么是SFP光模块?SFP光模块小知识介绍!

SFP光模块是SFP封装的热插拔小封装模块&#xff0c;目前最高速率可达10.3G&#xff0c;接口为LC。SFP光模块主要由激光器构成。SFP分类可分为速率分类、波长分类、模式分类。接下来就由飞畅科技的小编来为大家详细介绍下SFP光模块&#xff0c;一起来看看吧&#xff01; SFP是S…

无线通信模块

无线通信模块是各类智能终端得以接入物联网的信息入口。它是链接物联网感知层和网络层中的关键环节。目前在M2M的场景下&#xff0c;应用得更多的是蜂窝通信模块&#xff08;2G/3G/4G),未来 LPWAN 模块&#xff08;NB/IoT、 LoRa&#xff09;将快速的得到应用。根据GAMA&#x…

无线传感器主要应用领域及发展趋势

工业无线传感器网络产品为系统级产品&#xff0c;其包括了无线传感器、数据转发网关和监控主机等在内的整体解决方案。因其具有成本低、范围大、布置灵活、支持移动的特点&#xff0c;工业无线传感器网络产品在力学参数检测、工业监控、智能电力、矿山安全、医疗健康、环境监测…

哪些原因会导致rs485转换器信号受干扰?

485转换器主要的作用是将单端的RS-232信号转换为平衡差分的RS-485或RS-422信号。由于长距离信息传输、抗干扰能力强等原因&#xff0c;rs485转换器在安防通信等领域得到普遍的使用。但是&#xff0c;经常会有使用者遇到信号受到干扰的情况&#xff0c;那么&#xff0c;哪些原因…

无线传感器在智能家居中的应用

传统的传感器在智能家居领域的应用中任然还是存在着一定的局限性&#xff0c;与总线相连的传感器价格昂贵&#xff0c;传感器组网的开销成本巨大&#xff0c;在一些特殊的区域布线很困难&#xff0c;不同类型的传感器和控制系统的软硬件之间协议不兼容。 在此背景下&#xff0c…

光猫、路由器、交换机、wifi通俗释义

如今&#xff0c;网络已经进入了千家万户&#xff0c;上网已成为了我们生活中必不可少的事情。通常&#xff0c;在家里最常见的网络设备有&#xff1a;光猫&#xff08;光调制解调器&#xff09;、路由器、交换机、wifi&#xff0c;但很多小白用户并不能轻易区分它们。当遇上网…

物联网无线技术蓝牙和WiFi的区别有哪些?

在现在物联网井喷式发展的大环境下&#xff0c;联网设备的数量也越来越多&#xff0c;无缐通信技术在物联网中发挥的作用也越来越大。无线网络技术的发展正在不断的改变信息发送的方式&#xff0c;在任何时间、任何地点都能够无缝、自由地访问信息正在使设备和用户环境发生戏剧…

物联网的应用领域有哪些?

智能仓储 目前&#xff0c;国内最成熟的智能仓储解决方案智能仓储解决方案&#xff0c;智能仓储是物流过程的一个环节&#xff0c;智能仓储的应用&#xff0c;保证了货物仓库管理各个环节数据输入的速度和准确性&#xff0c;确保企业及时准确地掌握库存的真实数据&#xff0c;…

光猫是什么?光纤猫的工作原理及应用范围介绍!

光猫就是“光modem”&#xff0c;是指将光以太信号转换成其它协议信号的收发设备&#xff0c;也是起着调制解调的作用。光猫也称为单端口光端机&#xff0c;该设备作为本地网的中继传输设备&#xff0c;适用于基站的光纤终端传输设备以及租用线路设备。而对于多口的光端机一般会…

UART串口协议详解

通用异步收发器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种串行、异步、全双工的通信协议&#xff0c;在嵌入式领域应用的非常广泛。 UART作为异步串行通信协议的一种&#xff0c;工作原理是将传输数据的每个二进制位…

Modbus通讯协议

Modbus协议概述 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议&#xff0c;控制器相互之间、控制器经由网络&#xff08;例如以太网&#xff09;和其他设备之间可以通信。它已经成为一种通用工业标准。有了它&#xff0c;不同厂商生产的控制设备可以连成工业网络…

宽带猫、路由器、交换机的作用与区别是什么?

路由器是连接因特网中各局域网、广域网的设备&#xff0c;它会根据信道的情况自动选择和设定路由&#xff0c;以最佳路径&#xff0c;按前后顺序发送信号的设备。路由器是互联网络的枢纽、"交通警察"。目前路由器已经广泛应用于各行各业&#xff0c;各种不同档次的产…

lambdas for_借助Java 8和lambdas,可以一起使用AssertJ和Awaitility

lambdas forAssertJ和Awaitility是在自动代码测试中使用的两个我最喜欢的工具。 不幸的是直到最近&#xff0c;还不能一起使用它。 但是随后Java 8进入了游戏&#xff0c;几十行代码足以使其在Awaility 1.6.0中实现。 AssertJ提供了一组丰富的断言&#xff0c;其中包含非常有用…

多家大厂接连停产,半导体“最后一里路”面临“瘫痪”?

“6月4日&#xff0c;中国台湾半导体封测龙头企业京元电子发布公告称&#xff0c;因为疫情影响&#xff0c;公司开始全面停产48小时。” 而事实上台湾疫情急剧恶化&#xff0c;停产48小时的确是“天真”了&#xff01; 半导体“最后一里路” 台媒称&#xff0c;京元电子从事的业…

为什么“鸿蒙”不是第二个“安卓”,如何看待Harmony OS里的Android痕迹?

​华为将在6月2日晚8点举办鸿蒙操作系统及华为全场景新品发布会。官方微博也在同一时间更名为Harmony OS&#xff0c;同时更新了鸿蒙操作系统的开机视频。——Harmony OS会带来哪些改变&#xff1f; “鸿蒙”走过的那些路 Harmony OS 历程 2012年&#xff0c;发布EMUI 1.0&…