【问题标题】:Using GWT backend but not frontend使用 GWT 后端但不使用前端
【发布时间】:2025-06-05 13:10:01
【问题描述】:

我刚刚加入了一个 GWT 项目。

我们现在的目标是创建更多的登录页面。

我想将这些页面添加为简单的 HTML 并使用现有的 GWT 后端。

这可能吗?

当我查看当前登录页面中的网络时,我看到 GWT 使用了一个用竖线连接的长字符串,类似于:

7|0|11|http://15.165.128.219:8099/welcome/|B080515AD1EBC13C065F38E72385F941|com.company.AdminService|login|com.company.LoginDetails/94248548|java.util.HashSet/3273092938|java.lang.String/2004016611|myusername|mypassword|1|2|3|4|1|5|5|P__________|6|1|7|8|6|1|7|9|10|11|

我知道 JQuery Ajax

$.ajax( { username : "username" , password : "password" }

GWT 响应如下所示:

//OK['C',[],0,7]

如何桥接这两种技术?使用 GWT 发送 JQuery Ajax 请求和回复的正确方法是什么?

【问题讨论】:

    标签: jquery gwt


    【解决方案1】:

    GWT 的使用就是把它作为一种前端技术来使用。如果您想删除该功能,那么您可能根本不需要 GWT 并使用后端技术。

    【讨论】:

    • 我仍然想要前端和后端。我只想重用后端。让我们假设第 3 方需要与我整合。而那个第 3 方只使用 JavaScript/HTML.. 我们该怎么做呢。
    【解决方案2】:

    GWT 具有三个“层”client, shared and server

    在服务器端你可以使用任何适合Java and database.的东西

    GWT 有自己的机制用于浏览器和服务器之间的远程过程调用。

    这很像vanilla Java RMI - 为您的服务器函数定义接口和实现,并且将生成代码以允许您的客户端代码调用它们,就好像它们是简单的本地方法一样。

    这让为请求和响应定义 XML or JSON 数据格式的所有工作都烟消云散。只需为服务器编写函数,从客户端代码调用函数(仍然是 Java),所有的marshalling, unmarshalling, network communication 等都为您完成。

    因此,如果没有客户端,您将无法单独使用 RPC 功能,这样使用也不是一个好习惯。

    My suggetion is to go for Pure `AJAX`.
    

    【讨论】:

    • 但是你说客户端支持编组/解组..为什么我不能以某种方式重用它?
    • 您可以以某种方式实现编组/解组,但我所说的不是以某种方式实现,而是建议纯 AJAX。
    【解决方案3】:

    当您编写自己的代码以向 GWT-RPC 发出请求并解析来自 GWT-RPC 的响应时,您已经重写了相当多的 GWT。

    您最好的选择是在客户端使用 GWT 来处理服务器通信(然后可能将结果传递给 jQuery),或者在服务器端编写类似 servlet 的东西,作为 GWT 的替代接口—— RPC 调用。

    但是,如果您坚持要走这条路,那么可以从以下问题开始: GWT RPC data format

    所选答案链接了格式基本概述的来源。对于完整的细节,虽然别无选择,只能深入挖掘源头。该协议在其他任何地方都没有完整记录。

    【讨论】:

      【解决方案4】:

      通过 javascript 将 ajax 请求分派到 GWT RPC 调用的正确方法是将调用转换为 javascript api。 Gwt 有一个库可以让这变得相当容易 - https://code.google.com/p/gwt-exporter/

      它允许您在 GWT 的 java 代码中注释方法(例如,一个包含调用某些 GWT RPC 的方法的类),并以一个好听的名称使其可用于 javascript。

      例如,

        package com.example;
        @Export
        public static class YourClass implements Exportable {
          private YourServiceAsync service = (YourServiceAsync) Gwt.create(YourService.class);
          public void foo() {
            //you can make RPC calls here via the normal GWT way
            service.doService("foo", new YourAsyncCallback()); 
          }
          public static String bar(){
            return "bar";
          }
        }
      

      然后在 javascript 中,您可以调用这些方法

         // create an instance of YourClass 
         var a = new com.example.YourClass ()
         // call an instance method
         a.foo();
         // call a static method
         com.example.YourClass .bar();
      

      还有更高级的用途(例如在 javascript 中传入闭包) - 请查看该项目的 doco/wiki。

      【讨论】:

      • 我试过这个。这对模型很有用。服务怎么样?你能举一个可以导出的服务的例子吗?