带Spring 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

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

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

相关文章

matlab中统计数组中各数字(元素)出现的次数

1. tabulate 调用MATLAB自带的函数tabulate统计一个数组中各数字&#xff08;元素&#xff09;出现的频数、频率 【例1】统计数值型数组中各元素出现的频数、频率。 >> x [2 2 6 5 2 3 2 4 3 4 3 4 4 4 4 2 26 0 4 7 2 5 8 3 1 3 2 5 3 …

【渝粤题库】广东开放大学 大学英语B 形成性考核

选择题 题目&#xff1a; Do you still get free plastic bags from the supermarkets? Things have changed. China has banned free plastic bags at shops and supermarkets, and people have to pay for using plastic bags. The rule started on June 1. It came becaus…

Latex \bibliographystyle+修改字体字号的大小

1. bibliography style LaTeX 标准选项及其样式共有以下8种&#xff1a; plain &#xff0c;按字母的顺序排列&#xff0c;比较次序为作者、年度和标题. unsrt &#xff0c;样式同plain&#xff0c;只是按照引用的先后排序. alpha &#xff0c;用作者名首字母年份后两位作标号…

【渝粤题库】广东开放大学 文化产业经济学 形成性考核

选择题 题目&#xff1a;受传统文化影响&#xff0c;中国的父母生孩子的意义和其他国家截然不同。父母一方面节衣缩食给孩子提供最好的物质条件&#xff0c;一方面对孩子"四体不勤”给予最大的宽容。这说明&#xff08;&#xff09;。 题目&#xff1a;当今国际竞争的实质…

【渝粤题库】广东开放大学 标准的研制与编制 形成性考核

​&#x1f449;关注我,看答案&#x1f448; 选择题 题目&#xff1a;采纳( )制定为本国标准&#xff0c;可将国外先进标准转化为国内标准。 题目&#xff1a;标准的编制包括了标准的&#xff08; &#xff09;及标准三稿的形成过程。 题目&#xff1a;编制标准通常在此前已有标…

boxplot

1. 简介 箱形图&#xff0c;又称为盒须图、盒式图、盒状图或箱线图&#xff0c;是一种用作显示一组数据分散情况资料的统计图。箱形图于1977年由美国著名统计学家约翰图基&#xff08;John Tukey&#xff09;发明。它能显示出一组数据的最大值、最小值、中位数、上下四分位数及…

【渝粤题库】广东开放大学 社会学基础 形成性考核

选择题 题目&#xff1a; 在1838年出版的《实证哲学教程》第四卷中&#xff0c;孔德第一次提出了"社会学”这一术语。&#xff08; &#xff09; 选择一项&#xff1a; 题目&#xff1a; 家庭这种群体之所以经久不衰&#xff0c;就在于它具有满足人类个体和社会需求的一…

Java 11的期望

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

MATLAB 在一个数组中随机选择n个数

MATLAB 中在一个数组内随机选择n个数。 例如&#xff1a;在 A [10, 50, 80, 100, 130, 260] 中随机选择5个数。 允许重复&#xff1a; n 5; A [10, 50, 80, 100, 130, 260]; random_num A(randi(numel(A),1,n)); random_num sort(random_num);不允许重复&#xff1a; …

【渝粤题库】广东开放大学photoshop图像处理 形成性考核

题目&#xff1a; 使用变换命令中的缩放命令时&#xff0c;按住哪个键可以保证等比例缩放&#xff1f;&#xff08; &#xff09; 题目&#xff1a; 将前景色和背景色恢复为默认颜色的快捷键是&#xff08;&#xff09;&#xff1f; 题目&#xff1a; Photoshop中“图像尺寸”…

martingale与Markov Process的关系

鞅过程与马尔科夫过程是什么关系&#xff1f; 1.鞅代表的是公平游戏&#xff0c;马尔可夫过程侧重过程无记忆性 总而言之&#xff1a;鞅和马尔可夫过程没有包含的关系。因为鞅代表的是公平游戏&#xff0c;而马尔可夫过程侧重过程无记忆性。两者没有内在联系。 注&#xff1…

