我工作的一个工具来创建应用程序引擎企业级应用。 这种通过必须是跨浏览器(也包括IE8),适用于手机,并在以后的时间点还支持桌面客户端(的Qt4 / GTK /等)
我一直面临的问题是这样的:我的web应用程序 - 我应该使用GWT(GoogleWebToolkit)或不?
我在使用“EXT-JS”不错,但它不是一个选择,因为它的开源政策。 还有另一种框架“的SmartClient”其中有一个更好的开源授权 - 它非常成熟,比EXT-JS(基于一些的POC)更好,但它的文档太差劲了! 我花了很多时间来得到的东西在一个正确的方式来完成。 SmartClient的和EXT-JS是企业级应用程序(只要正确使用)相当不错的 - 我与EXT-JS经历了这并非常肯定的SmartClient上过。
再有就是这个组合“jQuery和插件和HTML5”。 我爱的更快,更清洁和更小的JS相比,上述库。 我很怀疑,因为HTML5这就是一个不断发展的标准
我真的很喜欢GWT是它的性能优势。 至少应例子似乎工作的伟大。 我不喜欢它是Java和我在JavaScript来我的服务器端应用程序相当不错的应用程序引擎我没有使用Java - 但Python的。 所以RPC将仅基于JSON。 我们并没有在平板上的移动版还,但一个非常需要的版本稍后再那我们可以在以后使用煎茶触摸了点。
我做的POC所有这些和GWT部署感觉快速和平稳相比,ExtJS的或SmartClient的。 而且有很多的东西,GWT自动完成对我来说。 此外,我爱“干净的HTML”通过GWT呈现。 我在使用JavaScript也和心知肚明的“失误”这种情况发生有导致的JavaScript地狱不错。
(我并不期待ExtGWT或SmartGWT的)
任何建议我是否应该切换到GWT或者是企业级应用的好事吗?
或是否有人在使用GWT经历了建设大型的应用程序,是什么利弊(和优点)?
有人谁已经在JSP / JEE和HTML / JavaScript的丰富的经验,GWT将只需要半天时间来了解。 但是,它会带你两个月掌握。
下面是与GWT技术,相信会令您的企业级应用的成功相结合的建议。 我认为你应该使用,因为它可调试的GWT。 但是,可调试性是有代价的。 GWT调试至少需要四核8GB机。 如果你不觉得这是真实的,有可能是因为你已经找到了一种方法,使您的GWT UI小而简单。
Eclipse是越来越航在调试GWT应用
RequiresResize,ProvidesResize和布局
你需要在GWT掌握的第一件事是由接口RequiresResize,ProvidesResize决定布局的简单的概念。 您需要确保RequiresResize / ProvidesResize从RootLayoutPanel环比回落至可调整大小的小部件必须是完整的。 你需要掌握architectecting在UI RequiresResize / ProvidesResize的流动。 否则,当浏览器的大小时,你会看到一个或两个奇挂水果伸出unresizable。
我觉得写定大小调整为每个小部件,而不是依赖于谷歌的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字节码罐与GWT客户端编译逗乐了,GWT客户端的Javascript是用Java编写的。
二进制数据和GWT
GWT视觉客户端
我发现最好的组合是GWT 2.4.0与煎茶GXT 2.2.5。
我避免使用GXT-UiBinder的项目,因为我发现它放在第三方GWT框架的其他组合不便的限制。 特别是那些严重依赖GWT.create()发电机框架。 GXT-UiBinder的是煎茶之外的项目。
GXT 2.2及以下要求我写的包装,使其可用以UiBinder的,因为我拒绝使用缺憾GXT-UiBinder的项目。 包装是必要的,因为一个愚蠢的错位。 用作UiBinder的父节点插件任何类必须实现GWT HasWidgets,这需要实现一个方法返回iterator<Widget>
。 不幸的是,GXT 2.2--已经实现返回错误的泛型化迭代的iterator()方法。
GXT 3解决了这个问题。 我认为GXT 3结合GXT-UiBinder的,但你不必使用它。 你不必写与GXT三大部分包装(不使用GXT-UiBinder的)与UiBinder的使用它。 但我发现,GXT 3仍然有一些古怪的错误行为,并试图解决这些怪癖是不值得我的时间。 所以我坚持GXT 2.2.5直到GXT 3稳定。
我创办了谷歌代码项目包装SmartGWT的(uibinding-SmartGWT的)。 SmartGWT的是一种非常自私的 fraemwork。 我的努力往往会导致灾难,如果我尝试将它与GWT香草混合。 这是由于一些还挺SmartClient的和GWT的小部件之间的Z-索引。
如果你决定使用SmartGWT的由于许可的关注,你必须确保你只使用SmartGWT的,不与任何其他控件提供者。 甚至没有GWT香草。 你可能非常需要用我的uibinding-SmartGWT的项目。 我想,以提高其使用一些新的特点UiBinder的重新定义和非视觉元素不被小部件,但我目前使用GXT的简直是太参与,并在同一时间去思考这两个框架混淆了我。 因为他们的行为不同。
而GXT 3似乎与GWT完全一致,以取得自身,SmartGWT的并没有表现出任何努力这样做。 与GWT第三方控件提供者,使其顺利实现GWT的接口之间的完全一致是绝对必要的,以避免写组装机组装机后,解决一些轻微的可视问题浪费了大量的时间。 是的,尤其是ProvidesResize / RequiresResize架构。
千万不要使用GWT孵化。 试戴,然后尽量让你的项目维护,可持续和enhanceable。 我们甚至没有去那里。
客户端服务器通信
不要使用GWT-RPC。 不要。 除了学习GWT的便利。
RPC是好简单的应用程序,其作用你有没有超出演示阶段,勉强可用阶段的打算。 谁不写分布式编程人员/趴企业级应用可能不会同意我的看法。
单元测试是在开发应用程序非常有用。 忘掉所有这些单元测试框架第一。 只要能写一个简单的程序来测试每个小功能不涉及应用程序的巨大巨大的画面是非常重要的。 我只是想测试骆驼化循环,使其工作,例如。 GWT-RPC是朝着使你的正式/非正式单元测试的极度不便。
我非常吸引,使用JAX-RS REST-RPC救援人员到场对GWT客户端和RestEasy的服务器端RestGWT。 我结合使用JAX-B与RestEasy的的实施杰克逊JSON处理。 相反RestEasy的,你可以尝试使用新泽西州。
通过这种方式,我可以使用Firefox的REST客户端,测试服务器独立GWT的。 事实上,在启动客户端使用GWT项目后,可以扩展您的应用程序使用像jQuery非GWT客户作为客户端的REST服务。
REST也很容易让你写的代理/隧道服务器,让你克服SLD-SO-P浏览器(“二级域名,同根同源”的政策)的安全限制。 然而,GWT-RPC的数据格式是故意不可破译的和不稳定的(我不明白谷歌工程师的背后是如何提高安全性的心态,因为你仍然可以看到位和人类可读的文本块),我还没有尝试写代理隧道GWT-RPC服务。 我不知道它是多么可行的。
http://h2g2java.blessedgeek.com/2011/11/gwt-with-jax-rs-aka-rpcrest-part-0.html 。
BTW,脚本,包括克服SLD-SOP是非常糟糕的主意。 甚至不要去想它。
坚持
Hibernate的JPA非GAE。 JPA的EclipseLink为GAE与谷歌的MySQL的DataNucleus将JPA为GAE与谷歌的数据存储。
起初,我买了到JDO的想法。 我那么努力,和JDO一直给我的冲突。 我放弃。 最初,谷歌似乎一直在努力说服我们,JDO优越JPA。 无论是真的还是假的,我都未能获得技能使用JDO持久为止。 而且因为我必须对非GAE程序也一样,我不想弄脏我的心与JDO的复杂性。
我提到这一点的原因是因为我倾向于使用相同的JPA POJO与JAX-RS POJO。 这意味着,我发现,JPA,JAX-RS,JAXB和杰克逊注释组合到同一个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也可以很容易地进行单元测试,因为你可以简单地嘲笑一个视图或演讲,或使用一个简化的eventbus /状态机调试只需要调试的部分。 而且由于其模块化的,你可以很容易地避免你的非测试类的污染,这样你可以删除你的测试源代码树,不破坏您的生产类。 督察,你不必修改非测试类测试它们。
这样的问题,我应该使用X或Y总是依赖于使用这些工具的要求和你的经验。 最好的工具/框架是值得什么,如果你不知道如何使用它,如果你有比“我想建立一个应用程序”没有其他的要求,我会建议使用你觉得最好用的工具。
GWT的优点和缺点都相当经常explaind。 我认为它不是neccessary是重复的。
问候,彼得
我用的大多是纯GWT
为我的项目。
然而,你必须投资一些时间在创建自定义部件和他们的风格为您的需求。
除了你已经得到了建议,你也可以检查出Vaadin和Jboss的Errai 。
我真的很喜欢Errai的UI模板,您可以在此查看截屏 。
Vaading提供一个有吸引力的小工具集,并会在7版本使用GWT作为核心。
两者(JBoss和Vaadin)都在指导委员会未来的GWT的发展。