GWT是否适用于企业应用程序

GWT是否适用于企业应用程序,gwt,extjs,smartgwt,gxt,smartclient,Gwt,Extjs,Smartgwt,Gxt,Smartclient,我正在开发一个在AppEngine上创建企业级应用程序的工具。这需要跨浏览器,也包括IE8,在移动设备上工作,并且在稍后的时间点还通过Qt4/GTK/etc支持桌面客户端 我一直面临的问题是:对于我的web应用程序,我是否应该使用GWTGoogleWebToolkit 我非常擅长使用EXT-JS,但由于其开源政策,这不是一个选择。还有另一个框架SmartClient拥有更好的开源许可证——它相当成熟,比基于某些POC的EXT-JS要好,但它的文档很烂!我花了很多时间以正确的方式完成某件事。 当正

我正在开发一个在AppEngine上创建企业级应用程序的工具。这需要跨浏览器,也包括IE8,在移动设备上工作,并且在稍后的时间点还通过Qt4/GTK/etc支持桌面客户端

我一直面临的问题是:对于我的web应用程序,我是否应该使用GWTGoogleWebToolkit

我非常擅长使用EXT-JS,但由于其开源政策,这不是一个选择。还有另一个框架SmartClient拥有更好的开源许可证——它相当成熟,比基于某些POC的EXT-JS要好,但它的文档很烂!我花了很多时间以正确的方式完成某件事。 当正确使用时,SmartClient和EXT-JS对于企业级应用程序来说是非常好的—我在EXT-JS中体验过这一点,在SmartClient上也非常肯定

然后是JQuery、插件和HTML5的组合。与上面的libs相比,我喜欢更快、更干净、更小的JS。我对HTML5持怀疑态度,因为这是一个不断发展的标准

我真正喜欢GWT的是它的性能优势。至少这些例子似乎很有效。我不喜欢的是Java,我非常擅长javascript 对于我在AppEngine的服务器端应用程序,我使用的不是Java,而是Python。因此,rpc将仅基于json。 我们目前还没有手机版本,但这也是我们以后非常需要的版本,我们以后可能会使用Sencha touch

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

我并不期待ExtGWT或SmartGWT

对于是否应该切换到GWT,或者对于企业级应用程序来说这是件好事,有什么建议吗


或者,如果有人有使用GWT构建大型应用程序的经验,那么利与弊是什么?

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

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

您好,
Peter

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

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

您好,
Peter

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

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

要求调整大小,提供调整大小和布局

在GWT中,您需要掌握的第一件事是由接口RequiresResize、providesize指定的布局的简单概念。您需要确保从RootLayoutPanel到可调整大小的小部件的RequiresResize/ProvidesResize链必须是完整的。您需要掌握UI中RequiresResize/ProvidesResize流程的架构。否则,在调整浏览器的大小时,您会看到一个或两个奇怪的挂果,它们突出显示为不可编辑

我认为应该不惜一切代价避免为每个小部件编写预定的大小调整程序,而不是依赖Google的Requiresize/ProvidesResize。否则,请记住在几次迭代中取消调整大小。太多的尝试/错误让我无法完美地调整大小

异步异步

你需要接受的下一个概念。。。我并没有说您需要学习,但您需要接受Javascript的异步行为,从而接受GWT Java的异步行为。是否使用GWT并不重要。您必须习惯于赋予被调用方的控制反转,以控制调用方的成功响应

你不能写字

List<Persons> persons = server.getData(personId);
你必须写作

ConfirmDialogBox(new CloseHandler(){
  public void onAccept(Person person){ ...}
  public void onCancel(){ ... }
});
GWT是Java,但不是Java

我对不断有人试图使用apache字节码jar与GWT客户机进行编译感到有趣,GWT客户机是用Java编写的Javascript

可视化 艾尔客户

我发现的最佳组合是GWT2.4.0和Sencha gxt 2.2.5

