javascript
带Spring Boot的GWT
介紹
我最近一直在研究用Java編寫UI代碼的選項。 在我以前的文章中,我研究了Eclipse RAP,發(fā)現(xiàn)它可以與Spring Boot集成在一個可執(zhí)行jar中。 這次我想對GWT做同樣的技巧。
每個人都喜歡Spring Boot。 它使很多事情變得更加干凈和容易。 但是從歷史上看,用于在Web瀏覽器中創(chuàng)建UI的框架具有自己的方法來完成Spring Boot的某些工作。 不幸的是,在許多情況下,它們的方法看起來過時且過時。 因此,目標(biāo)是盡可能使用Spring Boot并將GWT僅用于UI。
我必須警告讀者,這篇文章實際上是TL; DR :-)的經(jīng)典示例。
GWT方法
GWT使用特殊的編譯器從Java代碼生成Javascript代碼。 該方法是創(chuàng)建一個模塊描述文件.gwt.xml,用它導(dǎo)入其他模塊,并使用GWT小部件用Java編寫代碼。 然后,他們的編譯器將生成許多javascript代碼,這些代碼需要包含在html頁面中。 他們在www.gwtproject.org上有一個講解基本知識的教程 。
他們使用GWT RPC在后端調(diào)用方法。 這種方法需要在客戶端和服務(wù)器之間共享一個接口。 客戶端使用該接口來調(diào)用RPC方法。 該方法的服務(wù)器端實現(xiàn)在web.xml中注冊為具有適當(dāng)URL模式的Servlet。
我認(rèn)為一個主要問題是調(diào)試。 最新版本的GWT采用了一種徹底的源地圖方法。 這意味著Java代碼調(diào)試在啟用了源映射的瀏覽器中進行 ,而不是在Eclipse中進行(或者也許我無法使其在Eclipse中工作)。 我在Chrome瀏覽器中進行了嘗試,它確實可以工作,但看起來有點麻煩。 默認(rèn)情況下,GWT甚至不生成源映射。 為了使用它們,必須啟動代碼服務(wù)器并從此代碼服務(wù)器在html頁面中加載不同的javascript。 在這種情況下,大多數(shù)人都會向編譯器添加一個選項。
我的意思是對GWT團隊和這項技術(shù)的支持者沒有冒犯,但總體而言,它看起來有些過時了。 他們不會花費太多時間來開發(fā)新功能。 甚至構(gòu)建插件也由發(fā)燒友維護。
目標(biāo)
這是我在調(diào)查中想要實現(xiàn)的目標(biāo):
制作工具
為了實現(xiàn)目標(biāo)1,我們需要一個好的構(gòu)建工具。 我已經(jīng)使用Maven插件從教程中創(chuàng)建了示例項目。 這是對我有用的完整配置:
<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插件,我可以使其工作,甚至調(diào)試也可以在Chrome中進行,因為Eclipse的GWT插件會自動啟動代碼服務(wù)器,并以某種方式更新html文件以從代碼服務(wù)器加載javascript。
最重要的是:GWT Maven插件有效:-))。 但是,將Spring Boot和GWT集成起來將是一項復(fù)雜的任務(wù)。 我需要先運行GWT編譯,然后將結(jié)果javascript添加到可執(zhí)行文件Jar中。 也許可以用Maven做到這一點,但是對于這個任務(wù),我決定使用Gradle 。
Gradle是一種快速發(fā)展的構(gòu)建工具。 DSL和API尚不穩(wěn)定,但提供了很大的靈活性。 雖然Maven的構(gòu)建階段相當(dāng)直線,但是Gradle可以按任何順序執(zhí)行任務(wù)。 我需要這種靈活性。
經(jīng)過一番挖掘,我發(fā)現(xiàn)了一個適用于GWT的Gradle插件: de.esoco.gwt 。 它是Putnami插件的分支。 該文檔足以使該插件正常工作。 我沒有發(fā)現(xiàn)任何重大問題。 build.gradle中的配置位于gwt塊內(nèi):
gwt {gwtVersion = gwtVersionmodule("org.example.gwt.StockWatcher2", "de.richsource.gradle.plugins.gwt.example.Example")// other configuration options }該插件將一些任務(wù)添加到了gradle構(gòu)建中。 其中最重要的是gwtCompile 。 該任務(wù)實際上生成了javascript代碼,并將其放入${buildDir}/gwt/out 。 這些值(gwt和out)都在Gradle GWT插件中進行了硬編碼。
重要的是要記住,編譯成javascript的代碼是在GWT模塊文件中指定的,如下所示:
<source path='client'/> <source path='shared'/>休息和休息
下一個目標(biāo)是使用Spring Boot的REST端點。 我發(fā)現(xiàn)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依賴關(guān)系是必需的,因為RestyGWT使用JAX-RS的注釋來聲明端點。 據(jù)我了解,Jackson也有必要解析JSON。
我也在GWT模塊中添加了依賴項:
<inherits name="org.fusesource.restygwt.RestyGWT"/>這是我用RestyGWT創(chuàng)建的服務(wù):
public interface TestService extends RestService {@GET@Path("test") void test1(@QueryParam("input") String inp, MethodCallback<TestResult> callback); }我在ClickHandler中調(diào)用此服務(wù)(我主要使用了原始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());}}); });該服務(wù)在Spring Boot控制器中調(diào)用此簡單方法:
@GetMapping("/test") public TestResult test1(@RequestParam(name="input", required=false) String inp) { return new TestResult(inp + " qqq"); }好消息是所有這些代碼都是一個可執(zhí)行jar的一部分。
可執(zhí)行罐
第三個目標(biāo)是將所有內(nèi)容實際捆綁到一個可執(zhí)行文件胖子中。 在本部分中,我最終可以利用Gradle的靈活性。
首先,我將html文件放在/src/main/resources/static 。
我創(chuàng)建了一個任務(wù),用于在生成過程中將生成的javascript復(fù)制到$ {buildDir}中的靜態(tài)文件夾中:
task copyGWTCode(dependsOn: ["gwtCompile"], type: Copy) {from file("${buildDir}/gwt/out")into file("${buildDir}/resources/main/static") }接下來,我使bootJar任務(wù)依賴于此任務(wù),并將jar復(fù)制到更傳統(tǒng)的目標(biāo)目錄中:
bootJar {dependsOn copyGWTCodedoLast {mkdir "${buildDir}/target"setDestinationDir(file("${buildDir}/target"))copy()} }在GWT中進行調(diào)試
關(guān)于GWT調(diào)試的另一章。
我找到了一種在Chrome中調(diào)試GWT UI的相當(dāng)簡單的方法(Chrome可以比Firefox更好地處理它)。 以下是使其工作的步驟。 我使用了GWT教程中的項目,但將其重命名為“ stockwatcher2”。
1.在src/main/resources/static添加一個新的html文件進行調(diào)試。 例如,如果原始文件為StockWatcher2.html,則新文件應(yīng)為StockWatcher2debug.html。 在這個新文件中,替換該行
<script type="text/javascript" src="stockwatcher2/stockwatcher2.nocache.js"></script>這行代碼(來自代碼服務(wù)器的javascript):
<script src="http://localhost:9876/recompile-requester/stockwatcher2"></script> 2.執(zhí)行任務(wù)bootJar并運行它。 
 3.使用“ gradle gwtCodeServer”從項目文件夾啟動代碼服務(wù)器。 
 4.在Chrome中打開http://<host>:<port>/<somepath>/StockWatcher2debug.html 5.現(xiàn)在,您可以在Developer Tools-> Sources下的127.0.0.1:9876下找到源映射。 可以設(shè)置斷點并直接在Chrome中點擊。 
使用單獨文件的想法是將其從生產(chǎn)版本中排除,但將其保留在開發(fā)人員版本中。 使用Gradle很容易。 這種方法只有一個問題,那就是從調(diào)試源調(diào)用的REST端點與從“正常”源調(diào)用的REST端點不同。 再添加一個映射即可解決該問題。
結(jié)論
我祝賀已經(jīng)得出這一結(jié)論的英雄人物! 你是真正的程序員,而那些放棄的人卻是膽小鬼!
但最重要的是,與GWT合作非常困難。 生成工具非常笨拙,缺少重要功能。 實際上沒有集成(例如與Spring Boot集成)。 調(diào)試是不必要的復(fù)雜操作。
如果有人要在GWT和Eclipse RAP之間進行選擇,我會推薦Eclipse RAP。
沒有幸福的結(jié)局:-(。
翻譯自: https://www.javacodegeeks.com/2018/11/gwt-spring-boot.html
總結(jié)
以上是生活随笔為你收集整理的带Spring Boot的GWT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 电脑单机游戏下载(电脑单机游戏下载平台哪
 - 下一篇: 新房备案时间(接房备案日期)