spring vaadin_在Spring Boot中使用Vaadin的简介

spring 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将两个视图连接起来。 UI由两部分组成:侧面导航栏(带有指向视图的链接)和主要区域(可变部分)。 我们已将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

spring vaadin

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

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

相关文章

vue中生产模式和调试模式_为什么在生产中进行调试是如此诱人?

vue中生产模式和调试模式生产调试 为什么在生产中进行调试是如此诱人&#xff1f; 在我的第一份工作中&#xff0c;我要做的任务之一是修复一个错误&#xff0c;该错误过去在非常复杂的生产系统中有时会发生。 那很简单&#xff01; - 我想。 我将在开发环境中重现同样的情况&a…

IntelliJ IDEA for Mac在MacOS模式下的编译和运行快捷键(Compile and Run Shortcut)

快捷键快捷键符号英文名称功能说明Command F9⌘F9Make project编译ProjectCommand Shift F9⌘⇧F9Compile selected file, package or module编译选择的文件、包或模块Control Option R⌃⌥RSelect configuration and run弹出 Run 的可选择菜单Control Option D⌃⌥DSel…

android基础知识

第07节 ListView 1.当我们的程序中有大量的数据需要展示的时候&#xff0c;就可以借助 ListView 来实现。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内&#xff0c;同时屏幕上原有的数据则会滚动出屏幕。 ListView 的简单用法 1.listView数据的添…

apache derby_Apache Derby数据库用户和权限

apache derby抽象 Apache Derby很棒&#xff01; 尤其是在微服务环境中&#xff0c;服务的数据&#xff08;可能&#xff09;会缩减&#xff0c;并且不需要强大的RDBMS。 Derby很棒&#xff0c;因为它非常易于使用&#xff0c;特别是在涉及用户和权限时&#xff0c;您不需要任何…

IntelliJ IDEA for Mac在MacOS模式下的版本控制/本地历史记录快捷键(VCS and Local History Shortcut)

快捷键快捷键符号英文名称功能说明Command K⌘KCommit project to VCS提交代码到版本控制器Command T⌘TUpdate project from VCS从版本控制器更新代码CommandShiftK⌘⇧KPush commits推送提交&#xff0c;有问题OptionCommandK⌥⌘KPush commits推送提交Control V⌃V‘VCS’…

nutshell_Nutshell中的Java 8语言功能-第1部分

nutshell你好朋友&#xff0c; Java 8发布已经很长时间了&#xff0c;现在越来越多地被使用。 在本文中&#xff0c;我们将讨论以下Java 8主题。 1.功能接口 2.Lambda表达式 3.默认方法 1.功能界面 什么是功能接口&#xff1f; 与一种并且只有一种抽象方法的接口是功能接口…

windows server 2008 R2 命令行的方式创建用户、设置密码

一、使用命令行的方式创建用户、设置密码 &#xff08;1&#xff09;标准格式&#xff1a; net user username password / add 例如&#xff1a;建立一个名为lijunxuan、密码为Abc_123的用户 net user lijunxuan Abc_123 /add 二、使用命令行修改旧帐户的密码 &#xff…

IntelliJ IDEA for Mac的快速切换当前主题方案(Quick switch current scheme)

文章目录一、配色方案 &#xff08;Color Scheme&#xff09;二、代码样式方案&#xff08;Code Style Scheme&#xff09;三、键映射表&#xff0c;即快捷键方案&#xff08;Keymap&#xff09;四、视图模式/查看模式/显示模式&#xff08;View Mode&#xff09;五、界面外观&…

jpa避免n+1_JPA技巧:避免N + 1选择问题

jpa避免n1介绍 像JPA这样的ORM框架通过帮助我们在对象<->关系数据映射期间避免了很多样板代码&#xff0c;从而简化了我们的开发过程。 但是&#xff0c;它们还给表带来了一些其他问题&#xff0c;N 1是其中之一。 在本文中&#xff0c;我们将简要介绍该问题以及避免这些…

