javascript
带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,我們需要一個好的構建工具。 我已經使用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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑单机游戏下载(电脑单机游戏下载平台哪
- 下一篇: 新房备案时间(接房备案日期)