【问题标题】:GWT client and server implementations of the same class同一类的 GWT 客户端和服务器实现
【发布时间】:2011-07-17 23:48:11
【问题描述】:

有什么方法可以在客户端和服务器上以不同的方式实现相同的类?

为了避免“你为什么要这样做?”问题..我会详细说明

我正在转换一个非常大的 Java 客户端/服务器应用程序。目前它使用 Swing GUI 客户端并通过 Spring 远程处理 (RPC) 与服务器对话。将 GWT RPC 与 Spring 服务一起使用不是问题,有几个很好的示例可用,而且似乎都运行良好。

客户端和服务器共有的几个类包含来回传递的数据。这些类还包含一些使用标准 JRE 类实现的行为。例如,一个类以特定于区域设置的方式包含、解析和格式化日期和时间,包括时区、DST 等。我可以重写/重构它,但应用程序的 SLOC 超过 1000 万,仅导致对此类的数百万次引用,因此重大重写并不划算。

以此为例,GWT 为解析和格式化日期提供了出色的 i18n 支持。但是实现与 JRE 的实现方式不同。

所以我正在寻找一种切割方式,我可以将实现注入到我的 DateTime 类的外壳中,具体取决于它是在客户端(使用 GWT 和本机 JS)还是在服务器中(使用 JRE )。有没有巧妙的方法来做到这一点?也许使用模块文件 XXXXX.gwt.xml。我正在寻找一个通用的解决方案。

【问题讨论】:

    标签: gwt client rpc


    【解决方案1】:

    我认为您正在寻找的是:<source path="client" /> 在您的项目 gwt.xml 文件中。它告诉 GWT 生成器在哪里寻找要转换为 JS 的客户端代码。在我的项目中,我是这样设置的:

    <source path="client" />
    <source path="shared" />
    

    基本上客户端代码在客户端目录中,并且在共享中我们为客户端和服务器端保留bean和一些数据包装器。

    你可以做的,是添加你想要转换到客户端的包,上面的源路径。但是您必须记住,您要转换的类只能由 GWT 生成器可以转换为客户端 java 脚本的对象和属性组成。我也不确定是否可以在源路径中放置更准确的路径,例如:

    <source path="shared/beans/whatever" />
    

    另一个缺点是,如果您使用 GWT i18n 支持,它会在编译时自行处理不同的语言环境 - 这很好。如果您决定使用自己的机制,您的类必须包含一些逻辑以了解当前使用的语言环境,这些逻辑必须与 GWT 兼容。

    【讨论】:

    • 这不是被问到的。他有多个在客户端和服务器上使用的类(是的,通常是共享的),但是这些类包含非 GWT JRE 代码,因此它们只能在服务器上工作。
    • 创建相同的类但具有不同的实现让我的眼睛受伤。对我来说,这将破坏设计合同,程序员必须知道下面的实现。难道没有一种方法可以在该接口之后使用两个不同的类来实现接口吗?这就是你的问题将得到解决的方式(如果你问我)。
    • @John - 我提到它不适用于包含非 GWT 代码的类。也许我对此不是很清楚。
    【解决方案2】:

    您希望使用&lt;super-source&gt;用另一个包实现覆盖。 这就是 GWT 用来模拟 Java Runtime 类的方法,并且(除其他外)为 com.google.gwt.regexp.shared.* 类的客户端和服务器提供不同的实现。

    【讨论】:

    • 超级源真的是覆盖其他实现还是只是添加?我在文档中找不到 overriding 方面(但会很棒)。
    • 在逐个文件的基础上,它会覆盖。就好像它出现在类路径的早期(这实际上就是它的实现方式(有点);参见code.google.com/p/google-web-toolkit/wiki/ResourceOracle
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多