【问题标题】:GWT or not for enterprise apps [closed]GWT 是否适用于企业应用程序 [关闭]
【发布时间】:2012-07-09 14:16:58
【问题描述】:

我正在开发一种在应用引擎上创建企业级应用程序的工具。这个需要跨浏览器(也包括IE8),可以在手机上运行,​​以后也可以通过(Qt4/GTK/etc)支持桌面客户端

我一直面临的问题是:对于我的网络应用程序 - 我应该使用 GWT(GoogleWebToolkit) 还是不使用?

我很擅长使用“EXT-JS”,但由于它的开源政策,它不是一个选择。还有另一个框架“SmartClient”,它具有更好的开源许可证——它非常成熟并且比 EXT-JS(基于一些 POC)更好,但是它的文档很烂!我需要很多时间才能以正确的方式完成某件事。 SmartClient 和 EXT-JS 非常适合企业级应用程序(如果使用得当)——我在 Ext-JS 上体验过这一点,并且对 SmartClient 也非常肯定。

然后是“JQuery and addons and HTML5”这个组合。与上述库相比,我喜欢更快、更干净、更小的 JS。我对 HTML5 持怀疑态度,因为那是一个不断发展的标准

我真正喜欢 GWT 的地方在于它的性能优势。至少这些例子似乎效果很好。我不喜欢它的是 Java,我很擅长 javascript 对于我在 app-engine 的服务器端应用程序,我没有使用 Java,而是使用 Python。所以 rpc 将仅基于 json。 我们还没有准备好移动版,但这又是一个非常需要的版本,我们以后可能会使用 Sencha-touch。

我已经为所有这些都做了 POC,与 extjs 或 smartclient 相比,GWT 部署感觉快速和流畅。 GWT 会自动为我做很多事情。我也喜欢 gwt 呈现的“clean-html”。 我也很擅长使用 javascript,并且非常清楚那里发生的导致 javascript 地狱的“错误”。

(我不期待 ExtGWT 或 SmartGWT)

关于我是否应该切换到 GWT 或者它对企业级应用程序是否是一件好事有什么建议?

或者,如果有人曾使用 GWT 构建大型应用程序,有什么缺点(和优点)?

