作者PsMonkey (痞子军团团长)
看板java
标题[乱翻] GWT 1.6 多了什麽新东西?
时间Sun May 31 22:56:57 2009
翻译自
http://code.google.com/intl/zh-TW/webtoolkit/doc/1.6/ReleaseNotes_1_6.html
也可以到
http://pt2wiki.twbbs.org/Wiki.jsp?page=GWT_1.6 看网页版 \囧/
------------------------------------------------------------------------
GWT 1.6 多了什麽新东西?
GWT 1.6 包含了下列几个内容:
→可以直接输出成 WAR 档
→更快的 compile 速度
→新的 widget
→更新、加强版的 event handling
→族繁不及备载...
另外,GWT 1.6 也修正了许多在 issue tracker 上头的 bug。
如果你还在用 GWT 1.5 版的话,更着下列的步骤就可以升级到 1.6 版啦...
新的内容
新的 Project 结构
GWT 1.6 版一个很大的改变就是 project 结构。旧的输出格式被换成标准的
Java web app「expanded war」格式,且预设的实际路径名称就是「/war」。
请注意,war 这个目录并不只是 compiler 的 output 目录,
里头也包含手动撰写的静态网页(或是其他 resource)是你想要跟 GWT module
放在一起的。也请注意到,「GWTShell」跟「GWTCompiler」会是留有它们作用,
不过它们在新版当中被宣告抛弃了,取代的是新的 HostedMode 跟 Compiler
工具来产生 war 的输出。当 1.6 版正式释出,我们会鼓励现有的 project
升级成新的目录格式,并且用新的工具来享受新版本的好处、
以及对於新版 GWT 的整合性。
在 GWT 发布的档案中提供了一个范例 project,里头有新版正确的 project 设定。
如果要知道新版 project 格式更多细节,请看 这里。
还有几个重要的改变:
→有 server 端程式码(GWT RPC)需要设定 /war/WEB-INF/web.xml。
这个档案必须定义、发布所有跟这个 web application 有关的 servlet。
另外,server 端需要的 library 也必须放在 /war/WEB-INF/lib 下。
例如,所有的 GWT RPC 都需要在这个目录下有 gwt-servlet.jar 这个档案。
→HTML 网页也不再放在 GWT module 中的 public 路径下。
我们反而建议开发者利用标准 web app 的行为,
直觉地将你的静态网页放置在 war 目录下。
举例来说,如果你希望在根目录的 JSP 网页载入一个 GWT module,
让这些手写的静态档案跟 GWT compiler 产生出来的档案分离,
之後再把他们摆在 module 指定的子目录当中。
所有希望内含有 GWT module 的网页都可以用指定该 module 子目录、
由 GWT 产生出来的 <module>.nocache.js 。
1.6 版之後,我们会建议只有 module 指定的 resource
要直接放在 GWT 程式码的目录当中,例如 widget 需要的图档,
就仍然留在 public 这个目录下。
→当你需要从 module 的 public 路径当中载入 resource,
请务必使用 GWT.getModuleBaseURL() 所产生出来的绝对路径。
例如 GWT.getModuleBaseURL() + "dir/file.ext"。
这个建议并没有改变,只是过去对於这点比较草率,
因为网页跟 GWT module 通常会放在相同的目录下,
所以就算用相对路径也都能运作正常。
现在 GWT module 放在一个子目录,你必须要用 GWT.getModuleBaseURL()
才有办法指定到 public 内的 resource。
加强 Hosted Mode
虽然 GWTShell 仍旧使用内嵌的 Tomcat server,
但是新版的 HostedMode 使用的是 Jetty。
另外在 Hosted mode 的视窗当中新增了一个「Restart Server」按钮。
按下这个按钮可以重新启动 Jetty server,让 Java 程式码的改变可以实际有作用,
而不用整个关掉 hosted mode 再开启。
这个在修改 RPC 的 servlet、RPC 回传的 serializable type 有改变、
或是 server 跟 client 已经失去同步时候特别好用。
新的 EventHandler 系统
增加了 event handler 以换掉 Widget、History 以及很多 class 上头
使用的旧 event listener。新旧系统之间一些差异在:
→EventHandler 的 method 永远只有一个 parameter:widget 所触发的 GwtEvent。
例如 ClickHandler 有一个 method 是 onClick(ClickEvent)
→所有 GwtEvent 包含了 event 有关的附属资讯,
像是 KeyEvent 中会有被按下去 key。
native event 可以存取潜在 event 物件。
→所有 EventHandler 只定义一个 method,
所以你不需要为了满足 interface 的规格而建立一堆空的 method。
对於自己建立 Widget 的使用者来说,你不再需要手动管理 listener。
每个 widget 都有 HandlerManager 来管理所拥有的 handler。
对於像 ClickEvent 这种 native event,只在程式码中呼叫 addDomHandler(),
就可以注册一个 handler、并且让关联的 event 与 widget 连接起来。
当 native event 被侦测到,handler 就会自动呼叫。
对於像 SelectionEvent 这种 logical event,
呼叫 addHandler() 并且用 fireEvent() 来触发。
你可以在更新版的 GWT widget 和示范程式当中找到许多 EventHandler 的范例,
在使用新版 webAppCreator 工具产生的 project 也有。
建立、驱动 native event
你现在可以对几乎所有的 element 驱动一个 native event。
用 Document.createEvent*() 建立一个新的 native event,
然後用 Element.dispatchEvent() 指派给特定的 element。
这些 method 让你可以扩展你的 test coverage,这是之前办不到的。
新的 Widget
DatePicker Widget
新的 DatePicker 跟 DateBox widget 让你的使用者可以从日历上选择日期。
在 展示区 当中有这两个 widget 的示范。
LazyPanel Widget
新的 LazyPanel widget 让你可以把 application 当中的某些部份,
延後到第一次存取的时候才建立起来,以增加启动的效率。
举例来说,如果你的 application 很少会用到「Help」的部份,
你就可以把它放进 LazyPanel 当中,然後只有在使用者要存取它的时候
才建立使用者介面。使用 LazyPanel 的方法就是继承它,
然後 override createWidget() 这个 abstract method。
createWidget() 会在你对 LazyPanel 呼叫 setVisible() 时被呼叫到。
错误修正
GWT 1.6 包含了一堆的错误的修正
(也包含了一些没写在「新的内容」章节中的改进),包括了:
→Issue 1032:影响 Mavin plugin 的 class 载入错误。
→Issue 2906:SortedSet 现在是 serializable
→Issue 779:GWT 现在用 EMMA 以支援 unit test 的 code coverage 计算。
→Issue 2223:@Override 现在可以在 interface 的 implement method 上头使用,
让 GWT 在 Java 6 SDK 上使用得更顺畅。
想要了解更多细节,可以到 GWT issue tracker 的
「1.6 中被满足的 Issue 完整清单」查看。
--
侃侃长论鲜窒碍 首页:
http://www.psmonkey.idv.tw
众目睽睽无心颤 Blog:
http://ps-think.blogspot.com
茕居少聊常人事
杀头容易告白难 欢迎参观 Java 版(@ptt.cc) \囧/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.114.200.219
1F:推 didifong:感恩阿,说明真详细,话说最近也是有在摸,感觉还满好玩的 06/01 21:57
2F:推 puzi:看了就想玩玩看...感恩:P 06/02 00:12
3F:推 GGGGGforever:我从1.3开始玩, 每次改版, 前一次的东西就有问题... 06/02 23:14