您的框架有多可扩展性?

在参加会议时,我们总是会见到高素质的决策者,他们经常问同样的问题:' 您的框架有多可扩展性?如果我需要比您开箱即用的功能更多的东西怎么办? '。 这个问题是非常合理的,因为他们只是不想被卡在开发曲线的中间,然后意识到框架只是不允许实现某些功能,或者,如果您使用开源产品,那么它可能会实现。需要花费很长的时间才能深入探究框架中记录较差的部分。

通常会特别注意用户界面部分:该框架有多少个组件? 是否可以集成第三方小部件? 最后,将它们集成到您的应用程序中有多么容易。

即使框架为您提供了许多现成的组件,有时您可能仍需要具有非常特定的,通常不使用的内容,因此未在框架中实现。

在本文中,我将说明如何将第三方视觉组件集成到CUBA平台中 。

CUBA平台中的通用用户界面

为了让您简要了解CUBA平台提供的现成的视觉组件,请查看以下图片:

1个

2

如您所见,有一个现成的扩展组件集,但是所有组件都是非常通用的,广泛用于企业应用程序。 现在假设我们需要集成更具体的内容。

从CUBA Studio的2.1版开始,此过程已针对Vaadin,JavaScript和GWT组件进行了大幅简化,因为Studio脚手架存根并添加了新组件的所有必需定义。 新组件到平台的集成分为三个级别:

  1. 由于框架的通用UI是在Vaadin之上构建的,因此新组件可以作为本机Vaadin组件使用。 开发人员已经可以在CUBA应用程序中使用此组件,并将其添加到未包装的CUBA容器中。
  2. 新组件已集成到CUBA通用UI中。 在这种情况下,从应用程序开发人员的角度来看,它看起来与可视组件库中的标准组件相同。 开发人员可以在屏幕XML描述符中定义组件,也可以通过控制器中的ComponentsFactory创建组件
  3. 新组件在Studio组件面板上可用,并且可以在所见即所得布局编辑器中使用,如下图所示。

3

在本文中,我们将研究Vaadin组件的第一级集成,并创建一个示例应用程序,以了解在现阶段如何在您的CUBA应用程序中使用它。

整合Vaadin组件

如前所述,CUBA平台中的通用UI是基于Vaadin框架构建的,将其组件集成到CUBA应用程序中非常容易:

  1. 向第三方Vaadin附加工件添加依赖项。
  2. 在您的项目中创建Web-toolkit模块。 此模块包含GWT小部件集文件,并允许您创建视觉组件的客户端部分。 只需将附加控件集添加到项目的控件集即可。
  3. 如果组件的外观不适合应用程序主题,请创建主题扩展并为新组件定义一些CSS。

让我们以Stepper组件为例,看看它在CUBA Studio中是如何工作的:

第一步,我们单击Create web toolkit module ,以集成Vaadin组件,然后单击Create new UI组件

4

现在,距CUBA中新的Vaadin组件大约10分钟的路程:

  1. 在“ 组件类型”组框中选择“ Vaadin附加 组件 ”。
  2. 要定义Add-on Maven依赖关系值,请转到stepper插件页面 ,按Install绿色按钮,从出现的文本框中复制它,然后粘贴到CUBA Studio的Add-on Maven依赖项字段中。
    5
  3. 最棘手,最令人困惑的部分是Inherited Widgetset (对于那些初次使用Vaadin的用户而言) (您可以在此处了解有关Vaadin WidgetSets的更多信息,但是您并不需要真正了解它就可以继续进行此操作文章)。 在stepper附加页面的Related links部分中有一个Source code链接,单击它。 该链接将引导您到该组件的GitHub存储库 。 要定义Vaadin组件的小部件集,您需要在源代码中找到* .gwt.xml文件。 继续至addon / src / main / resources文件夹。 在这里,您将看到包含StepperWidgetset.gwt.xml文件的org / vaadin / risto / stepper /小 部件 集 。 这足以构造我们的Inherited widgetset值: org.vaadin.risto.stepper.widgetset.StepperWidgetset 。 简而言之,它是在Java中作为导入类编写的* .gwt.xml文件的路径。
    6
  4. 现在取消选中“ 集成到通用UI”框,然后说“ 确定”
  5. Studio将显示通知“ Component created ”并重新构建项目,因为它需要向gradle构建脚本添加新的依赖关系,下载所需的库并重新编译widgetset。 因此,我们只需要等待几分钟,直到该过程完成。
  6. 最后,我们调整组件以适合我们的应用主题。