我避免使用GXT Uibinder项目,因为我发现它对第三方GWT框架的其他组合设置了不方便的限制。特别是那些严重依赖GWT.creategenerator的框架。GXT Uibinder是Sencha以外的一个项目

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

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

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

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

虽然GXT 3似乎已经完全与GWT保持一致,但SmartGWT并没有为此做出任何努力。第三方widget提供者与GWT之间的完全一致性是绝对必要的,这样它就可以顺利地实现GWT的接口,以避免浪费大量的时间,不得不一次又一次地编写kludges来解决一些次要的视觉问题。是的,尤其是ProvidesResize/RequiresResize架构

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

客户机-服务器通信

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

RPC适用于简单的应用程序,您不打算将其角色扩展到演示阶段和几乎不可用的阶段。不编写分布式/分散式企业级应用程序的程序员可能不会同意我的观点

单元测试对开发应用程序非常有帮助。先忘掉那些单元测试框架吧。能够编写一个简单的例程来测试每个小功能,而不涉及应用程序的巨大图片,这是非常关键的。例如,我只想测试camelization循环以使其工作。GWT-RPC对于进行正式/非正式的单元测试是一个极大的不便

我非常喜欢在GWT客户端通过RestGWT使用JAX-RSREST-RPC,在服务器端使用RestEasy。我将JAX-B与RestEasy的Jackson JSON处理实现结合使用。您可以尝试使用运动衫,而不是Resteasy

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

REST还可以让您轻松编写代理/隧道服务器,从而克服浏览器的SLD-SO-p二级域、同源策略安全限制。然而,GWT-RPC的数据格式是故意不可解析和不稳定的,我不理解谷歌工程师在这如何提高安全性背后的想法,因为你仍然可以看到人类可读的文本,我没有尝试编写代理来隧道GWT-RPC服务。我不知道这有多可行

顺便说一句,脚本包括克服sld sop是非常糟糕的想法。想都别想

坚持

Hibernate JPA用于非GAE。 谷歌MySQL为GAE提供Eclipselink JPA DataNucleus JPA用于GAE和Google数据存储

最初,我接受了JDO的想法。我尽了很大的努力,但JDO总是给我带来冲突。我放弃了。起初,谷歌似乎一直在努力说服我们JDO优于JPA。不管这是真是假,到目前为止,我还没有掌握使用JDO持久性的技能。由于我也必须为非GAE编程,我不想让JDO的复杂性污染我的头脑

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

MVP

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

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


MVP4G还使单元测试变得容易,因为您可以简单地模拟视图或演示者,或者使用简化的eventbus/状态机只调试需要调试的部分。由于它的模块性,您可以很容易地避免非测试类的污染,这样您就可以删除测试源代码树而不破坏生产类。照此看来,您不必修改非测试类来测试它们。

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

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

要求调整大小,提供调整大小和布局

在GWT中,您需要掌握的第一件事是由接口RequiresResize、providesize指定的布局的简单概念。您需要确保从RootLayoutPanel到可调整大小的小部件的RequiresResize/ProvidesResize链必须是完整的。您需要掌握UI中RequiresResize/ProvidesResize流程的架构。否则,在调整浏览器的大小时,您会看到一个或两个奇怪的挂果,它们突出显示为不可编辑

我认为应该不惜一切代价避免为每个小部件编写预定的大小调整程序,而不是依赖Google的Requiresize/ProvidesResize。否则,请记住在几次迭代中取消调整大小。太多的尝试/错误让我无法完美地调整大小

异步异步

你需要接受的下一个概念。。。我并没有说您需要学习,但您需要接受Javascript的异步行为,从而接受GWT Java的异步行为。是否使用GWT并不重要。您必须习惯于赋予被调用方的控制反转,以控制调用方的成功响应

你不能写字

List<Persons> persons = server.getData(personId);
你必须写作

ConfirmDialogBox(new CloseHandler(){
  public void onAccept(Person person){ ...}
  public void onCancel(){ ... }
});
GWT是Java,但不是Java

