GWT客户端和同一类的服务器实现

时间:2011-03-18 08:05:23

标签: gwt client rpc

有没有办法在客户端与服务器上实现不同的类?

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

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

客户端和服务器共有的几个类包含来回传递的数据。这些类还包含一些使用标准JRE类实现的行为。例如,一个类以特定于语言环境的方式包含,解析和格式化日期和时间,包括时区,DST等。我可以重写/重构它,但是应用程序超过1000万SLOC,结果只有数百万个引用这个类,所以重大改写不符合成本效益。

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

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

2 个答案:

答案 0 :(得分:5)

您希望使用<super-source>覆盖一个包实现与另一个。 这是GWT用来模拟Java运行时类的,并且(以及其他)为com.google.gwt.regexp.shared.*类的客户端和服务器提供了不同的实现。

答案 1 :(得分:0)

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

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

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

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

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

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