boot gwt_带Spring Boot的GWT

boot gwt

介绍

我最近一直在研究用Java编写UI代码的选项。 在我以前的文章中,我研究了Eclipse RAP,发现它可以与Spring Boot集成在一个可执行jar中。 这次,我想对GWT做同样的技巧。

每个人都喜欢Spring Boot。 它使很多事情变得更加干净和容易。 但是从历史上看,用于在Web浏览器中创建UI的框架具有自己的方法来完成Spring Boot的某些工作。 不幸的是,在许多情况下,它们的方法看起来过时且过时。 因此,目标是尽可能使用Spring Boot并将GWT仅用于UI。

我必须警告读者,这篇文章实际上是TL; DR :-)的经典示例。

GWT方法

GWT使用特殊的编译器从Java代码生成Javascript代码。 该方法是创建模块描述文件.gwt.xml,使用它导入其他模块,并使用GWT小部件用Java编写代码。 然后,他们的编译器将生成很多javascript代码,这些代码需要包含在html页面中。 他们在www.gwtproject.org上有一个讲解基本知识的教程 。

他们使用GWT RPC在后端调用方法。 这种方法需要在客户端和服务器之间共享一个接口。 客户端使用该接口来调用RPC方法。 该方法的服务器端实现在web.xml中注册为具有适当URL模式的Servlet。

我认为一个主要问题是调试。 最新版本的GWT采用了一种彻底的源地图方法。 这意味着Java代码调试在启用了源映射的浏览器中进行 ,而不是在Eclipse中进行(或者我无法使其在Eclipse中工作)。 我在Chrome浏览器中进行了尝试,它确实可以工作,但看起来有点麻烦。 默认情况下,GWT甚至不生成源映射。 为了使用它们,必须启动代码服务器并从此代码服务器在html页面中加载不同的javascript。 在这种情况下,大多数人都会向编译器添加一个选项。

我的意思是对GWT团队和这项技术的支持者没有冒犯,但总体而言,它看起来有些过时了。 他们不会花费太多时间来开发新功能。 甚至构建插件也由发烧友维护。

目标

这是我在调查中想要实现的目标:

  1. 仅将GWT用于生成将与其他所有文件一起归档到可执行jar中的Javascript代码。
  2. 将Spring Boot用于REST端点并完全避免GWT RPC
  3. 使用Spring Boot的可执行jar启动应用程序,并使用嵌入式Tomcat服务GWT html文件。 这也意味着可以使用所有其他出色的Spring Boot功能。

制作工具

为了实现目标1,我们需要一个好的构建工具。 我已经使用Maven插件从教程中创建了示例项目。 这是对我有用的完整配置:

<plugin>
<groupId>net.ltgt.gwt.maven</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>1.0-rc-6</version>
<executions>
<execution>
<goals>
<goal>import-sources</goal>
<goal>compile</goal>
<goal>import-test-sources</goal>
<goal>test</goal>
</goals>
</execution>
</executions>
<configuration>
<moduleName>org.example.gwt.StockWatcher</moduleName>
<moduleShortName>StockWatcher</moduleShortName>
<failOnError>true</failOnError>
<!-- GWT compiler 2.8 requires 1.8, hence define sourceLevel here if you use
a different source language for java compilation -->
<sourceLevel>1.8</sourceLevel>
<!-- Compiler configuration -->
<compilerArgs>
<!-- Ask GWT to create the Story of Your Compile (SOYC) (gwt:compile) -->
<arg>-compileReport</arg>
<arg>-XcompilerMetrics</arg>
</compilerArgs>
<!-- DevMode configuration -->
<warDir>${project.build.directory}/${project.build.finalName}</warDir>
<classpathScope>compile+runtime</classpathScope>
<!-- URL(s) that should be opened by DevMode (gwt:devmode). -->
<startupUrls>
<startupUrl>StockWatcher.html</startupUrl>
</startupUrls>
</configuration>
</plugin>

使用GWT Eclipse插件,我可以使其工作,甚至调试也可以在Chrome中进行,因为Eclipse的GWT插件会自动启动代码服务器,并以某种方式更新html文件以从代码服务器加载javascript。

最重要的是:GWT Maven插件有效:-))。 但是,将Spring Boot和GWT集成起来将是一项复杂的任务。 我需要先运行GWT编译,然后将结果javascript添加到可执行文件Jar中。 也许可以用Maven做到这一点,但是对于这个任务,我决定使用Gradle