Windows server 2008 基础知识

1、Windows server 2008 安装形式 (1、Virtual (2、Hyper-V (3、VMware 2、对于虚拟内存的大小&#xff0c;建议为实际内存的1.5倍 3、在Windows server 2008系统中安装活动目录的命令是DCPROMO。活动目录存放在域控制器中 4、Windows server 2008支持的两种用户账户&…

Paint X for Mac的用法

文章目录快捷键图形界面介绍快捷键 快捷键说明Command A抓手Command S另存为Command T设置字体Option Command C设置画布大小 Canvas SizeOption Command I设置图像大小 Image SizeShift Command V垂直翻转 Flip VerticalShift Command H水平翻转 Flip HorizontalC…

IntelliJ IDEA for Mac如何替换文件内容中指定的关键词

按下组合键 Shift R 打开替换对话框&#xff08;如下图所示&#xff09;&#xff0c;在对话框中有两个输入框&#xff0c;上面的输入框中输入被替换的关键词&#xff0c;会在指定的范围内查找被替换的关键词&#xff0c;接着在下面的输入框中输入替换的关键词&#xff0c;然后…

海域动态监视监测管理系统_监视和管理备份系统

海域动态监视监测管理系统上一次我们建立一个强大的备份系统时 &#xff0c;现在我们将研究如何监视备份集。 我们需要验证是否正确清理了备份集&#xff08;这称为删除策略&#xff09;&#xff0c;并且它们是一致的&#xff08;称为一致性策略&#xff09;。 备份集可以包含…

Thread 线程同步、线程状态

线程概念 线程&#xff08;英语&#xff1a;thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 一、多线程介绍 1.1创建线程类 Java中通过继承Thread类来创建并启动多线程的步骤如下&#xff1a; 1.定义Thr…

jsp过滤器示例_Java 8过滤器,地图,收集和流示例

jsp过滤器示例大家好&#xff0c;许多读者给我发了电子邮件&#xff0c;写了一篇有关Java 8的地图和过滤器功能的文章&#xff0c;因为他们发现它们难以理解和使用。 即使我以前同时写过有关map&#xff08;&#xff09;和filter&#xff08;&#xff09;的博客&#xff0c;我仍…

IntelliJ IDEA for Mac如何使用单元测试Junit

文章目录测试分类Junit 使用步骤测试结果的判定常用的注解BeforeAfter测试分类 黑盒测试&#xff1a;不需要写代码&#xff0c;不需要关注程序执行具体逻辑和流程&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值 白盒测试&#xff1a;需要写代码&#xff0c;需要…

File类、递归、字节流

一、File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 public File(String pathname) &#xff1a;通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String …

java求期望_Java 11的期望

java求期望过去的几年对Java世界一直是动荡不安的&#xff0c;在相当多的发行版中添加了各种各样的功能。 在开发人员社区中&#xff0c;人们逐渐意识到Java的开发速度不够快。 在最初的20年中&#xff0c;Java平台和Java开发工具包&#xff08;JDK&#xff09;经历了庞大&…

IntelliJ IDEA for Mac 封装字段(添加setter/getter方法)

可以利用 IDEA 对类中的字段进行封装&#xff0c;所谓“字段封装”&#xff0c;就是指通过调用方法的方式来访问字段&#xff0c;而不是直接通过“对象.字段名”的方式去访问。 例如&#xff0c;成员变量 hairColor 是一个 public 的变量&#xff0c;没有相关的 setter/getter…

JDBC预处理对象prepareStatement

JDBC预处理对象prepareStatement概述 一、SQL注入问题 SQL注入&#xff1a;用户输入的内容作为了SQL语句语法的一部分&#xff0c;改变了原有SQL真正的意义。 假设有登录案例SQL语句如下: SELECT * FROM 用户表 WHERE NAME 用户输入的用户名 AND PASSWORD 用户输的密码; 此…