不会前端没事,用GWT Boot和Spring Boot构建Web程序

news/2024/5/21 1:15:53/文章来源:https://blog.csdn.net/weixin_40972073/article/details/129192687

本文介绍了一种使用Java构建Web应用程序的方式,其中GWT或者J2CL是必不可少的,另外还有多个UI框架可以配套使用,比如Domino UI、VueGWT、GWT Material Design (GMD),React4J、WebFX,还有一些活跃低的框架GWTBootstrap3、RedHat PatternFly for Java

开始之前先看下LOVE(Learn Once Vse Everywhere) 架构。

LOVE架构

1、Spring Boot Server: 提供服务端
2、Shared: 提供公共的API、接口、验证类或实体类等
3、Client: GWT Boot 是GWT的等效框架,就如同Spring Boot 和 Spring Framework

创建Spring Boot后端服务

使用Spring Initializr 创建Spring Boot项目。建立如下文件:
PersonController、PersonService、PersonRepository、Person实体

后端服务

源码地址:
https://github.com/gwtboot/intro-gwtboot-springboot/tree/main/intro-gwtboot-springboot-server

创建共享模块

共享服务,用于客户端和后端服务之间共享API、验证、异常类等,这里可以自己决定哪些类要共享。

共享的类、枚举和接口

由于GWT Boot 客户端需要使用源码编译成JavaScript,共享模块要使用Maven Source plugin导出共享模块源码包。

打包处理的共享模块

分离出共享模块后,将它作为依赖项添加到后端服务中。

另外我们创建一个“Module”.gwt.xml文件,用来转换共享模块的源代码,该文件声明了要转换的包目录,在该例中是shared包下的所有Java文件。

Person.gwt.xml

GWT Boot 客户端

这一部分是最有趣的部分,这里我们将使用DominoUI作为前端创建客户端。
使用GWT Boot Maven Archetype创建:

mvn archetype:generate -DarchetypeGroupId=com.github.gwtboot \-DarchetypeArtifactId=gwt-boot-ui-domino-dagger2-archetype \-DarchetypeVersion=1.0.0 \-DgroupId=com.company.crm \-DartifactId=intro-gwtboot-springboot-client \-Dversion=1.0.0-SNAPSHOT

生成的是一个Todo List 的应用程序,可以直接运行。

运行DominoUI

现在将上面创建的共享模块依赖和源码添加到该客户端模块中。

jar包和源码

随后在客户端模块module.gwt.xml中添加Person.gwt.xml文件

GWT Maven plugin 根据module.gwt.xml 创建真正的GMT 模块 App.gwt.xml

后面,我们开始对页面进行布局,将创建如下样式页面:

Web 布局

默认的DominoUI布局有:导航栏-1、2、3,左侧面板-4,中间面板-5,隐藏页脚-6和隐藏右侧面板。

DominoUI标准布局

可以使用removeLeftPanel方法删除左侧面板。

Layout layout = Layout.create(CONSTANTS.appTitle()).removeLeftPanel().show(Theme.BLUE);

现在考虑一下我们应该怎么用DominoUI来实现如下布局

为了创建这个UI视图,我们使用三个类:HomeClientBundle、HomeView和HomeComposite,它们是用MVP(Model View Presenter)模式设计的。

 PersonDto, HomeView 和 HomeComposite
HomeClientBundle:一个GWT客户端捆绑包,它将图像、CSS和JavaScript等多种资源组合到一个文件中,以便浏览器高效加载。

HomeView:此类负责创建整体布局和所有其他UI元素,这些元素将在presenter/composite中使用。

HomeComposite:此类处理表示逻辑,并根据PersonListGroup中的人数创建不同类型的对话框,如警告或错误对话框。

void handleCheckOkClick(PersonDto person) {personListGroup.removeItem(person);int size = personListGroup.getItems().size();if (size == 2) {createWarningDialog();} else if (size == 0) {createErrorDialog("Error on personListGroup is empty!");}donePersonListGroup.addItem(person);}

运行Web

1、模拟运行
首先转到客户端模块目录

mvn gwt:generate-module gwt:devmode -Pdevelopment-mock

mock 运行

可以修改代码后,立即在浏览器上看到转换后的JavaScript效果

2、使用server运行

-- 首先转到客户端模块目录
mvn gwt:generate-module gwt:devmode -- 客户端-- 首先转到服务端模块目录
mvn spring-boot:run -- 服务端