Gradle是一种快速发展的构建工具。 DSL和API尚未稳定,但提供了很大的灵活性。 虽然Maven的构建阶段相当直线,但是Gradle可以按任何顺序执行任务。 我需要这种灵活性。

经过一番挖掘后,我发现了一个适用于GWT的Gradle插件: de.esoco.gwt 。 它是Putnami插件的分支。 该文档足以使该插件正常工作。 我没有发现任何重大问题。 build.gradle中的配置位于gwt块内:

gwt {gwtVersion = gwtVersionmodule("org.example.gwt.StockWatcher2", "de.richsource.gradle.plugins.gwt.example.Example")// other configuration options
}

该插件将一些任务添加到gradle构建中。 其中最重要的是gwtCompile 。 该任务实际上生成了javascript代码,并将其放入${buildDir}/gwt/out 。 这些值(gwt和out)都在Gradle GWT插件中进行了硬编码。

重要的是要记住,编译成javascript的代码是在GWT模块文件中指定的,如下所示:

<source path='client'/>
<source path='shared'/>

休息和休息

下一个目标是使用Spring Boot的REST端点。 我发现RestyGWT可以帮助我做到这一点。 他们在首页上有一个简单的方法。

我将所需的依赖项添加到build.gradle中:

implementation("javax.ws.rs:javax.ws.rs-api:2.0.1")
compileOnly group: "org.fusesource.restygwt", name: "restygwt", version: "2.2.0"
implementation group: "com.fasterxml.jackson.jaxrs", name: "jackson-jaxrs-json-provider", version: "2.8.9"

JAX-RS依赖关系是必需的,因为RestyGWT使用JAX-RS的注释来声明端点。 据我了解,Jackson也有必要解析JSON。

我也在GWT模块中添加了依赖项:

<inherits name="org.fusesource.restygwt.RestyGWT"/>

这是我用RestyGWT创建的服务:

public interface TestService extends RestService {@GET@Path("test") void test1(@QueryParam("input") String inp,    MethodCallback<TestResult> callback);
}

我在ClickHandler中调用此服务(我主要使用了原始GWT教程中的代码):

private final TestService testSrv = GWT.create(TestService.class);
btnCallServer.addClickHandler(clkEvent -> {testSrv.test1("TestString", new MethodCallback<TestResult>() {@Overridepublic void onSuccess(Method method, TestResult response) {testLabel.setText("Srv success " + response.getStr1());}@Overridepublic void onFailure(Method method, Throwable exception) {testLabel.setText("Srv failure " + exception.getMessage());}});
});

该服务在Spring Boot控制器中调用此简单方法:

@GetMapping("/test")
public TestResult test1(@RequestParam(name="input", required=false) String inp) {
return new TestResult(inp + " qqq");
}

好消息是所有这些代码都是一个可执行jar的一部分。

可执行罐

第三个目标是将所有内容实际捆绑到一个可执行文件胖子中。 在本节中,我最终可以利用Gradle的灵活性。

首先,我将html文件放入/src/main/resources/static

我创建了一个任务,用于在生成过程中将生成的javascript复制到$ {buildDir}中的静态文件夹中:

task copyGWTCode(dependsOn: ["gwtCompile"], type: Copy) {from file("${buildDir}/gwt/out")into file("${buildDir}/resources/main/static")
}

接下来,我使bootJar任务依赖于此任务,并将jar复制到更传统的目标目录中:

bootJar {dependsOn copyGWTCodedoLast {mkdir "${buildDir}/target"setDestinationDir(file("${buildDir}/target"))copy()}
}

在GWT中进行调试

关于GWT调试的另一章。

我找到了一种在Chrome中调试GWT UI的相当简单的方法(Chrome可以比Firefox处理得更好)。 以下是使其工作的步骤。 我使用了GWT教程中的项目,但将其重命名为“ stockwatcher2”。

1.src/main/resources/static添加一个新的html文件进行调试。 例如,如果原始文件为StockWatcher2.html,则新文件应为StockWatcher2debug.html。 在这个新文件中,替换该行

<script type="text/javascript" src="stockwatcher2/stockwatcher2.nocache.js"></script>

这行代码(来自代码服务器的javascript):

<script src="http://localhost:9876/recompile-requester/stockwatcher2"></script>

