在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,一经查实,立即删除!

相关文章

python如何读取数据保存为新格式_python,初学者应用实例:读取文件中的数据,将将北京时间转换成世界时间,再保存成新的CSV格式文件...

数据格式转换是科研工作中经常需要完成的任务。本程序实现了这个功能。将文本文件“TableS1.dat”中的数据读取&#xff0c;原文件格式为&#xff1a; No Date Time Mag Dis 11999/07/2505:28:39.580 21999/07/2523:06:31.940 31999/08/0601:54:40.6001.012.5 41999/08/1708:01…

哈工大三本计算机考研,纯干货【普通三本逆袭哈工大】—城市规划考研必胜经验...

【专业课】楼主就想起来什么就总结点什么吧&#xff0c;你们就知足吧&#xff01;话说专业课是你相对来说比较吃亏的一科目(与本校学生相比较)&#xff0c;为什么说吃亏呢&#xff1f;No.1&#xff1a;人家本校都学过&#xff0c;至少知道每门课的知识点是什么&#xff0c;每个…

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;提出如下实施意见&#xff1a;一、学生必须严格按照修读课程计划表按时上课&#xff0c;不得迟到或…

java8的新特性_Java8的

java8的新特性Java8没有安排释放&#xff0c;直到2014年3月&#xff0c;但早期发行版本已经可用了一段时间。 一些最有趣的新功能是&#xff1a; 流 功能接口 默认方法 Lambdas Java时间 流 新的java.util.stream软件包包含“支持元素流上的功能样式操作的类”。 流不是一…

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

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

计算机新入学教案,计算机应用 新教案(1-6周).doc

计算机应用 新教案(1-6周)广州康大职业技术学院《计算机应用基础》课程教案计算机系(部) 教师曹丽萍&#xff1a;使 用 年 月 日周次班 次星期节 次教案编号12013-2-26一12经贸1班二1-22012-2-27一12经贸1班三3-4 学习内容第1章 计算机基础知识课时4教学目标专业能力1、了解计算…

python集合用法_Python 集合(Set)

集合 集合是无序、无索引的数据集。在Python中&#xff0c;集合用花括号包裹。 示例 创建集合: thisset {"自行车", "汽车", "高铁"} print(thisset) 注意: 集合是无序的&#xff0c;因此项目将以随机顺序出现。 访问集合项目 不能通过索引来访…

记录更新(Java数据类)

最近几个月&#xff0c;有一些与“ Java数据类”&#xff08;又称为“记录”&#xff09;有关的更新。 正如我在“ JavaFX&#xff0c;Valhalla&#xff0c;数据类和Java的浮点更新 ”一文中简短提到的那样&#xff0c; Brian Goetz的“ Java数据类 ”“探讨了Java语言中数据类…

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

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

计算机类和鼠标类是什么关系,电脑自己关机和鼠标键盘有关系吗

都是新版QQ惹的祸,用USB键盘的都会出现这个问题.1、找到QQ的安装目录&#xff0c;方法如下&#xff1a;在桌面上找到QQ图标&#xff0c;用鼠标右键点击图标&#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;爸…

euclidea教程_Euclidea

Euclidea作者&#xff1a;Fegeek56次浏览2019-10-13 12:42:02分享Euclidea is a FUN & CHALLENGING Way to Create Euclidian Constructions!> 127 Levels: from very easy to really hard> 11 Tutorials> 10 Innovative Tools> "Explore" Mode and …

信息技术与计算机文化的问题,信息技术与计算机文化

第一章 信息技术与计算机文化1信息&#xff1a;是指自然界、人类活动和人类思维活动中普遍存在的一切物质和事物的属性(在计算机上以数据形式存储)2数据&#xff1a;存储在某种媒体上加以鉴别的符号资料(在计算机以二进制形式存储)3文件&#xff1a;存储在外存上的一组相关信息…

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;尤其是线性代数常与枯燥、复杂和毫无意义的事物联系起来。不过你还可以另辟蹊径。…