我对不断有人试图使用apache字节码jar与GWT客户机进行编译感到有趣,GWT客户机是用Java编写的Javascript

GWT可视客户端

我发现的最佳组合是GWT2.4.0和Sencha gxt 2.2.5

我避免使用GXT Uibinder项目,因为我发现它对第三方GWT框架的其他组合设置了不方便的限制。特别是那些严重依赖GWT.creategenerator的框架。GXT Uibinder是Sencha以外的一个项目

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

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

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

如果由于许可问题而决定使用SmartGWT s、 您必须确保仅使用SmartGWT,而不与任何其他小部件提供商一起使用。甚至连香草都没有。您很可能需要使用我的uibinding smartgwt项目。我试图使用一些更新的uibinder特性来增强它,并将非可视元素重新定义为widget,但我目前对GXT的使用过于复杂,同时考虑这两个框架让我感到困惑。因为他们的行为不同

虽然GXT 3似乎已经完全与GWT保持一致,但SmartGWT并没有为此做出任何努力。第三方widget提供者与GWT之间的完全一致性是绝对必要的,这样它就可以顺利地实现GWT的接口,以避免浪费大量的时间,不得不一次又一次地编写kludges来解决一些次要的视觉问题。是的,尤其是ProvidesResize/RequiresResize架构

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

客户机-服务器通信

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

RPC适用于简单的应用程序,您不打算将其角色扩展到演示阶段和几乎不可用的阶段。不编写分布式/分散式企业级应用程序的程序员可能不会同意我的观点

单元测试对开发应用程序非常有帮助。先忘掉那些单元测试框架吧。能够编写一个简单的例程来测试每个小功能,而不涉及应用程序的巨大图片,这是非常关键的。例如,我只想测试camelization循环以使其工作。GWT-RPC对于进行正式/非正式的单元测试是一个极大的不便

我非常喜欢在GWT客户端通过RestGWT使用JAX-RSREST-RPC,在服务器端使用RestEasy。我将JAX-B与RestEasy的Jackson JSON处理实现结合使用。您可以尝试使用运动衫,而不是Resteasy

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

REST还可以让您轻松编写代理/隧道服务器,从而克服浏览器的SLD-SO-p二级域、同源策略安全限制。然而,GWT-RPC的数据格式是故意不可解析和不稳定的,我不理解谷歌工程师在这如何提高安全性背后的想法,因为你仍然可以看到人类可读的文本,我没有尝试编写代理来隧道GWT-RPC服务。我不知道这有多可行

顺便说一句,脚本包括克服sld sop是非常糟糕的想法。想都别想

坚持

Hibernate JPA用于非GAE。 谷歌MySQL为GAE提供Eclipselink JPA DataNucleus JPA用于GAE和Google数据存储

最初,我接受了JDO的想法。我尽了很大的努力,但JDO总是给我带来冲突。我放弃了。起初,谷歌似乎一直在努力说服我们JDO优于JPA。不管这是真是假,到目前为止,我还没有掌握使用JDO持久性的技能。由于我也必须为非GAE编程,我不想让JDO的复杂性污染我的头脑

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

MVP

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

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

MVP4G还使单元测试变得容易,因为您可以简单地模拟视图或演示者,或者使用简化的eventbus/状态机只调试需要调试的部分。由于它的模块性,您可以很容易地避免非测试类的污染,这样您就可以删除测试源代码树而不破坏生产类。这样,您就不必修改非测试类来测试它们了。

我的项目大多使用纯GWT。 然而哟 你必须投入一些时间来创建定制的小部件,并根据你的需要设计它们的样式

除了你已经得到的建议外,你还可以查看并查看

我真的很喜欢Errai的UI模板,你可以在这里查看

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

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

除了你已经得到的建议外,你还可以查看并查看

我真的很喜欢Errai的UI模板,你可以在这里查看

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

