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

news2025/2/28 3:43:32

本文介绍了一种使用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.coloradmin.cn/o/405089.html

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

相关文章

2023前端面试题及答案整理(Vue)

watch 和 computed 区别 watch 是监听动作&#xff0c;computed 是计算属性watch 没缓存&#xff0c;只要数据变化就执行。computed 有缓存&#xff0c;只在属性变化的时候才去计算。watch 可以执行异步操作&#xff0c;而 computed 不能watch 常用于一个数据影响多个数据&…

Vue项目部署上线全过程(保姆级教程)

Vue项目部署上线全过程&#xff08;保姆级教程&#xff09; 上线前准备 1.先在vue.config.js文件中配置反向代理解决跨域请求问题 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: {proxy: {"…

web渗透测试学习路线

web渗透学习路线 文章目录*web渗透学习路线*前言一、web渗透测试是什么&#xff1f;二、web渗透步骤1.前期工作2.中期提高3.后期打牢总结前言 本文整理的学习路线&#xff0c;清晰明了&#xff0c;重点分明&#xff0c;能快速上手实践&#xff0c;相信想学的同学们都能轻松学完…

vue实现文件上传

这里使用的是vue2&#xff0c;ui用的是element ui &#xff0c;后期有时间会更新vue3版本的。前端文件上传使用的是ui框架中的Upload的图片列表缩略图&#xff0c;喜欢别的样式可以直接更改。看图注fileChange():方法可以直接获取到上传文件的状态及可以直接拿到图片的值可以新…

Redux中进行异步操作(网络请求)的方案

文章目录Redux中的异步操作组件中进行异步操作redux中进行异步操作Redux中的异步操作 在之前简单的案例中&#xff0c;redux中保存的counter是一个本地定义的数据 我们可以直接通过同步的操作来dispatch action&#xff0c;state就会被立即更新。 但是真实开发中&#xff0c;r…

Vue3 项目创建

安装 1、安装node vue 3需要node10以上版本 node官网下载地址以往的版本 | Node.js 2、安装vue/cli 如果已经全局安装过旧版本的vue-cli npm uninstall vue-cli -g //yarn global remove vue-cli 然后安装 npm install -g vue/cli //yarn global add vue/cli 为什…

使用vue,实现前端导入excel数据

文章目录 前言一、引入组件二、封装导入功能的组件 1.编写组件template2.获取数据3.调用接口把数据传给后端三、总结前言 继前边的vue的导出功能后&#xff0c;自己又去在网上搜了vue导入excel一些文章&#xff0c;自己通过对代码的整理和调整&#xff0c;实现了vue导入excel的…

Vue3报错:Property “xxx“ was accessed during render but is not defined on instance.

Vue3报错&#xff1a;Property “xxx” was accessed during render but is not defined on instance. 翻译&#xff1a;属性“xxx”在呈现期间被访问&#xff0c;但没有在实例上定义。 其实就是在模板上有&#xff0c;但是在script上没有定义 很多同学跟说这不是报错&#…

Vue2-基础知识

目录 一.vue简介 1.概念 2.特性 (1)数据驱动视图 (2)双向数据绑定 3.MVVM 4.基本使用步骤 5.调试工具 二.vue基础 1.指令 (1)内容渲染指令 (2)属性绑定指令 (3)事件绑定指令 (4)双向绑定指令 ​编辑(5)条件渲染指令 (6)列表渲染指令 2.过滤器 (1)概念 (2)分…

HTML5设计注册/登录界面

学习目标&#xff1a; 掌握 HTML5入门知识掌握 CSS入门知识学习内容&#xff1a; 掌握 HTML5基本语法掌握CSS基本语法HTML5网页设计掌握块级标签掌握行内标签表单的使用方法iput常用属性学习时间&#xff1a; 周一至周五早上 7 点—晚上9点周六上午 9 点-晚上9点周日下午 3 …

Redux的基本使用过程详解

文章目录Redux的使用过程Redux测试项目的搭建Redux的基本使用步骤Redux目录的结构划分React的三大原则Redux的使用过程 Redux测试项目的搭建 1.创建一个新的项目文件夹:learn-redux # 执行初始化操作 npm init -y或yarn init -y # 安装redux:npm install redux --save或yarn …

Tomcat使用教程(超详细)

文章目录Tomcat学习笔记1、Tomcat概述2、Tomcat的基本使用2.1 基本操作2.1.1 安装2.1.2 卸载2.1.3 配置2.1.4 启动2.1.5 部署2.1.6 关闭3、IDEA中使用Maven创建Web项目3.0 Web项目目录结构介绍3.1 使用骨架创建Web项目3.2 直接创建web项目4、Web项目部署4.1 集成本地的Tomcat4.…

别找了诸位 【十二款超级好用的谷歌插件都在这】(确定不来看看?)

目录 &#x1f30c;前言&#xff1a; &#x1f307;第一款、油猴插件 &#x1f307;第二款、Adblock Plus - 免费的广告拦截器 &#x1f307;第三款、谷歌清理大师&#xff08;CleanMaster&#xff09; &#x1f307;第四款、google翻译 &#x1f307;第五款、OneTab &a…

vue的双击事件(dbclick的使用)

双击事件(dblclick) vue事件中基于点击事件&#xff0c;有一个双击事件&#xff0c;通过dblclick事件触发。 语言&#xff1a;vue3/Ts 函数库&#xff1a;vueuse 1、需求分析 双击事件触发&#xff1b; 在双击时隐藏对应文字元素&#xff1b; 展示输入框&#xff1b; 输入…

Vue系列之插槽(slot)详解

文章の目录1、什么是插槽了2、插槽的分类3、默认插槽的使用3.1、语法3.2、示例4、具名插槽的使用4.1、什么是具名插槽4.2、语法4.3、示例4.4、缩写5、作用域插槽的使用5.1、什么是作用域插槽了5.2、语法5.3、示例6、动态插槽名6.1、什么是动态插槽名6.2、示例写在最后Vue 版本&…

Node.js | 从前端到全栈的必经之路

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;即将大三的学生&#xff0c;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三…

在uni-app中使用手机号一键登录

1、首先需要在dcloud开发者控制台开通一键登录 https://dev.dcloud.net.cn/uniLogin 开通一键登录服务, 获取关键最关键的两个参数 ApiKey 和 ApiSecret 真机调试无需添加应用&#xff0c;如需打包使用请添加。一键登录应用ID为离线打包时配置的appid 2、登录云服务空间&#x…

HTML零基础入门教程(详细)

首先我们先介绍一下网页&#xff1a; 网页时构成网站的基本元素&#xff0c;它通常由图片&#xff0c;链接&#xff0c;文字&#xff0c;声音&#xff0c;视频等元素组成。通常我们看到的网页&#xff0c;常见以.htm或.html后缀结尾的文件&#xff0c;因此我们把它俗称为HTML文…

webpack看这一篇就够了

文章目录今日学习目标1. webpack基本概念webpack能做什么2. webpack的基本使用2.0 创建项目2.1 解决多次引入资源文件2.2 webpack使用2.3_webpack 更新打包3. webpack的配置3.0_webpack-入口和出口3.1_打包流程图3.2_插件-自动生成html文件3.3_mode模式3.3_webpack开发服务器-为…

微信小程序转uniapp的迁移步骤及遇到的问题

目录 前言 一、迁移步骤 第一步:安装miniprogram-to-uniapp 插件 第二步:查看是否安装成功 第三步:使用插件进行转换