在Spring Boot中使用Vaadin的简介

介绍

Vaadin的工作方式依赖于服务器端渲染,因此可以自然地集成到诸如Spring之类的框架中。 Vaadin的Spring集成已经存在了一段时间,并且提供了用于在Spring容器中配置和管理Vaadin的工具,如果您希望将Vaadin与Spring Boot结合使用,那么您会很幸运,因为Vaadin的人已经做了创建可以自动配置几乎所有内容的启动程序的工作,以便您可以在几秒钟内启动并运行一个简单的UI。 在本文中,我们将简要介绍如何在Spring boot中使用Vaadin。

设定

创建Spring引导应用程序的最佳方法是使用Spring Initializr 。 我们将检查Vaadin以及其他标准的Spring起动器,例如Web和Security,然后单击“ Generate Project”。

要在上下文路径的根部创建视图,只需创建一个扩展UI的类并使用@SpringUI进行批注就@SpringUI

@SpringUI
public class Main extends UI {@Overrideprotected void init(VaadinRequest vaadinRequest) {setContent(new Label("Hello"));}
}

如果要使用的路径与根目录不同,则可以使用path属性: @SpringUI(path="/app")

用户界面和视图

Vaadin的用户界面概念类似于SPA(单页应用程序)的概念。 UI类被视为多个视图的根容器。 视图可以看作是UI的特定状态。 一个应用程序可以具有多个UI类,但是建议使用一个具有多个视图的UI ,因为它效率更高。 借助Navigator ,可以在不离开页面或UI情况下从一个视图配置到另一个视图。 要创建一个View ,我们只需要实现视图接口并用@SpringView对其进行注释,或者如果范围(我们将在以后讨论视图范围)不是很重要,那么任何Spring注入注释都可以工作:

@SpringView
public class Add extends Composite implements View {@PostConstructpublic void init() {setCompositionRoot(new Label("I am a view"));}
}

我们在这里使用了带有@PostConstructinit()方法,以确保Spring已完成注入任何字段(如果有的话)。 如果没有注入的字段,也可以使用构造函数。

Vaadin是一个完全成熟的框架,具有开发人员可以选择的多种组件 (布局,图表,网格..)。 它还提供了创建自定义组件的可能性。 例如,我们要创建一个汽车收集应用程序,以允许输入和列出汽车模型:

添加视图:

@SpringView
public class Add extends Composite implements View {@AutowiredCarRepository repository;@AutowiredDataProvider dataProvider;@PostConstructpublic void init() {FormLayout formLayout = new FormLayout();Label title = new Label("Add new Car");TextField brandInput = new TextField("Brand: ");TextField modelInput = new TextField("Model: ");TextField pictureLinkInput = new TextField("Picture Link: ");Button button = new Button("Add", clickEvent -> {repository.save(new Car(brandInput.getValue(), modelInput.getValue(), pictureLinkInput.getValue()));Notification.show("saved");});formLayout.addComponent(title);formLayout.addComponent(brandInput);formLayout.addComponent(modelInput);formLayout.addComponent(pictureLinkInput);formLayout.addComponent(button);setCompositionRoot(formLayout);}
}

列表视图:

@SpringView
public class List extends Composite implements View {@AutowiredCarRepository repository;@AutowiredDataProvider dataProvider;@PostConstructpublic void init() {Grid<Car> carGrid = new Grid<>();carGrid.setWidth("100%");carGrid.setHeight("100%");carGrid.setDataProvider(dataProvider);carGrid.addColumn(Car::getId).setCaption("Id");carGrid.addColumn(Car::getBrand).setCaption("Brand");carGrid.addColumn(Car::getModel).setCaption("Model");carGrid.addColumn((ValueProvider<Car, Object>) car -> new ExternalResource(car.getPictureLink())).setCaption("Picture").setRenderer(new ImageRenderer()).setResizable(true);setCompositionRoot(carGrid);setSizeFull();}
}

主界面:

@SpringUI(path="app")
@StyleSheet({"http://localhost:8080/styles.css"})
public class Main extends UI {@AutowiredAdd addView;@AutowiredList listView;@Overrideprotected void init(VaadinRequest vaadinRequest) {HorizontalLayout rootLayout = new HorizontalLayout();rootLayout.setSizeFull();HorizontalLayout mainarea = new HorizontalLayout();mainarea.setWidth("80%");Navigator navigator = new Navigator(this, mainarea);navigator.addView("", addView);navigator.addView("add", addView);navigator.addView("list", listView);CssLayout sideNav = new CssLayout();sideNav.setSizeFull();sideNav.addStyleName("sidenav");sideNav.setId("sideNav");sideNav.setWidth("20%");Button link1 = new Button("Add", e -> navigator.navigateTo("add"));link1.addStyleNames(BUTTON_LINK, MENU_ITEM);Button link2 = new Button("List", e -> navigator.navigateTo("list"));link2.addStyleNames(BUTTON_LINK, MENU_ITEM);sideNav.addComponent(link1);sideNav.addComponent(link2);rootLayout.addComponent(sideNav);rootLayout.addComponent(mainarea);setContent(rootLayout);}
}