如果看一下源代码 ,我们可以看到该组件是SCSS样式的,因此我们需要将其样式添加到项目依赖项中。 为此,请转到“ 项目属性”部分,单击“ IDE” 。 IDE将显示build.gradle ,在其中应将主题(“ org.vaadin.addons:stepper:2.3.0”)行添加到configure(webModule)任务的依赖项子句中,如下图所示。

7

现在我们可以应用所需的样式。 转到“ 项目属性”部分,然后单击“ 创建主题扩展名” 。 选择halo作为默认值,然后单击Create 。 Studio将在应用程序的Web模块中添加themes / halo / halo-ext.scss文件,您可以在其中为新组件指定样式或修改现有组件的样式。 它还将在构建脚本中进行必要的更改,并为您的IDE重新创建项目文件。

8

在您的IDE中打开halo-ext.scss文件,并粘贴以下CSS,如下图所示:

…
@import "../VAADIN/addons/stepper/stepper";
…@include stepper;/* Basic styles for stepper inner textbox */.stepper input[type="text"] {@include box-defaults;@include valo-textfield-style;&:focus {@include valo-textfield-focus-style;}}
…

9

而已! 现在我们已经可以在CUBA应用程序中使用该组件了!

在您的CUBA应用程序中使用3rd Party Vaadin组件

最后,让我们用步进器创建一个屏幕。 由于我们仅完成了第一级集成,因此它仍然不是通用CUBA UI的一部分,因此无法直接在xml屏幕描述符中使用它,但是已经可以通过编程方式创建。

让我们开始吧:

  1. 从我们的网站下载 CUBA Studio,进行安装,启动CUBA Studio服务器,然后在浏览器中打开Studio。 如果您在此阶段遇到任何麻烦,请按照视频指南 (“快速入门”页面的第1部分)进行操作。
  2. 创建一个名为vaadin-component的项目。 Studio会自动命名项目名称空间和根包。
    10
  3. 请遵循整合Vaadin组件中的步骤
  4. 由于步骤3已完成,请转到Studio左侧面板中的屏幕部分,将重点放在Web模块项上,然后单击新建 。 Studio会提示您选择是要从头创建新屏幕还是扩展现有屏幕(例如,用户编辑器或“文件上传”对话框)。 我们将从头开始尝试新的屏幕。
  5. 现在,我们直接进入“ 布局”选项卡,在此处可以直观地设计屏幕。 我们需要使用一些容器,该容器将用作步进器的占位符。 在组件搜索字段中输入“ hbox ”,Studio会按名称过滤UI组件。 将HBox组件拖放到窗体或层次结构中
    11
  6. 右键单击位于可视表单布局中的组件表示形式; 或在“ 层次结构”部分中选择组件,然后切换到“ 属性”选项卡(在“组件面板”旁边)。

我们将需要使用屏幕控制器上的Hbox,以便能够通过控制器访问CUBA组件,我们需要定义其id 。 只需在ID字段中按右按钮,Studio就会自动生成一个ID。

另外,我们希望步进器的宽度为250px,因此我们为其容器指定此尺寸。

应用我们所做的所有更改。

12

  1. 启动您的IDE,转到屏幕设计的控制器选项卡,然后按IDE的Studio将生成的项目文件,并在IDE中打开屏幕控制器。
    13
  2. 移至IDE,Studio已经在其中安装了屏幕控制器。 让我们编码一下。 您需要添加的所有行均带有详细注释:
package com.company.vaadincomponent.web.screens;import com.haulmont.cuba.gui.vaadincomponent.AbstractWindow;
import com.haulmont.cuba.gui.vaadincomponent.HBoxLayout;
import com.vaadin.ui.Layout;
import org.vaadin.risto.stepper.DateStepper;import javax.inject.Inject;
import java.util.Map;public class Screen extends AbstractWindow {/* Getting access to the hbox component, using CUBA mechanism for UI components injection */@Injectprivate HBoxLayout hbox;/* Create stepper to be placed into the prepared hbox container */private DateStepper stepper = new DateStepper();/* Overriding init method, which will be called by the framework after creation of all components and before showing the screen */@Overridepublic void init(Map<String, Object> params) {super.init(params);/* Unwrapping hbox to get access to the native Vaadin layout to place stepper */Layout box = hbox.unwrap(Layout.class);/* Placing stepper component into the unwrapped hbox container */box.addComponent(stepper);/* Defining stepper size to fit 100% of the parent hbox component width */stepper.setWidth("100%");/* Adding listener to show notification when stepper value is changed */stepper.addValueChangeListener(event -> showNotification("Value has been changed to " + stepper.getValue(), NotificationType.HUMANIZED));}
}
  1. 要从应用程序的主菜单访问我们的屏幕,请转到Studio右侧面板的Main Menu(主菜单)部分,单击Edit(编辑),将焦点放在应用程序项上,然后按New(新建) 。 默认情况下,我们保留了步进器屏幕ID,因此,在下拉列表中找到屏幕值,然后按添加
    14
  2. 现在是启动应用程序并查看其全部工作方式的时候了。 按“ 播放 ”按钮,该按钮位于Studio主菜单的“ 构建”项目下方。 Studio会征得您的许可更新数据库,并同意。

