2011-03-18 113 views
9

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

为了避免“你为什么想这么做?”问题..我会详述

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

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

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

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

回答

0

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

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

基本上客户端代码在客户端目录,并共享我们不断豆类和客户端和服务器端的一些数据包装。

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

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

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

+1

这不是问什么。他有多个在客户端和服务器上使用的类(是的,通常是共享的),但这些类包含非GWT JRE代码,因此它们只能在服务器上运行。 – John 2011-03-18 11:24:43

+1

制作相同的课程但实施方式不同会使我的眼睛受伤。对我来说,这将制约设计合同,程序员必须知道下面的实现是什么。没有一种方法可以在接口之后使用两个不同的类来实现接口实现吗?这就是你的问题将得到解决的方式(如果你问我)。 – Sven 2011-03-18 16:15:29

+0

@John - 我提到它不适用于包含非GWT代码的类。也许我对此不是很清楚。 – jjczopek 2011-03-22 23:26:25

5

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

+0

超级源代码是否真的*覆盖*其他实现或只是添加?我在文档中找到了无处不在的地方(但会很棒)。 – xamde 2011-10-30 18:54:46

+1

在逐个文件的基础上,它会覆盖。就好像它在类路径中早些出现过的一样(实际上它是如何实现的(参见http://code.google.com/p/google-web-toolkit/wiki/ResourceOracle) – 2011-10-31 15:44:21