我们创建了两个视图:一个用于添加汽车的表单和一个用于显示汽车的网格。 UI类使用navigator将两个视图连接起来。 用户界面由两部分组成:侧面导航栏(带有指向视图的链接)和主要区域(可变部分)。 我们已经将navigator配置为仅在主区域中调度视图,并配置了前往每个视图的路由:

Navigator navigator = new Navigator(this, mainarea);navigator.addView("", addView);navigator.addView("add", addView);navigator.addView("list", listView);

拥有默认的""空路由很重要,因为通常在启动时未设置该路由。 由于Vaadin使用自己的主题和样式表,因此@StyleSheet批注会很方便地引入自定义样式。 我们的视图和UI已连接到Spring容器,因此可以注入任何Spring bean。 例如,我们注入了CarRepository ,它是一个JpaRepository用于对Car实体执行数据库操作。

安全

Vaadin使用自己的CSRF令牌,因此,如果使用Spring Security,则应禁用Spring CSRF机制以使应用程序正常运行。 最低安全配置如下所示:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/app**").authenticated().and().formLogin().and().csrf().disable();}
}

包起来

Vaadin可以看作是使用Spring Boot后端快速创建UI的替代方法。 Vaadin一开始可能很容易建立,但是当复杂度增加时,学习曲线似乎并不那么平滑。 使用Vaadin(不仅使用Spring)时可能会注意到的另一个缺点是,每次进行更改时都必须重新启动整个应用程序(通常需要一段时间才能启动Spring Container),这导致需要设置HotSwap或类似的工具,无需重新启动应用程序即可热重载代码。

  • 源代码: https : //github.com/zak905/vaadin-spring-boot

翻译自: https://www.javacodegeeks.com/2018/05/introduction-to-using-vaadin-in-spring-boot.html

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

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

相关文章

excel转las文件_这3种Word、Excel格式不变的互转方法,实在太好用了

日常工作中用Word写总结、写报告&#xff0c;写分析&#xff0c;一定离不开数据支持。但在制作的过程中你一定碰到过这些问题&#xff1a;Excel里做的表格、图表&#xff0c;一复制到word就变的乱七八糟&#xff01;那么&#xff0c;有没有什么好的方法&#xff0c;即省时&…

stm32编码器正反转计数程序_光电编码器接线图分析

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。光电编码器如果按信号原理来分类的话&#xff0c;可以分为增量型编码器和绝对型编码器。旋转编码器是一种光电式旋转测量装置&#xff0c;它将被测的角位移直接转换成数字信号…

jieba库词频统计_如何用python对《三国演义》、《红楼梦》等名著开展词云分析及字频统计、出场统计等工作。...

以下以《红楼梦》为例进行设计。在制作词云图及统计之前&#xff0c;需要下载python的几个库&#xff0c;wordcloud、jieba以及imageio等&#xff0c;我的操作系统为Windows10&#xff0c;IDE环境为idle&#xff0c;下载方式就直接搜索cmd&#xff0c;打开命令提示符窗口&#…

数学史思维导图_【学科活动】思维导图展风采,数学文化提素养——庆云县第四中学(北校区)四年级数学组活动小记...

思维无限 导我所想思维的火花跨越时空&#xff0c;照亮昨天、今天和明天。人类从茹毛饮血、采集狩猎到今天足不出户购遍全球&#xff0c;人工智能、大数据信息处理融入每个人的生活。这其中&#xff0c;最大的改变就是思维方式的改变。——题记思维导图又叫心智导图&#xff0c…

k2677场效应管参数引脚_共射极放大电路,场效应管放大电路,运算放大电路

电子技术、无线电维修及SMT电子制造工艺技术绝不是一门容易学好、短时间内就能够掌握的学科。这门学科所涉及的方方面面很多&#xff0c;各方面又相互联系&#xff0c;作为初学者&#xff0c;首先要在整体上了解、初步掌握它。无论是无线电爱好者还是维修技术人员&#xff0c;你…

加载类_JVM类加载详解

类的加载器概述类加载器是JVM执行类加载机制的前提。ClassLoader的作用&#xff1a;ClassLoader是Java的核心组件&#xff0c;所有的Class都是由ClassLoader进行加载的&#xff0c;ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部&#xff0c;转换为一个与目…

group by用法多个字段_select的用法

select的用法 --每个员工的所有信息 select * from emp; --每个人的部门编号&#xff0c;姓名&#xff0c;薪水 select empno, ename, sal from emp; --每个人的年薪 select ename, sal*12 from emp; --计算2*3的值 select 2*3 from emp; --计算2*3的值(dual) select 2*3 from …

计算机考试打字小作文,打字练习作文(通用5篇)

打字练习作文(通用5篇)导语&#xff1a;随着计算机在人们的生活中普及&#xff0c;敲键盘打字的速度就变成了人们努力的方向。下面是小编为大家整理的打字练习作文(通用5篇)&#xff0c;欢迎阅读&#xff0c;希望大家能够喜欢。打字练习作文 篇1今天过得有些无聊&#xff0c;爸…