【渝粤题库】陕西师范大学151105 财务管理基础作业(高起专)

《财务管理原理&#xff08;高起专&#xff09;》作业 一、单项选择题 1、短期借款较多&#xff0c;流动比率降低&#xff0c;这对一个企业来说一般属于 &#xff08; &#xff09; A、优势 B、劣势 C、机会 D、威胁 2、影响企业价值的两个最基本因素是 &#xff08; &#xff…

【渝粤题库】陕西师范大学163202 管理学原理 作业(高起本 专升本)

《管理学原理&#xff08;专升本&#xff09;》作业 一、名词解释 1、管理 2、德尔斐技术 3、目标管理 4、马斯洛的需求层次 5、效价 6、管理方格论 7、公平理论 8、头脑风暴法 9、授权式领导 10、管理幅度 11、泰罗制 12、同期控制 二、判断并说明理由 1、决策遵循的是满意原…

lambda 序列化_Lambda,会序列化吗?

lambda 序列化因此&#xff0c;我一直在思考Tyrus项目所需的增强功能&#xff0c;该功能允许用户广播到跨机器集群连接到URL的客户端子集。 有多种方法可以做到这一点。 但是自从我使用JDK 8以来&#xff0c;这个问题肯定看起来像钉子。 为此&#xff0c;我创建了一个简单的单…

【渝粤题库】陕西师范大学164205 ERP原理及应用 作业(专升本)

ERP原理及应用&#xff08;专升本&#xff09; 单项选择题 企业信息化综合运用了现代制造技术、&#xff08; &#xff09;、自动化技术、管理技术&#xff0c;将企业各项活动中的人、技术和经营管理&#xff0c;以及信息流、物料流和左流有机集成&#xff0c;实现企业整体优化…

LaTeX双栏模板插入通栏公式(跨栏插图)

1. 利用带星号的浮动体环境 带星号的浮动体figure和table环境可以在双栏模板中使用&#xff0c;例如我们以IEEEtran为例&#xff0c;插入通栏公式 \documentclass{IEEEtran} \usepackage{amsmath&#xff0c;lipsum} \begin{document} \lipsum[1] \begin{figure*} \begin{ali…

JDK 12新闻(2018年9月13日)

随着通用性的JDK 11计划在本月底&#xff08;2018 9月25日&#xff09;&#xff0c;这是一个好时机&#xff0c;开始在更紧密地看着JDK 12 。 在OpenJDK jdk-dev邮件列表上的标题为“ JDK 12的计划时间表 ”的消息中 &#xff0c; Mark Reinhold宣布&#xff1a;“随着JDK 11即…

【渝粤题库】陕西师范大学165211创新管理 作业(专升本)

一、单选题 1.约瑟夫•熊彼特在1912年出版的《&#xff08; &#xff09;》一书中最早提出“创新”一词。 A经济发展理论 B经济分析史 C资本主义、社会主义与民主 D景气循环论 2.约瑟夫•熊彼特的创新理论中&#xff0c;认为创新的主体是&#xff08; &#xff09;。 A企业 B市…

[渝粤题库]西北工业大学中国古代法制史

中国古代法制史 1. 明清时期的主审机关是&#xff08; &#xff09;。 A.刑部 B.大理寺 C.都察院 2. 唐朝编订的&#xff08; &#xff09;&#xff0c;成为后世《宋刑统》的体例渊源。 A.《唐六典》 B.《永徽律疏》 C.《大中刑律统类》 3. 《宋刑统》在内容上沿袭&am…

renew process 更新过程

一个泊松过程可以分解成一系列 i.i.di.i.di.i.d 的指数分布随机变量相加&#xff0c;如果把指数分布换成其他 i.i.di.i.di.i.d 的分布就得到了更新过程。 更新过程本身是泊松过程的一种扩长&#xff0c;同时更新过程也可以发展出一套更新理论&#xff0c;包括更新方程等。 htt…