当应用程序启动并运行时,您将在左下角看到localhost:8080 / app链接,单击它。

15

CUBA应用程序将在登录屏幕上与您会面,默认用户为admin ,您猜密码是多少? 只需按Submit 。 单击主菜单的“ 应用程序”->“屏幕”项,然后开始!

16

您可以在此处找到工作的步进器示例项目的源代码。

结论

最初,我将写一篇文章,介绍Vaadin,GWT和JavaScript组件的所有集成级别,但是正如您所看到的那样,一篇文章太过复杂了。 因此,下一次我将介绍JavaScript组件。

另外,我想承认该过程的某些部分可以大大简化甚至完全消除,但这是第一步,可以立即帮助用户使用很少使用但有时非常有用的小部件使我们的通用用户界面饱和。 因此,如果您有关于如何改进它的建议或想法,请在我们的论坛上与我们分享。

翻译自: https://www.javacodegeeks.com/2016/07/how-extensible-is-your-framework.html

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

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

相关文章

linux常用命令:touch 命令

linux的touch命令不常用&#xff0c;一般在使用make的时候可能会用到&#xff0c;用来修改文件时间戳&#xff0c;或者新建一个不存在的文件。 1&#xff0e;命令格式&#xff1a; touch [选项]... 文件... 2&#xff0e;命令参数&#xff1a; -a 或--timeatime或--timeacces…

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果&#xff08;转&#xff09; 版权声明&#xff1a;转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.com/logs/54217707.html 近日在为一个数据应用写数据输入界面&#xff0c;大量…

python-面向对象编程设计与开发

编程范式 1、对不同类型的任务&#xff0c;所采取不同的解决问题的思路。 2、编程范式有两种 1、面向过程编程 2、面向对象编程 面向过程编程 什么是面向过程编程&#xff1f; 过程——解决问题的步骤 要解决一个大的问题 1、先把大问题拆分成若干小问题或子过程。 2、然后子过…

MFC下列表控件的使用

MFC下列表控件的使用 2012-11-09 16:46:57| 分类&#xff1a; 程序VC相关 | 标签&#xff1a; |字号大中小 订阅 1、应该加入头文件 #include <Atlbase.h>2、示例m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);m_lis…

jbehave_使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)

jbehave行为驱动开发 &#xff08;BDD&#xff09;是一个协作过程 &#xff0c;产品所有者&#xff0c;开发人员和测试人员可以合作交付可为业务带来价值的软件。 BDD是 测试驱动开发 &#xff08;TDD&#xff09; 的合理下一步 。 行为驱动的发展 本质上&#xff0c;BDD是一…

Confluence 6 考虑使用自定义 CSS

CSS 的知识储备 如果你没有有关 CSS 的相关知识&#xff0c;请参考页面 CSS Resources section 中的内容。当你打算开始对 Confluence 的样式表进行修改之前&#xff0c;你应该对 CSS 有一些相关的了解和知识储备。 安全 自定义 CSS 有可能被在页面中注入脚本&#xff0c;有跨…

MFC--CColorDialog的使用

MFC--CColorDialog的使用 2012-05-07 11:05:32| 分类&#xff1a; 学习mfc/c | 标签&#xff1a; |字号大中小 订阅 要在类中定义一个存储颜色的变量COLORREF m_color; 创建一个按钮&#xff0c;用来调用CColorDialog&#xff0c;用以改变静态文本的颜色&#xff0c;&a…

嵌入式 开发——DMA内存到外设

学习目标 加强理解DMA数据传输过程加强掌握DMA的初始化流程掌握DMA数据表查询理解源和目标的配置理解数据传输特点能够动态配置源数据学习内容 需求 串口发送数据 uint8_t data = 0x01; 串口发送(data); 实现串口的发送数据, 要求采用dma的方式 数据交互流程 CPU配置好DM…