eclipse创建pojo_使用Eclipse Hibernate插件逐步为POJO域Java类和hbm自动生成代码

eclipse创建pojo概述&#xff1a; 在本教程中&#xff0c;我们将使用Eclipse Hibernate工具自动生成域对象和相应的hbm xml文件。 如果您正在处理大型或中型项目&#xff0c;并且开始时有超过5个以上的表&#xff0c;那么您可能会发现此插件是自动生成映射域对象java文件和相应…

c语言中x的n次方怎么表示_线性代数的本质及其在AI中的应用

线性代数是 AI 专家必须掌握的知识&#xff0c;这已不再是个秘密。如果不掌握应用数学这个领域&#xff0c;你永远就只能是「门外汉」。当然&#xff0c;学习线性代数道阻且长。数学&#xff0c;尤其是线性代数常与枯燥、复杂和毫无意义的事物联系起来。不过你还可以另辟蹊径。…

解码base64_linux C++ Base64编解码

Base64的由来目前Base64已经成为网络上常见的传输8Bit字节代码的编码方式之一。在做支付系统时&#xff0c;系统之间的报文交互都需要使用Base64对明文进行转码&#xff0c;然后再进行签名或加密&#xff0c;之后再进行&#xff08;或再次Base64&#xff09;传输。那么&#xf…

java的for循环取出数据只是拿到最后一个_新兴大数据分析榆中百合

新兴大数据分析榆中百合大数据流程从流程角度上看&#xff0c;整个大数据处理可分成4个主要步骤。处理流程图分为三层(数据采集层&#xff0c;数据存储与计算处理层&#xff0c;数据可视化)&#xff1a;表2-1 系统环境系统版本Windows 10专业版(建议)LinuxCentOS 6.8 or CentO…

c++冒泡排序代码_【开源推荐】数据结构和算法必知必会的50个代码实现

最近GitHub上发现了个非常不错的项目&#xff0c;目前star 4000&#xff0c;项目主要讲数据结构和算法&#xff0c;有多种语言 50个代码实现。实现语言有c&#xff0c;c#&#xff0c;go&#xff0c;java&#xff0c;javascript&#xff0c;object-c&#xff0c;python&#xff…

android 抽屉_Android Studio之路,我们来了解一下Google官方Android开发工具

记得我的第一篇博客就是写Android Studio,但是现在看来还是有些粗糙了&#xff0c;所有重构了一下思路&#xff0c;覆写了一篇Google主推-Android开发利器——Android Studio&#xff0c;这可能是最全的AS教程&#xff01;Android Studio,自Google2013年发布以来&#xff0c;就…

karaf osgi_在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合

karaf osgi请查看我在Karaf的OSGi中构建普通CXF服务&#xff08;无Camel&#xff09;的其他文章 。 这是有关如何 创建一个CXF REST服务 使用骆驼多播&#xff08;并并行化&#xff09;传入的请求 来自两个不同服务的源数据 汇总响应并 最后将合并结果作为JSON返回给最终…

酒店wifi代理服务器没有响应,wn10连接酒店wifi的登录界面无法弹出如何处理

通常情况下&#xff0c;我们在连接酒店wifi后都会出现登录验证界面。不过&#xff0c;最近一位windows10系统用户在连接wifi后打开网页却遇到无法显示登陆界面情况&#xff0c;该怎么办呢&#xff1f;接下来&#xff0c;就随小编一起看看wn10连接酒店wifi的登录界面无法弹出问题…

python词云安装什么库_python词云安装什么库

python词云需要安装wordcloud库。 安装方法&#xff1a; 在cmd使用pip install wordcloud命令即可安装。 wordcloud库把词云当作一个WordCloud对象&#xff1a;wordcloud.WordCloud()代表一个文本对应的词云。 可以根据文本中词语出现的频率等参数绘制词云。 示例&#xff1a;f…

怎么wps解除合并单元格_wps表格怎么锁定单元格

wps表格怎么锁定单元格呢&#xff1f;很多用户对此还不是很清楚&#xff0c;小编这里就给大家带来有关wps表格怎么锁定单元格的回答&#xff0c;希望能够对大家有所帮助。一、整个表格进行锁定1、同时按住CtrlA&#xff0c;选中整个单元格&#xff0c;如图2、选中以后&#xff…

挡土墙计算软件_广联达软件如何计算钢板止水带?

原创作者&#xff1a;张向荣1、什么是钢板止水带&#xff1f;混凝土结构中&#xff0c;地下室墙体施工中&#xff0c;如果底板和墙体分开浇筑&#xff0c;就需要留置施工缝。施工缝&#xff1a;施工缝并不是一种真实存在的“缝”&#xff0c;它只是因先浇筑混凝土超过初凝时间&…

网站图片多服务器选多大,网站上的图片一般多大合适

网站上的图片一般多大合适 内容精选换一换安装了SSL证书后&#xff0c;访问网站时&#xff0c;HTTPS比HTTP要多几次握手的时间&#xff0c;HTTPS协议握手阶段比较费时&#xff0c;同时还要进行RSA校验&#xff0c;因此使用了SSL证书后&#xff0c;相较于HTTP访问&#xff0c;访…