日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

boot gwt_带Spring Boot的GWT

發布時間:2023/12/3 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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團隊和這項技術的支持者沒有冒犯,但總體而言,它看起來有些過時了。 他們不會花費太多時間來開發新功能。 甚至構建插件也由發燒友維護。

目標

這是我在調查中想要實現的目標:

  • 僅將GWT用于生成將與其他所有文件一起歸檔到可執行jar中的Javascript代碼。
  • 將Spring Boot用于REST端點并完全避免GWT RPC
  • 使用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

    總結

    以上是生活随笔為你收集整理的boot gwt_带Spring Boot的GWT的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。