那么,你擅长JS,却不喜欢Java?而且您不会在服务器端使用Java,所以您甚至不能利用GWT-RPC或RequestFactory?简言之,您不想使用GWT,那么为什么要问您是否应该使用GWT呢?好问题Thomas。我应该提到我提问的原因——这是关于生产力和维护的。我从SmartClient和Javascript开始—服务器端固定为Python—不幸的是,由于花在搜索解决方案和扫描文档上的时间,我对SmartClient感到不舒服。我不介意使用Java,如果它能简化和加速我大部分时间使用的东西,我在使用c语言和一些Java的时候,2年前我就开始问这个问题了。当时我相信选择的是ExtJS或者相当成熟的东西。。。或者jQuery和它周围太多的工具。今天,我将使用AngularJS和围绕javascript的引导和测试/部署工具。即使是ReactJS看起来也很有前途。作为对我问题的回答——我想说,任何非javascript编译成javascript的东西都应该避免,除非你有很好的理由这样做。我不再使用EXTJS或类似的东西了,即使是现在,它也有一些很好的用途。。。我基本上不需要jQuerySo,你擅长JS,不喜欢Java?而且您不会在服务器端使用Java,所以您甚至不能利用GWT-RPC或RequestFactory?简言之,您不想使用GWT,那么为什么要问您是否应该使用GWT呢?好问题Thomas。我应该提到我提问的原因——这是关于生产力和维护的。我从SmartClient和Javascript开始—服务器端固定为Python—不幸的是,由于花在搜索解决方案和扫描文档上的时间,我对SmartClient感到不舒服。我不介意使用Java,如果它能简化和加速我大部分时间使用的东西,我在使用c语言和一些Java的时候,2年前我就开始问这个问题了。当时我相信选择的是ExtJS或者相当成熟的东西。。。或者jQuery和它周围太多的工具。今天,我将使用AngularJS和围绕javascript的引导和测试/部署工具。即使是ReactJS看起来也很有前途。作为对我问题的回答——我想说,任何非javascript编译成javascript的东西都应该避免,除非你有很好的理由这样做。我不再使用EXTJS或类似的东西了,即使是现在,它也有一些很好的用途。。。我基本上不需要JQueryTanks Peter。。。我无法使用JS构建自己的框架。。。我是GWT或SmartClient框架的初学者——除了在POC中学到的东西之外,这两种框架都将为我呈现一个学习曲线。不幸的是,SmartClient的文档和示例让我很难完成工作。如果是ExtJS,我就不会回头看。GWT非常简单,但我不知道它长大后会是什么样子。如果学习GWT能提高我的学习效率,我不介意学习GWT或采用Java方式。我想变得懒惰,不做GWT会为我做的事。谢谢彼得。。。我无法使用JS构建自己的框架。。。我是GWT或SmartClient框架的初学者——除了在POC中学到的东西之外,这两种框架都将为我呈现一个学习曲线。不幸的是,SmartClient的文档和示例让我很难完成工作。如果是ExtJS,我就不会回头看。GWT非常简单,但我不知道它长大后会是什么样子。如果学习GWT能提高我的学习效率,我不介意学习GWT或采用Java方式。我想变得懒惰,不做GWT能为我做的事情。你说过——永远不要使用GWT孵化器?什么是GWT孵化???谢谢你的详细解释。。。Async与javascript相同-使用Web2.0平面UI…Persience-我同意您提到的JDO部分。。在我的应用程序中,持久性是由Python的东西和基本的低级API来处理的——我发现这些API对于我正在创建的东西来说非常强大……客户机服务器——对于我来说,它是我的
它主要是基于json的…MVP-有一种需要的东西。你说过-永远不要使用GWT孵化器?什么是GWT孵化???谢谢你的详细解释。。。Async与javascript相同-使用Web2.0平面UI…Persience-我同意您提到的JDO部分。。在我的应用程序中,持久性由Python和基本的低级API来处理——我发现这些API对于我正在创建的东西来说非常强大……客户机服务器——对我来说,它主要是基于json的……MVP——对于所需要的东西来说,有一种功能。