【问题讨论】:

  • 那么,你擅长 JS 而你不喜欢 Java?而且您不会在服务器端使用 Java,因此您甚至无法利用 GWT-RPC 或 RequestFactory?简而言之,您不想使用 GWT,为什么还要问是否应该使用?
  • 托马斯问得好。我应该提到我问的原因 - 它与生产力(和维护)有关。我从 SmartClient(和 Javascript)开始——服务器端固定为 Python——不幸的是,由于花在搜索解决方案和扫描文档上的时间,我对 SmartClient 感到不舒服。如果它为我简化和加速事情,我不介意使用 Java(我之前的大部分时间都在使用 c# 和一点 java)
  • 我最初在两年多前问过这个问题。那时我相信选择几乎是 ExtJS(或相当成熟的东西)......或 jQuery 以及围绕它的“太多”工具。今天,我将 AngularJS 与 Bootstrap 和围绕 javascript 的测试/部署工具一起使用。甚至 ReactJS 看起来也很有希望。作为对我的问题的回答 - 我会说“任何非 javascript 编译为 javascript 的东西”都应该避免,除非你有充分的理由走这条路。我放弃使用 EXTJS 或类似的东西(即使现在它也有一些很好的用途)......而且我大多不需要 jQuery

标签: gwt extjs smartgwt gxt smartclient


【解决方案1】:

对于已经在 J​​SP/JEE 和 HTML/Javascript 方面有丰富经验的人来说,GWT 只需要半天时间就可以理解。但是你需要两个月才能掌握。

以下是关于将技术与 GWT 相结合的建议,我相信这将使您的企业级应用程序取得成功。我认为您应该使用 GWT,因为它具有可调试性。但是可调试性是有代价的。 GWT 调试至少需要一台四核 8GB 的​​机器。如果您认为这不是真的,那可能是因为您找到了一种使您的 GWT UI 小而简单的方法。

Eclipse is getting Hang while debugging GWT application

RequiresResize、ProvidesResize 和 Layouts

在 GWT 中您需要掌握的第一件事是布局的简单概念,这些概念由接口 RequiresResize、ProvidesResize 决定。您需要确保从 RootLayoutPanel 到可调整大小的小部件的 RequiresResize/ProvidesResize 链必须不间断。你需要掌握在你的 UI 中构建 RequiresResize/ProvidesResize 的流程。否则,在调整浏览器大小时,您会看到一两个奇怪的悬垂的果实,它们的大小无法调整。

我认为应该不惜一切代价避免为每个小部件编写预定的调整大小而不是依赖于 Google 的 RequiresResize/ProvidesResize。否则,请记住在几次迭代中对调整大小进行去抖动。太多的试验/错误让我无法完善调整大小。

异步异步异步

你需要接受的下一个概念......我没有说“你需要学习”,但“你需要接受”是 Javascript 的异步行为,因此也是 GWT Java 的异步行为。是否使用 GWT 并不重要。您必须习惯于将控制权反转给被调用者以控制调用者的成功响应。

你不能写

List<Persons> persons = server.getData(personId);

你必须屈服于做事

server.getData(personId, new Callback<Persons>(){
  @override public void onSuccess(Person person){ ..... }
  @override public void onFailure(Exception ex){ ..... }
});

你不会写

boolean doOrNot = ConfirmDialogBox();

你必须写

ConfirmDialogBox(new CloseHandler(){
  public void onAccept(Person person){ ...}
  public void onCancel(){ ... }
});

GWT 是 Java 但不是 Java

我对不断尝试使用 apache 字节码 jar 与 GWT 客户端进行编译的人的存在感到很有趣,GWT 客户端是用 Java 编写的 Javascript。

Binary Data and GWT

GWT 可视化客户端

我发现的最佳组合是 GWT 2.4.0 和 Sencha gxt 2.2.5。

我避免使用 GXT-Uibinder 项目,因为我发现它对 3rd 方 GWT 框架的其他组合施加了不便的限制。特别是那些严重依赖 GWT.create() 生成器的框架。 GXT-Uibinder 是 Sencha 之外的一个项目。

GXT 2.2 及以下版本要求我编写包装器以使其可用于 uibinder,因为我拒绝使用 kludgy GXT-uibinder 项目。由于一个愚蠢的错位,包装器是必要的。任何在 uibinder 中用作父窗口小部件节点的类都必须实现 GWT HasWidgets,这需要实现一个返回 iterator&lt;Widget&gt; 的方法。不幸的是,GXT 2.2 已经实现了 iterator() 方法,它返回错误的泛化迭代器。

GXT 3 解决了这个问题。我认为 GXT 3 包含 GXT-uibinder 但您不必使用它。您不必使用 GXT 3 编写太多包装(不使用 GXT-uibinder)即可将其与 uibinder 一起使用。但我发现 GXT 3 仍然有一些古怪的错误行为,试图解决这些问题并不值得我花时间。所以我坚持使用 GXT 2.2.5,直到 GXT 3 稳定下来。

我创建了用于包装 SmartGWT (uibinding-smartgwt) 的 google 代码项目。 SmartGWT 是一个非常自私的框架。如果我尝试将它与 GWT vanilla 混合,我的努力通常会导致灾难。这是由于 SmartClient 和 GWT 的小部件之间存在某种 Z 索引。

如果您出于许可问题决定使用 SmartGWT,则必须确保仅使用 SmartGWT,而不是与任何其他 Widget 提供程序一起使用。甚至没有 GWT 香草。你很可能需要使用我的 uibinding-smartgwt 项目。我正在尝试增强它以使用一些更新的 uibinder 功能并将非可视元素重新定义为不是小部件,但我目前对 GXT 的使用过于复杂,同时考虑这两个框架让我感到困惑。因为他们的行为不同。

虽然 GXT 3 似乎已完全与 GWT 保持一致,但 SmartGWT 并没有表现出任何这样做的努力。 3rd 方小部件提供者与 GWT 之间的完全对齐,以便它顺利地实现 GWT 的接口是绝对必要的,以避免浪费大量时间不得不在 kludges 之后编写 kludges 以解决一些小的视觉问题。是的,尤其是 ProvidesResize/RequiresResize 架构。

永远不要使用 GWT 孵化。尝试它们,然后尝试使您的项目可维护、可持续和可增强。我们甚至不去那里。

客户端-服务器通信

不要使用 GWT-RPC。不要。除了学习 GWT 的方便。

RPC 适用于您无意超出演示阶段和几乎不可用阶段的简单应用程序。不编写分布式/扩展企业级应用程序的程序员可能不会同意我的观点。

单元测试对开发您的应用非常有帮助。首先忘记所有那些单元测试框架。仅仅能够编写一个简单的例程来测试每个小功能而不涉及应用程序的巨大画面是非常重要的。例如,我只想测试骆驼化循环以使其工作。 GWT-RPC 给您的正式/非正式单元测试带来极大的不便。

我非常喜欢在 GWT 客户端使用 JAX-RS REST-RPC thro RestGWT 和在服务器端使用 RestEasy。我将 JAX-B 与 RestEasy 的 Jackson JSON 处理实现结合使用。您可以尝试使用 Jersey,而不是 Resteasy。

通过这种方式,我可以使用 FireFox REST 客户端来测试独立于 GWT 的服务器。事实上,在客户端使用 GWT 启动项目后,您可以扩展应用程序以使用非 GWT 客户端(如 JQuery)作为 REST 服务的客户端。

REST 还使您可以轻松编写代理/隧道服务器,让您克服浏览器的 SLD-SO-P(“二级域,同源”策略)安全限制。然而,GWT-RPC 的数据格式是故意无法破译和不稳定的(我不明白谷歌工程师在增加安全性背后的想法,因为你仍然可以看到人类可读文本的点点滴滴),我没有尝试写隧道 GWT-RPC 服务的代理。我不知道它的可行性。

http://h2g2java.blessedgeek.com/2011/11/gwt-with-jax-rs-aka-rpcrest-part-0.html.

顺便说一句,克服 sld-sop 的脚本包含是非常糟糕的主意。想都别想。

持久性

用于非 GAE 的休眠 JPA。 Eclipselink JPA for GAE 与 Google 的 MySQL 用于 GAE 的 DataNucleus JPA 与 Google 数据存储。

最初,我接受了 JDO 的想法。我非常努力,JDO 不断给我带来冲突。我放弃。最初,Google 似乎一直在努力说服我们 JDO 是优秀的 JPA。不管是真是假,到目前为止,我还没有获得使用 JDO 持久性的技能。而且由于我也必须为非 GAE 编程,所以我不想让 JDO 的复杂性影响我的思想。

我提到这个的原因是因为我倾向于使用与 JAX-RS POJO 相同的 JPA POJO。这意味着,我发现 JPA、JAX-RS、JAXB 和 Jackson 注释混合到同一个 POJO-DTO 中,没有冲突。我经常在 GWT 客户端、JAX_RS 服务器和 JPA 持久性之间共享一组 POJO(有一些例外)。要实现这一点,您必须有一个限制——所有 DTO 都必须是 GWT 可序列化的。不仅仅是可序列化的。尽可能避免编写 dto 转换器。浪费时间拥有三组不同的 POJO-DTO,然后在它们之间使用转换器。

MVP

我发现 MVP4G 是一个非常易于管理的 MVP 框架。以下讨论演示了我如何使用 MVP4G:

https://groups.google.com/forum/?fromgroups#!searchin/mvp4g/blessedgeek/mvp4g/T6r7egk-3Kk/Jz-dTqZDeMIJ

MVP 是一种非常有用的模式。因为它可以帮助我区分“关注点”。当您能够分离关注点时,您就可以单独测试和解决问题。它还可以帮助您增强/扩展您的项目,并尽可能减少来自应用程序迷宫的其他关注点/模块的干扰/纠缠。

MVP4G 还简化了单元测试,因为您可以简单地模拟视图或演示者,或者使用简化的事件总线/状态机仅调试您需要调试的部分。并且由于它的模块化,您可以轻松避免非测试类的污染,这样您就可以在不破坏生产类的情况下删除测试源树。 IOW,您不必修改非测试类来测试它们。

【讨论】:

  • 您说 - “不要使用 GWT 孵化?”什么是GWT孵化???并感谢您的详细解释... ...异步与 javascript 相同-使用 web 2.0 平面 UI ...Persitence-我同意您提到的 JDO 部分..在我的应用程序中,持久性由 Python 的东西处理基本的低级 apis - 我发现那些对我正在创建的东西很强大......客户端服务器 - 对我来说,它主要是基于 json 的......MVP - 有(某种)需要的东西。
【解决方案2】:

我应该使用 X 还是 Y 等问题始终取决于您使用这些工具的经验和要求。 如果您不知道如何使用它并且除了“我想构建一个应用程序”之外没有其他要求,那么最好的工具/框架一文不值,我建议使用您感觉最好的工具。

经常解释 GWT 的优缺点。我认为它没有必要重复。

您好, 彼得

【讨论】:

  • 谢谢 Peter...我无法使用 JS 构建自己的框架...而且我是 GWT 或 SmartClient 框架的初学者 - 两者都会为我呈现学习曲线(除了我学到的在 POC 期间)。不幸的是,SmartClient 的文档和示例让我很难完成工作。如果是 ExtJS,我就不会回头了。 GWT 非常简单——但我不知道它长大后的样子。如果 GWT 能提高我学习后的工作效率,我不介意学习 GWT 或采用 Java 方式。而且我想偷懒,不做 GWT 会为我做的事情。
【解决方案3】:

我的项目主要使用纯 GWT
但是,您必须花费一些时间来创建自定义小部件并根据您的需要对其进行样式设置。

除了您已经得到的建议,您还可以查看VaadinJboss Errai

我非常喜欢 Errai 的 UI 模板,您可以在 screencast 中查看。

Vaading 提供了一个吸引人的小部件集,并且还将在版本 7 中使用 GWT 作为核心。
两人(JBoss 和 Vaadin)都是未来 GWT 开发的指导委员会成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2012-05-02
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多