当前位置: 首页 > article >正文

【Vaadin flow 实战】第2讲-深入理解vaadin flow技术路线原理

vaadin flow技术路线揭秘

什么是flow

Vaadin Flow是一个允许开发人员完全用Java编写Web应用程序的框架。与编写HTML、CSS和JavaScript不同,用户界面是由Java中的UI组件构建的–类似于Swing和JavaFX。HTML代码、CSS样式表和JavaBean仍然存在,并且在需要时可以访问:它们被抽象在一个丰富的Java API后面。

Flow充当浏览器中HTML元素的远程控制。这些HTML元素可以是简单的div元素,也可以是更复杂的元素,如vaadin-grid Web组件。流控制属性、特性及其子项。它甚至可以执行自定义的JavaScript调用。

在服务器端,有开发人员与之交互的相应Java对象。Flow处理服务器端的Java对象和客户端的HTML元素。

flow是如何加载的

从浏览器加载的初始HTML代码只包含一些静态占位符元素沿着Flow的客户端呈现引擎脚本。此脚本获取初始视图的呈现指令。服务器以JSON格式发送指令。客户端呈现引擎解释这些指令,并在浏览器中构建或更新DOM树。

对事件做出反应

当你添加一个带有服务器端点击监听器的Vaadin Button到你的UI中时,Flow会在浏览器中创建一个带有DOM事件监听器的对应的vaadin-button元素。当用户单击该按钮时,Flow从事件中提取相关信息,并在HTTP POST请求中将其发送到服务器。框架的服务器端部分查找相应的Button对象,并调用已添加到其中的所有单击侦听器

更新UI

一旦点击监听器被调用,框架就会收集对服务器端组件所做的所有更改。从那里,它创建了一个新的JSON对象与渲染指令。此JSON对象作为对最初传递单击事件的HTTP POST请求的响应发送。客户端呈现引擎解释这些指令并更新浏览器中的DOM树。

路由导航

当用户单击浏览器中的链接时,Flow的客户端路由器会拦截单击事件,并阻止浏览器执行加载新页面的默认操作。相反,Flow将事件发送到服务器,由Flow的服务器端路由器处理。服务器端路由器查找对应于新视图的Java类,实例化它,并将它添加到服务器端组件树中,以代替先前的视图。由于服务器端组件树随后发生了更改,因此将带有渲染指令的新JSON对象发送回浏览器,客户端渲染引擎在浏览器中更新DOM树。

滚动和延迟加载

不仅点击从浏览器发送到服务器。Vaadin Grid组件支持延迟加载。当用户滚动网格时,会从服务器加载更多的数据。浏览器中有一个JavaScript回调函数,当网格数据用完时会调用它。这个回调向服务器端的Grid对象发送一条消息,该对象又调用其服务器端的数据提供程序来加载更多的项。
这个更新操作不能通过操作DOM树来完成。相反,客户端数据提供程序有一个函数,需要在新数据可用时调用。一旦服务器加载了这些项,它们就被转换为自定义的JavaScript函数调用。此函数调用将成为服务器发送回浏览器的JSON响应中的指令。然后,客户端呈现引擎解释该指令并调用JavaScript函数,让客户端数据提供程序知道有新的项可用。

vaadin flow运行逻辑

Vaadin Flow允许服务器端Java应用程序从Java组件构建用户界面。这些Java组件连接到浏览器中运行的Web组件。流管理用户交互返回到服务器端应用程序的中继,服务器端应用程序可以使用事件侦听器处理用户交互。

应用程序视图及其组件通常用于显示和接受应用程序数据的输入。这些数据通常存储在后端服务中,例如数据库。应用程序逻辑通常使用应用程序框架(如Spring)创建。

一图胜千言,vaadin flow技术架构图如下
在这里插入图片描述

vaadin flow的基本特性包括:

  • 一个让你专注于UI的架构。不需要考虑客户端和服务器之间的通信。
  • 一组高质量的UI组件,专注于最终用户和开发人员的体验。
  • 强大的抽象层,可以使用Java或HTML模板构建自己的可重用UI组件。
  • 数据绑定API,使用类型安全的Java将UI组件连接到任何后端。
  • 路由器API,用于创建分层页面结构供用户导航。

案例:例如,您可以在Java中创建一个UI,如下所示:

// Create an HTML element
Div layout = new Div();

// Use TextField for standard text input
TextField textField = new TextField("Your name");

// Button click listeners can be defined as lambda expressions
Button button = new Button("Say hello",
          e -> Notification.show("Hello!"));

// Add the web components to the HTML element
layout.add(textField, button);

使用Flow Java API时,组件控制浏览器中的JavaScript对应组件。您不需要了解任何关于HTML或JavaScript的知识。

在springboot中的效果如下

package com.example.application.views.helloworld;

import com.vaadin.flow.component.Key;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.Menu;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import org.vaadin.lineawesome.LineAwesomeIconUrl;

@PageTitle("Hello World")
@Route("hello-world")
@Menu(order = 1, icon = LineAwesomeIconUrl.GLOBE_SOLID)
public class HelloWorldView extends HorizontalLayout {

    private TextField name;
    private Button sayHello;

    public HelloWorldView() {
        name = new TextField("Your name");
        sayHello = new Button("Say hello");
        sayHello.addClickListener(e -> {
            Notification.show("Hello " + name.getValue());
        });
        sayHello.addClickShortcut(Key.ENTER);

        setMargin(true);
        setVerticalComponentAlignment(Alignment.END, name, sayHello);

        add(name, sayHello);
    }

}

在这里插入图片描述


http://www.kler.cn/a/468944.html

相关文章:

  • Element-UI:如何实现表格组件el-table多选场景下根据数据对某一行进行禁止被选中?
  • 移动端自动化测试Appium-java
  • Linux安全防火墙(iptables)配置策略
  • GitLab 创建项目、删除项目
  • 牛客网刷题 ——C语言初阶(6指针)——字符逆序
  • 如何利用PHP爬虫按关键字搜索淘宝商品
  • TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
  • 产品线上交付阶段出现的两次显著Bug分析
  • css 关于flex布局中子元素的属性flex
  • 服务器开发 的设计模式(Design Patterns)核心知识
  • 出现 Error during query execution: StatementCallback; bad SQL grammar 解决方法
  • windows C#-确定字符串是否表示数值
  • 【信息系统项目管理师】高分论文:论信息系统项目的风险管理(资金管控系统)
  • Go语言的 的集合框架(Collections Framework)基础知识
  • 网络安全【C10-2024.10.1】-sql注入基础
  • Oracle DG备库数据文件损坏修复方法(ORA-01578/ORA-01110)
  • 【人工智能数据科学与数据处理】——深入详解大数据与数据库技术之非关系型数据库:MongoDB 的关键概念、核心原理、示例及主要应用
  • 使用Python构建智能医疗诊断系统
  • 解决sublime编译无法输入问题
  • PDF2Audio - 阅读 PDF 的新方式
  • 【工具整理】WIN换MAC机器使用工具整理
  • vue数据请求通用方案:axios的options都有哪些值
  • 《计算机网络A》单选题(详解)
  • 2、蓝牙打印机点灯-GPIO输出控制
  • AdaBoost算法详解与PyTorch实现
  • STM32CUBEMX+PLS_D1000激光测距模块+MT6701角度传感器,获取三角形第三边长度