GWT:Gotcha's

时间:2009-05-12 15:16:59

标签: java swing gwt

我的团队正着手实施第一个GWT项目。我们对Swing应用程序非常强大,几乎所有的工作都涉及重要的Swing GUI。

然而,这是我们第一次远离桌面和Web,项目要求我们使用GWT。项目本身非常直接,我们唯一不知道用GWT UI替换Swing UI。

我们应该注意哪些陷阱?

8 个答案:

答案 0 :(得分:11)

我能想到一些:

  • 一切都是异步的。好吧,任何服务导向无论如何。虽然Swing有时通过SwingWorkers等行事,但Swing基本上是通过EDT(事件调度线程)同步的。它可能需要一点时间习惯;
  • 你正处于一个被称为CSS和跨浏览器兼容性的伤害世界。虽然GWT确实掩盖了浏览器之间的许多差异,但它肯定不会掩盖它们,你可以花费数小时在GWT中寻找像素线的来源,就像在普通网站中一样;
  • Swing的资源远远少于GWT;
  • 您只能在客户端使用某些类。曾经常常引起我问题的是BigDecimal;
  • 您对小部件的选择更加有限。无论你做什么都避免像瘟疫那样的ExtGWT。 Daryls就像Generics的Jeffrey Dahmer;
  • 确保使用GWT 1.6;
  • GWT上的编译时间太可怕了;
  • 如果您只是进行客户端更改(即您没有更改任何服务接口),则无需重建即可查看这些更改。只需在托管浏览器中刷新;
  • 对于不更改接口的服务器端代码的更改,请确保您有一个Ant或Maven任务来重建和重新部署您的类而不进行GWT重建;
  • 您可以将托管浏览器指向托管服务器以外的其他内容并使用它进行调试;和
  • 确保您的计算机有大量内存。某些应用程序上的我的IDE会因内存错误而导致内存不足错误,而这些内存不是很大的应用程序。我真的建议2gigs系统RAM绝对最小,最好是3或更多。

答案 1 :(得分:7)

不使用GINGuice依赖注入非常非常有用。 GIN(GWT的Guice)没有很好的记录,但值得花时间投入使用它。

答案 2 :(得分:3)

为了扩展Cletus关于“某些类”的内容,您在GWT客户端没有完整的JRE。 (请记住,GWT Java客户端代码已转换为JavaScript。)这意味着第三方Java API通常无法在客户端工作。他们需要移植到GWT。写一次,到处运行。有关此限制的详细信息,请参阅here

答案 3 :(得分:2)

不同的浏览器具有完全不同的性能特征,因此即使GWT为浏览器差异生成Javascript变通方法,您也必须针对不同的浏览器进行测试。

在某些浏览器中创建DOM元素可能会非常慢。如果您经常更改大型表(数十行),则只要删除所有行并重新创建它们,浏览器就会无响应。我们必须编写一个diffing算法,以便在从服务器获取新内容时有效地更新表。

答案 4 :(得分:1)

其中大部分仍与您想要做的事情100%相关:

Biggest GWT Pitfalls?

专门解决Swing - > GWT Transition有一个简单的规则:

  • GWT不是Swing,要构建一个好的应用程序,你总是必须知道你正在创建的小部件会产生什么样的HTML,并且你不得不一次又一次地弄脏和修改一些行为或甚至用javascript或HTML编写一些自定义部分。

答案 5 :(得分:1)

要记住的一个主要问题是测试。使用junit测试swing应用程序大多是直截了当的,但为了在gwt应用程序上获得该级别的覆盖范围,您需要扩展您的武器库。

  1. Straight junit - 这适用于不引用任何gwt运行时的模型类/实用程序。只需按正常junit编写并运行测试,只需确保gwt不会尝试将测试代码编译到模块中。你不能总是将你的课程考虑在内,以获得这种覆盖,但是当你能够做到这一点时,它会非常快速。
  2. GWTTestCase / junit - 这是一个特殊的TestCase子类(junit3-style),它将为测试运行引导一些gwt运行时。根据我的经验,很难获得良好的覆盖率而且太慢而无法发挥作用。有关此主题的更多信息,请阅读this
  3. Selenium - 这将让你在浏览器中覆盖(并且是我个人最喜欢的方法)。如果你使用java selenium-rc并将它与jetty结合起来提供你的测试应用程序,你甚至可以模拟出rpc调用以完全测试你的ui。您还可以在所有主流浏览器中运行测试。

答案 6 :(得分:0)

我遇到了一个问题,试图通过嵌套集合填充表格不起作用,大概是因为编译器不理解它(问题@ GWT list)。请注意,这是大约一年前,所以可能不再是这种情况。

第二个问题(再次,一年前,可能不再是这种情况)是不支持在64位盒子上编译64位JVM,所以我最终需要一个单独的32位jvm并包装一个特别引用GWT编译设置的ant任务。

答案 7 :(得分:0)

即使有4个内存RAM,您也可能会在编译应用程序时出现问题(在GWT 1.6和之前)。我无法使用Maven /其他任何东西在工作中编译我们的(相当大的)应用程序。托管模式工作正常,但没有设置(提高vm内存约束到2演出等)似乎解决了这个问题。