前端

服务端

部署Web

可以将客户端静态资源打包到Spring Boot static目录中,作为单体应用部署。

1、Client:使用 Maven Assembly plugin插件和distribution.xml文件,这会创建一个intro-gwtboot-springboot-client-1.0.0-SNAPSHOT-javascript.jar
2、Server:将打包出来的文件解压到static目录下,由于路径发生了变化,需要再server中创建一个index.html,内容如下

  <!-- All files in directory app, see screenshot below --><link type="text/css" rel="stylesheet" href="app/css/domino-ui.css"><link type="text/css" rel="stylesheet" href="app/css/themes/all-themes.css"><title>Demo GWT Webapp with DominoUI and Dagger2</title><script type="text/javascript" src="app/app.nocache.js" async=""></script>

解压缩后的JS文件和静态目录

使用如下命令运行:

-- 转到服务端模块目录
java -jar target/intro-gwtboot-springboot-server-1.0.0-SNAPSHOT.jar-- 使用该地址访问web应用
http://localhost:9090/intro/

单体应用部署

Server端包含client文件的流转机制

参考资料
[1] Domino UI: https://demo.dominokit.org/home
[2] VueGWT: https://vuegwt.github.io/vue-gwt/guide/#features
[3] GWT Material Design (GMD): https://gwtmaterialdesign.github.io/gmd-core-demo/
[4] React4J: https://react4j.github.io/
[5] WebFX: https://webfx.dev/
[6] GWTBootstrap3: https://github.com/treblereel/gwtbootstrap3
[7] RedHat PatternFly for Java: https://patternfly-java.github.io/showcase/#documentation:alert
[8] GWT Boot https://github.com/gwtboot

作者其他文章:
《Prometheus+Grafana 实践派》专栏火热更新中

  1. Grafana 的介绍和安装
  2. Grafana监控大屏配置参数介绍(一)
  3. Grafana监控大屏配置参数介绍(二)
  4. Grafana监控大屏可视化图表
  5. Grafana 查询数据和转换数据
  6. Grafana 告警模块介绍
  7. Grafana 告警接入飞书通知

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

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

相关文章

【解决报错】‘jupyter‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

在当前路径下使用cmd打开后&#xff0c;输入jupyter notebook出现如下错误&#xff1a; 通常可能出现的问题有两种&#xff1a; &#xff08;1&#xff09;你本身就没安装jupyter&#xff0c;如果你配置了anaconda&#xff0c;就自带jupyter&#xff0c;直接跳到问题2。如果确…

Apache Commons FileUpload Apache Tomcat拒绝服务漏洞解决方案

近日&#xff0c;安全狗应急响应中心关注到Apache官方发布安全公告&#xff0c;披露在Apache Commons FileUpload&#xff1c;1.5版本中存在一处拒绝服务漏洞&#xff08;CVE-2023-24998&#xff09;。Commons FileUpload是Apache组织提供的免费的上传组件。由于Apache Commons…

面向对象的一点小想法

接口里的方法可以写也可以不写 如果写的话&#xff0c;那么得是默认方法&#xff0c;需要在前面加个default 对于默认方法&#xff0c;能够重写&#xff0c;或者直接继承&#xff08;也就是直接用&#xff09; 比如下面&#xff1a; 就直接调用了接口的默认函数nibuhao&#…

R统计绘图-NMDS、环境因子拟合(线性和非线性)、多元统计(adonis2和ANOSIM)及绘图(双因素自定义图例)

这个推文也在电脑里待了快一年了&#xff0c;拖延症患者&#xff0c;今天终于把它发出来了。NMDS分析过程已经R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程中写过了。最近又重新看了《Numerical Ecology with R》一书,巩固一下知识&#xff0c;正好重新整理了一下发出…

Nacos源码启动

一、下载源码 为保证速度&#xff0c;国内推荐使用gitee&#xff1a;https://gitee.com/mirrors/Nacos.git 二、导入IDE中 参考之前文章配置国内Maven私服&#xff0c;快速更新工程。 三、启动过程&#xff0c;各种问题 找到启动入口&#xff1a; 先直接启动测试下&#xff…

oscp渗透测试认证该从哪里学起

