介绍

我最近一直在研究用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

带Spring Boot的GWT相关推荐

  1. boot gwt_带Spring Boot的GWT

    boot gwt 介绍 我最近一直在研究用Java编写UI代码的选项. 在我以前的文章中,我研究了Eclipse RAP,发现它可以与Spring Boot集成在一个可执行jar中. 这次,我想对GW ...

  2. idea gwt 怎么编译_带Spring Boot的GWT

    idea gwt 怎么编译 介绍 我最近一直在研究用Java编写UI代码的选项. 在我以前的文章中,我研究了Eclipse RAP,发现它可以与Spring Boot集成在一个可执行jar中. 这次我 ...

  3. 【registry】registry合并带spring boot项目第一弹

    1.概述 我现在有一个jetty项目是registry项目是开源的,貌似使用的dropwizard-core框架,现在我有个spring boot项目,想把registry囊括进来,我是直接把regi ...

  4. Spring Boot开发介绍

    Spring Boot开发介绍 Spring Boot介绍 安装Spring Boot插件 创建Spring Boot项目 Idea 创建Spring Boot项目失败 解决方法1-更换为aliyun ...

  5. Spring Boot中自带的这些工具类,你用过几个?

    最近发现同事写了不少重复的工具类,发现其中很多功能,Spring 自带的都有.于是整理了本文,希望能够帮助到大家! 断言 断言是一个逻辑判断,用于检查不应该发生的情况 Assert 关键字在 JDK1 ...

  6. 硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!

    " 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/jar/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 2. MANIFEST.MF 3. J ...

  7. Spring Boot——MyBatis配置带下划线命名的字段自动转换驼峰命名解决方案

    问题描述 MyBatis无法查询出属性名和数据库字段名不完全相同的数据. 即:属性名和数据库字段名分别为驼峰命名和下划线命名时查出的数据为NULL. 问题分析 MyBatis默认是属性名和数据库字段名 ...

  8. Spring Boot 2.X 来临,本文将带你起飞

    转载自   Spring Boot 2.X 来临,本文将带你起飞 当前互联网技术盛行,以Spring 框架为主导的Java 互联网技术成了主流,而基于Spring 技术衍生出来的Spring Boot ...

  9. spring boot web项目_阿里技术专家带你使用Spring框架快速搭建Web工程项目

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 第一时间与你相约 每日英文 We all have a past. It's how you deal with it. 每个人 ...

最新文章

  1. 作为程序员,你评估工作量留 buffer 吗?
  2. windows共享wifi
  3. 看看这些被同事喷的 JS 代码风格你写过多少
  4. 深入理解final关键字
  5. android比较常用的布局,Android_九宫图比较常用的多控件布局(GridView)使用介绍,GridView跟ListView都是比较常用的 - phpStudy...
  6. SignalR2结合ujtopo实现拓扑图动态变化
  7. setresult()java_Java ResultSet getType()方法与示例
  8. 截止到2013年,核心Java帖子
  9. Ubuntu中安装nginxError
  10. 求职,北京,.netGIS
  11. 新浪微博被罚了,暂停更新微博热搜榜一周
  12. aopaspect区别_spring 中的aop:advisor和aop:aspect有什么区别?
  13. 程序员书单 (不定期更新)
  14. JAVA清稿word_java开发实现word在线编辑及流转
  15. mysql 授权创建数据库_MySQL创建数据库与创建用户以及授权
  16. WORD中如何进行双行合一
  17. javaweb JAVA JSP智能社区管理系统JSP小区物业管理系统物JSP小区管理系统源码 JSP物业社区管理系统
  18. ic卡识别程序c语言,求ID/IC卡的原理与C语言读取程序?
  19. @Valid对页面传参的校验问题
  20. js 将一大段时间均分为很多个小时间段

热门文章

  1. 【二分】买礼物的艰辛
  2. Scala与Java差异(四)之数组操作
  3. 为什么不应该重写service方法
  4. 零配置 之Spring基于Java类定义Bean配置元数据
  5. Spring Bean 定义
  6. Java 非阻塞 IO 和异步 IO
  7. jQuery 表格实现
  8. MyBatis中动态SQL
  9. Zull路由网关---SpringCloud
  10. docker 安装redis 挂载到宿主机