使用Java第2部分查询DynamoDB项

在上一篇文章中&#xff0c;我们有机会发布了一些基本的DynamoDB查询操作。 但是&#xff0c;除了基本操作之外&#xff0c;DynamoDB api还为我们提供了一些额外的功能。 投影是具有类似选择功能的功能。 您选择应从DynamoDB项中提取哪些属性。 请记住&#xff0c;使用投影不…

XSS

1.什么是xss XSS攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意web用户将代码植入到提供给其它用户使用的页面中…

C++中引用传递与指针传递区别(进一步整理)

C中引用传递与指针传递区别&#xff08;进一步整理&#xff09; 博客分类&#xff1a; C/C CCC#J# 从概念上讲。指针从本质上讲就是存放变量地址的一个变量&#xff0c;在逻辑上是独立的&#xff0c;它可以被改变&#xff0c;包括其所指向的地址的改变和其指向的地址中所存放的…

Python之匿名函数

一、匿名函数&#xff1a;也叫lambda表达式 1.匿名函数的核心&#xff1a;一些简单的需要用函数去解决的问题&#xff0c;匿名函数的函数体只有一行 2.参数可以有多个&#xff0c;用逗号隔开 3.返回值和正常的函数一样可以是任意的数据类型 二、匿名函数练习 请把下面的函数转换…

C++中const用法总结

C中const用法总结 Posted on 2009-04-21 22:55 月光林地 阅读(7821) 评论(2) 编辑 收藏 1. const修饰普通变量和指针 const修饰变量&#xff0c;一般有两种写法&#xff1a; const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是&#xff1a;const修…

vaadin_5分钟内Google App Engine上的Vaadin App

vaadin在本教程中&#xff0c;您将学习如何创建第一个Vaadin Web应用程序&#xff0c;如何在本地AppEngine开发服务器上运行它以及如何将其部署到Google App Engine基础结构。 所有这些大约需要5到10分钟。 是的&#xff0c;如果您已经安装了必要的先决条件&#xff0c;则可以立…

【Java深入研究】10、红黑树

一、红黑树介绍 红黑树是二叉查找树&#xff0c;红黑树的时间复杂度为: O(lgn) 红黑树的特性&#xff1a;&#xff08;1&#xff09;每个节点或者是黑色&#xff0c;或者是红色。&#xff08;2&#xff09;根节点是黑色。&#xff08;3&#xff09;每个叶子节点&#xff08;NIL…

MATLAB排序函数

MATLAB排序函数 (2011-06-29 13:02:08) 源自网络 sort(A)若A是向量不管是列还是行向量&#xff0c;默认都是对A进行升序排列。sort(A)是默认的升序&#xff0c;而sort(A,descend)是降序排序。 sort(A)若A是矩阵&#xff0c;默认对A的各列进行升序排列 sort(A,dim) dim1时等效s…

【分形】【洛谷P1498】

https://www.luogu.org/problemnew/show/P1498 题目描述 自从到了南蛮之地&#xff0c;孔明不仅把孟获收拾的服服帖帖&#xff0c;而且还发现了不少少数民族的智慧&#xff0c;他发现少数民族的图腾往往有着一种分形的效果&#xff0c;在得到了酋长的传授后&#xff0c;孔明掌握…

Java认证:认证或不认证

专业认证始终是一个有争议的主题&#xff0c;有资格的人在争论收益与成本/时间之间的关系。 通过Oracle的Java认证&#xff0c;我认为有两个主要的受众可以从中受益&#xff1a; 那些开始从事软件事业的人。 扎实的工作经验和可证明的代码将永远是潜在雇主的首要考虑因素。 但…

linux下杀死进程全权讲解

linux下杀死进程全权讲解 2009-10-27 08:57 佚名 linux 我要评论(0) 字号&#xff1a;T | T本文将详细讲解linux杀死进程的多种命令&#xff0c;包含他们的作用&#xff0c;kill作用&#xff1a;根据进程号杀死进程&#xff1b; killall作用&#xff1a;通过程序的名字&#xf…

python学习笔记(10)--组合数据类型(序列类型)

序列是具有先后关系的一组数据&#xff0c;是一维元素向量&#xff0c;元素类型可以不同&#xff0c;类似数学元素序列&#xff0c;元素间由序号引导&#xff0c;通过下标访问序列的特定元素。序列类型是一个基类类型&#xff0c;字符串类型&#xff0c;元祖类型&#xff0c;列…