GWT:陷阱提示

9

我的团队正在开始我们的第一个GWT项目。我们在Swing应用程序方面非常强大,几乎所有的工作都涉及重要的Swing GUI。

然而,这是我们第一次迈向网络,并且项目要求我们使用GWT。该项目本身非常简单,唯一未知的是将Swing UI替换为GWT UI。

我们应该注意哪些陷阱?

8个回答

11
我能想到的有以下几点:
  • 一切都是异步的,至少针对任何面向服务的事物都是如此。虽然Swing有时候会通过SwingWorkers等方式表现出这种特性,但是Swing基本上是同步的通过EDT(事件调度线程)。这可能需要一些时间来适应;
  • 你将遭受CSS和跨浏览器兼容性问题的折磨。虽然GWT掩盖了许多浏览器之间的差异,但它肯定不能掩盖所有差异,你可以花费数小时寻找在GWT中的像常规网站一样的一行像素的源头;
  • 相比GWT,Swing支持资源更少;
  • 你只能在客户端使用某些类。曾经经常引起我的问题之一是BigDecimal;
  • 你的小部件选择范围要小得多。无论如何,要避免像灾难一样使用ExtGWT。 Daryls就像Generics的Jeffrey Dahmer一样;
  • 确保使用GWT 1.6版本;
  • GWT的编译时间非常可怕;
  • 如果您只是进行客户端更改(即不更改任何服务接口),则无需重新构建即可查看这些更改。只需在托管的浏览器中刷新即可;
  • 对于不更改接口的服务器端代码更改,请确保具有Ant或Maven任务以重新构建和重新部署您的类,而无需进行GWT重建;
  • 您可以将托管的浏览器指向其他托管服务器并使用它进行调试;以及
  • 确保您的计算机具有大量RAM。对于某些应用程序中的我的IDE,如果分配给它的内存少于1G,就会出现内存不足错误,这些应用程序并不是特别庞大。我真的强烈建议至少分配2个系统RAM绝对最小值,最好是3个或更多。

只是出于好奇,你为什么要避免使用ExtGWT? - Emil D

7

不使用GINGuice 依赖注入非常有用。 GIN(GWT的Guice)文档不是很好,但值得投入时间来使其工作。


可爱。你觉得他们是故意这样做的吗?我认为在这种情况下,喝饮料比抿一口更值得推荐。 - Mike Caron
GIN文档详尽 - GIN文档涵盖了GIN和Guice之间的所有差异。对于其他所有内容,请参阅Guice文档(我认为足够且写得好)- 没有必要在两个地方都放置相同的信息。 - Igor Klimer
1
这个问题我回答了几个月了。也许情况有所改善。不过我听人们谈论过一种叫做 UiBinder 的东西。 - a paid nerd

3
为了进一步说明Cletus所说的“某些类”,你在GWT客户端上没有完整的JRE。(请记住,GWT Java客户端代码被转换为JavaScript。)这意味着第三方Java API通常无法在客户端上运行。它们需要为GWT进行移植。所以所谓的“编写一次,随处运行”不再适用。有关此限制的更多信息,请参见此处

2
不同的浏览器具有非常不同的性能特点,因此即使GWT为浏览器差异生成了Javascript解决方案,您仍需要针对不同的浏览器进行测试。
在某些浏览器中,创建DOM元素可能非常慢。如果您有较大的表格(几十行)经常更改,如果只删除所有行并重新创建它们,则浏览器可能会变得无响应。我们不得不编写差分算法来有效地更新从服务器获取新内容时的表格。

1

这些大部分仍然与您想要做的内容100%相关:

GWT最大的陷阱是什么?

为了特别解决Swing -> GWT转换,有一个简单的规则:

  • GWT不是Swing,为了构建一个好的应用程序,您总是必须在某个层面上知道您正在创建的小部件将产生什么样的HTML,并且时不时地您将不得不深入其中并修改一些行为甚至编写一些自定义部分的javascript或HTML代码。

1

需要注意的一个主要问题是测试。使用JUnit测试Swing应用程序通常很简单,但为了在GWT应用程序上获得相同的覆盖率,您需要扩展您的工具库。

  1. Straight junit - 这适用于不引用任何gwt运行时的模型类/实用程序。只需像普通junit一样编写和运行测试,只需确保gwt不会将您的测试代码编译到您的模块中即可。您并不总是能够重构您的类以获得这种覆盖率,但当您可以时,它非常好且快速。
  2. GWTTestCase / junit - 这是一个特殊的TestCase子类(junit3风格),将为测试运行引导一些gwt运行时。根据我的经验,它很难获得良好的覆盖率,并且速度太慢而无法使用。阅读this以获取更多信息。
  3. Selenium - 这将在浏览器中为您提供覆盖范围(也是我个人最喜欢的方法)。如果您使用java selenium-rc并将其与jetty结合使用来提供您的应用程序下的测试,您甚至可以模拟rpc调用以完全测试您的ui。您还可以在所有主要浏览器中运行测试。

0

我遇到了一个问题,尝试通过嵌套集合来填充表格时失败了,可能是因为编译器无法理解它(问题@GWT list)。请注意,这是大约一年前的事情,所以现在可能已经不再是这样。

第二个问题(同样是一年前的事情,所以现在可能已经不再是这样)是,在64位JVM上编译64位框架不受支持,因此我最终需要一个单独的32位jvm,并包装一个ant任务,专门引用该任务进行GWT编译设置。


0
即使有4GB的RAM,编译应用程序时仍可能出现问题(在GWT 1.6及之前版本中)。我无法使用Maven/其他工具在工作中编译我们(相当大的)应用程序。托管模式可以正常工作,但是没有任何设置(增加vm内存限制到2GB等)似乎能够解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接