2.执行任务bootJar并运行它。
3.使用“ gradle gwtCodeServer”从项目文件夹启动代码服务器。
4.在Chrome中打开http://<host>:<port>/<somepath>/StockWatcher2debug.html 5.现在,您可以在Developer Tools-> Sources下的127.0.0.1:9876下找到源映射。 可以设置断点并直接在Chrome中点击。

使用单独文件的想法是将其从生产版本中排除,但将其保留在开发人员版本中。 使用Gradle很容易。 这种方法只有一个问题,那就是从调试源调用的REST端点与从“正常”源调用的REST端点不同。 再添加一个映射即可解决该问题。

结论

我祝贺已经得出这一结论的英雄人物! 你是真正的程序员,而那些放弃的人却是胆小鬼!

但最重要的是,与GWT合作非常困难。 构建工具非常笨拙,并且缺少重要功能。 实际上没有集成(例如与Spring Boot集成)。 调试是不必要的复杂操作。

如果有人要在GWT和Eclipse RAP之间进行选择,我会推荐Eclipse RAP。

没有幸福的结局:-(。

翻译自: https://www.javacodegeeks.com/2018/11/gwt-spring-boot.html

boot gwt

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

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

相关文章

工作占用了太多私人时间_下班后还要被逼谈工作,我们应该如何处理?

老板总是下班后在跟我说工作的事情。不理吧&#xff0c;怕领导不高兴&#xff0c;回复了又怕没完没了的占用了自己的私人时间去完成工作&#xff0c;并且以后老板会觉得这样是理所当然&#xff0c;会变本加厉。“幻想花开”是一家装修公司的设计师&#xff0c;公司里的业务量越…

oh-my-zsh中如何去掉命令提示符前缀

终端的提示符前面存在着一长串前缀&#xff1a;用户名主机名&#xff0c;有时候命令稍微长点&#xff0c;一整行就放不下&#xff0c;于是找到了消除前缀的办法&#xff1a; 输入快捷键 Shift Command G&#xff0c;在前往文件夹输入框中输入 ~/.oh-my-zsh/themes/&#xff…

迁移学习 简而言之_简而言之SPIFFE

迁移学习 简而言之我一直在研究SPIFEE&#xff08;每个人的安全生产身份框架&#xff09;[1]&#xff0c;在这里&#xff0c;我正在按照我现在的理解起草流程&#xff0c;以使任何其他试图了解流程的人受益。 身份注册表 – SPIRE服务器具有自己的身份注册表&#xff0c;该注册…

MyBatisPlus使用教程

lt是小于 gt是大于

cap理论具体含义_架构设计之「 CAP 定理 」

在计算机领域&#xff0c;如果是初入行就算了&#xff0c;如果是多年的老码农还不懂 CAP 定理&#xff0c;那就真的说不过去了。CAP可是每一名技术架构师都必须掌握的基础原则啊。现在只要是稍微大一点的互联网项目都是采用 分布式 结构了&#xff0c;一个系统可能有多个节点组…

用于zsh的高亮插件 zsh-syntax-highlighting

文章目录简介安装配置简介 zsh-syntax-highlighting 插件为 shell zsh 提供语法高亮显示。当命令在 zsh 提示符下输入到交互式终端时&#xff0c;它可以突出显示命令。这有助于在运行命令之前检查命令&#xff0c;特别是捕获语法错误。 主页地址&#xff1a;https://github.c…

项目不能使用fn标签_无服务器,Java和FN项目的第一步

项目不能使用fn标签无服务器不是什么新事物&#xff0c;但是可以说&#xff0c;仍然有很多关于它的炒作&#xff0c;以及它将如何改变一切&#xff0c;以及未来将如何成为无服务器。 除了云提供商提供的无服务器/功能之外&#xff0c;还有越来越多的无服务器项目正在我们的路上…

tomcat目录下创建临时文件,长时间没有使用会被系统清理掉

原因 原因&#xff1a;在linux系统中&#xff0c;spring boot应用服务每次使用java -jar启动后都会在/tmp目录下生成如下目录&#xff1a; hsperfdata_root tomcat.***.9008&#xff08;中间是一串数字&#xff0c;结尾是应用端口号&#xff09; tomcat-docbase..9008&#x…

iTerm2的颜色主题/配色主题/配色方案

文章目录直接下载配色方案包使用命令下载安装配色方案直接下载配色方案包 GitHub 主页地址&#xff1a;https://github.com/mbadolato/iTerm2-Color-Schemes 颜色方案下载地址&#xff1a;https://iterm2colorschemes.com/ 下载压缩包后对其进行解压缩&#xff0c;打开目录找…

android 技能标签功能_iOS和Android用户体验设计差异

摘要&#xff1a;iOS和Android用户体验设计差异关键词&#xff1a;iOS&#xff0c;Android&#xff0c;用户体验设计本文将讨论iOS和Android之间的具体设计差异。基本差异1、设计规范 iOS和Android遵循不同的设计规范。2、度量单位 iOS应用程序设计是在pt中开发的&#xff0c;而…

java线程池返回线程状态_Java线程的不同状态

java线程池返回线程状态介绍 在Java中&#xff0c;线程可以具有状态。 Thread.State枚举定义Java线程可以具有的不同状态。 该枚举定义了以下值– 新 可运行 已封锁 等候 TIMED_WAITING 已终止 在随后的部分中&#xff0c;我将简要概述这些状态以及它们之间的可能过渡。…

远程Linux主机安装Oh My Zsh

文章目录介绍安装安装后介绍 Oh My Zsh is an open source, community-driven framework for managing your Zsh configuration. 安装 如果你的服务器没有安装 zsh&#xff0c;则要先安装 zsh&#xff1a; yum install zsh要先安装 git&#xff1a; yum install git然后安…

处理Nginx返回octet-stream数据流的配置

解决 修改Nginx的配置将add_header Content-length 0&#xff1b;删除&#xff0c;处理 Content-Type为application/octet-stream 一、请求报文 二、异常信息 对应前端页面的异常信息为&#xff1a; Network Error epoll_wait() reported that client prematurely closed c…

multi task训练torch_Multi-task Learning的三个小知识

本文译自Deep Multi-Task Learning – 3 Lessons Learned by Zohar Komarovsky在过去几年里&#xff0c;Multi-Task Learning (MTL)广泛用于解决多个Taboola&#xff08;公司名&#xff09;的业务问题。在这些业务问题中&#xff0c; 人们使用一组相同的特征以及深度学习模型来…

java8多线程运行程序_线程,代码和数据–多线程Java程序实际运行的方式

java8多线程运行程序有些事情是您在学术或培训班上没有学到的&#xff0c;经过几年的工作经验后才逐渐了解&#xff0c;然后才意识到&#xff0c;这是非常基本的事情&#xff0c;我为什么错过了这么多年。 了解多线程Java程序的执行方式就是其中之一。 您肯定已经听说过线程&am…

zsh命令行界面/zsh终端界面粘贴卡顿的问题

因为安装了某些zsh插件导致&#xff0c;在zsh命令行中粘贴文本非常卡顿&#xff0c;解决方案就是把下面的代码复制到 ~/.zshrc 文件中&#xff1a; pasteinit() {OLD_SELF_INSERT${${(s.:.)widgets[self-insert]}[2,3]}zle -N self-insert url-quote-magic # I wonder if youd…

java连接mongodb的jar包_Java实战之管家婆记账系统(1)——项目简述

项目简述&#xff1a;该项目是一个通过JavaFX实现的管家婆记账系统&#xff0c;具有记账的功能。使用软件&#xff1a;IntelliJ IDEA 2018.3.5(Ultim ate Edition)&#xff1a;编写Java项目代码。JavaFX Scene Builder 2.0&#xff1a;生成fxml界面文件。Navicat for MySQL&…

oauth2.0协议流程_正确的工作流程:我应该使用哪个OAuth 2.0流程?

oauth2.0协议流程什么是OAuth 2.0 OAuth 2.0是一个已被广泛采用的委托授权框架&#xff0c;已经存在了很多年&#xff0c;并且似乎已经存在。 如果您不熟悉OAuth 2.0的基本概念&#xff0c;可以使用 川崎孝彦写的优秀文章 。 这只是OAuth 2.0各方的简要提醒&#xff1a; 资源…

远程Linux主机安装zsh插件zsh-syntax-highlighting

安装说明&#xff1a; https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md 根据安装说明&#xff1a; 1.Clone this repository in oh-my-zsh’s plugins directory&#xff1a; git clone https://github.com/zsh-users/zsh-syntax-highlightin…

scare机器人如何手眼标定_基于视觉伺服的工业机器人系统研究(摄像机标定、手眼标定、目标单目定位)...

击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达标定技术常见的机器人视觉伺服中要实现像素坐标与实际坐标的转换&#xff0c;首先就要进行标定&#xff0c;对于实现视觉伺服控制&#xff0c;这里的标定不仅包括摄像机标定…