当我决定要考OSCP时就马上打开浏览器&#xff0c;试图一下弄清楚课程内容和通过考试的方法&#xff0c;我不断的将指南和资源添加到书签中。渐渐的书签里存了许多资料&#xff0c;以至于我不知道从哪里开始学&#xff0c;学习命令吗&#xff1f;我学习编码吗&#xff1f;我使用…

北京/东莞/广州/深圳2023年上半年软考(中/高级)报名>>>

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

扩展学习之时间戳趣谈

目录 一、介绍 二、转换工具 三、获取Unix时间戳的指令 四、普通时间转Unix时间戳 五、扩展 一、介绍 时间戳&#xff1a;一份数据在特定时间点存在的可验证的数据。 Unix时间戳&#xff08;英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp&#xff09;&…

valgrind 移植到arm64 平台上总结

valgrind 介绍valgrind是查找内存泄漏的神器&#xff0c;你可以自动的检测许多内存管理和线程的bug&#xff0c;避免花费太多的时间在bug寻找上&#xff0c;使得你的程序更加稳固。 下载地址&#xff1a;https://valgrind.org/downloads/ 本人下载的是valgrind-3.19.0valgrind编…

.Net与程序集

一个简单的C#程序回想一下我们第一个.net 程序 hello world&#xff0c;它具有那些步骤呢&#xff1f;打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来&#xff0c;上面打印着hello world。我们打开文件夹的bin目录&#xff0c;会发现里…

百度前端一面高频react面试题指南

React 高阶组件、Render props、hooks 有什么区别&#xff0c;为什么要不断迭代 这三者是目前react解决代码复用的主要方式&#xff1a; 高阶组件&#xff08;HOC&#xff09;是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分&#xff0c;它是一…

(考研湖科大教书匠计算机网络)第六章应用层-第七节:万维网WWW

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;万维网概述二&#xff1a;万维网应用&#xff08;1&#xff09;URI和URLA&#xff1a;URI和URL关系B&#xff1a;URL格式&#xff08;2&#xff09…

selenium自动化测试用例需要关注的几点

自动化测试设计简介注&#xff1a;参看文章地址 我们在本章提供的信息&#xff0c;对自动化测试领域的新人和经验丰富的老手都是有用的。本篇中描述最常见的自动化测试类型&#xff0c; 还描述了可以增强您的自动化测试套件可维护性和扩展性的“设计模式”。还没有使用这些技术…

数学小课堂:数学的用途(黄金分割)

文章目录 引言I 黄金分割1.1 几何图形的相似性1.2 自然界的物理学特征(螺旋线)1.3 利用数学指导音乐II 使用几何学技术将绘画变得逼真2.1 单点透视法2.2 视觉的数学原理(透视的视觉效果)引言 黄金分割比例大约是1:0.618,也就是1.618。符合黄金比例的雕塑或建筑就看上去很顺…

软件项目管理知识回顾---软件项目风险管理

软件项目风险管理 7.风险管理 7.1风险管理 1.风险管理&#xff1a;贯穿在项目开发中的一系列的管理过程。 2.风险管理过程&#xff1a;风险识别&#xff0c;风险计划&#xff0c;风险解决和风险监控 3.PMP风险管理过程 风险管理计划风险识别风险定量分析风险定性分析风险监控7.…

上海亚商投顾:沪指窄幅震荡 ChatGPT概念股全线下挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数早盘小幅冲高&#xff0c;随后又震荡走低&#xff0c;午后一度集体翻绿&#xff0c;临近尾盘有所回升。Chat…

力扣79.单词搜索

文章目录力扣79.单词搜索题目描述方法一&#xff1a;回溯深搜力扣79.单词搜索 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#x…

Dokcer 数据卷

基本的概念数据卷就是宿主机上的一个文件或目录当容器目录和数据卷&#xff08;宿主机&#xff09;目录绑定&#xff0c;双方修改会立即同步操作一个数据卷可以被多个容器同时挂载数据卷作用&#xff1a;容器数据的持久化 外部机器和容器间接通信 容器之间数据交换使用 -v命令。…

Leetcode14. 最长公共前缀

一、题目描述&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;…

OpenFeign核心源码简读

目录 1、FeignClient注册逻辑 1.1、入口EnableFeignClients 1.2、FeignClientsRegistrar 1.2.1、registerBeanDefinitions 1.2.2、registerFeignClients 1.2.3、registerFeignClient 1.3、FeignClientFactoryBean 1.3.1、getObject -> getTarget 1.3.2、loadBalanc…