`
Rocky_rup
  • 浏览: 146073 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

GWT应用经验小结

阅读更多

 

1. pendingSrc


问题描述:Image的setUrl方法在第二次使用的时候,会出现“pendingSrc”的问题,导致图片无法显示。
原因分析:可能是GWT的bug,具体原因不详。
解决办法:通过DOM.setElementProperty()来设置src的值。

2.内存泄露


问题描述:刷新页面容易导致复杂的ui出现内容泄露。

原因分析:编码实现中很容易是的对象间出现循环引用,例如添加监听器的时候等,部分浏览器(尤其是IE)对此循环引用无法进行资源的释放。而在不断的刷新中,老的循环引用链没有正确断开,新的循环引用链又伴随着新对象的产生而产生,后果很严重。

解决办法
  • a) GWT自身提供了一套机制来解决这个问题。简单来说,就是在Widget(或其子类)的对象在被拆卸(detach)时,注销所有自身的所有事件监听,若自身实现了HasWidget接口,则会断开与它关联的其它Widget对象的关联。值得注意的是,若是应用在采用了GWT对第三方js库的封装,我就不能确定这种机制是否依然有效了。可以肯定的是,若是第三方js库内部就存在内存泄露的问题,那就算用GWT也避免不了。
  • b) 对于除了Widget之外的其他自定义类实例若是也存在这种可能,建议解决策略是,将这些自定义对象暴露释放资源的方法(如clear,dispose或是destroy),并由Widget对象持有它们的引用,覆写Widget的onUnload方法,在其中调用它们的资源释放方法,这样就把自定义对象生命周期与Widget绑定在一起,即当Widget被销毁时,回调onUnload释放它们的资源。

3. 延迟加载


问题描述:复杂UI在初始化的过程中往往是很耗时的,而延迟加载是最常用用来应对它的一种模式。但延迟加载采用什么方式,以及什么时机加载确实难题。

解决办法:抛开必要的初始化预载外,可将延迟加载的时机放在页面部件被显示的时候再进行初始化。基于这个时机,在GWT中的解决模式是,覆写Widget或其之类的onLoad方法,因为这个方法会在Widget装载到页面时回调,将涉及后台数据请求或是页面的耗时计算的初始化逻辑放在onLoad中,就可以实现延迟加载。

4.事件与状态


问题描述:UI复杂度直接体现在各个子部件之间的复杂对象关联,这种关联基触发事件或是传递状态所必要的。但是,这也带来许多棘手的问题,如循环引用、高耦合度、复用性和维护性差等。

解决方法
  • a) 首先,暴露一个全局可访问的数据区,可以无障碍的共享数据;其次,设计一个统一的机制来控制数据区的数据写入,避免写数据发生的冲突;最后,暴露数据写入的监听回调接口,利于状态被改变时可以触发事件。这样,大部分的页面部件可以集中依赖这个全局数据区来触发事件或传递状态,降低复杂的网状关联。此外,可以全局数据区进行集中初始化和销毁,使得资源被合理和可见的控制;
  • b) 利用Gwt提供的History,建立自己的消息传递机制。因为History提供的都是静态方法可全局访问,通过newItem来写自己的消息串,比如模仿Url传参(abc?k=v&n=l);再通过想History注册监听,在onHistoryChanged的回调中对消息串进行解析,并调用其他逻辑。

二者比较起来,各有优势,根据具体情况选用或混用。History优势在于可通过地址携带状态,很轻量,不用操心初始化和销毁;劣势是状态必须是字符串,编码和解码是个麻烦事,当状态信息很多时,url自然会很长,所以...。


5. 页面数据刷新


问题描述:很多时候,我们希望在程序中控制页面部件装载(attach)和拆卸(detach),以刷新数据显示。而GWT这方面的方法(如onAttach,onDetach,onLoad,onUnload)都是保护可见的。

解决办法
  • a) 通过集成Widget或子类,改写上述方法的可见性,暴露给其他控制类调用;
  • b) 很多Panel类提供了setWidget方法,这个方法会用新的对象替换老的,这个过程会先触发老的对象进行拆卸(detach),此后会装载(attach)新的对象。若是新老对象是同一个对象即可实现对象的更新。

 

2
3
分享到:
评论
1 楼 wangying95599 2010-08-03  
1. pendingSrc

解决办法:通过DOM.setElementProperty()来设置src的值。

如果项目编译成支持多个浏览器,如
<set-property name="user.agent" value="ie6,ie8,gecko,gecko1_8,safari,opera"/>
这个方法图片也不能正常显示

如果是一个浏览器
<set-property name="user.agent" value="ie8"/>
就正确

相关推荐

    部署一个简单GWT应用到Google App Engine

    标题 "部署一个简单GWT应用到Google App Engine" 涉及到的技术点主要包括Google Web Toolkit (GWT) 和 Google App Engine (GAE),这两者都是Google提供的开发和托管Web应用的重要工具。以下是对这些技术及其相关知识...

    GWT快速开发(GWT) 是一个Java软件开发框架用于开发类似于Google Maps和Gmail的AJAX应用程序。GWT的设计参考Java AWT包设计,类命名规则、接口设计、事件监听等。你可以用Java编程语言开发你的界面,然后用GWT编译器将Java类转换成适合浏览器执行的...

    无论是对于初学者还是有经验的开发者来说,掌握GWT的基本原理和开发流程都是非常有价值的。随着技术的不断进步,虽然GWT可能不再是当前最流行的前端开发框架之一,但它仍然在某些特定场景下发挥着重要作用。

    GWT开发者手册 GWT

    通过以上总结,我们可以看到GWT不仅提供了一种高效的方式来编写复杂的Web应用程序,还解决了跨浏览器兼容性问题,极大地提高了开发效率。对于已经有Java开发背景的程序员来说,这是一个非常有价值的工具。

    GWT开发者手册 GWT开发者手册

    本手册基于GWT版本gwt-windows-1.3.3,适用于熟悉JAVA语言和具有J2EE三层架构开发经验的WEB应用程序开发者。 **核心概念** 1. **JAVA到JAVASCRIPT编译**:GWT的主要功能是将JAVA源代码编译为JAVASCRIPT,使得JAVA...

    GWT部署

    在部署GWT应用前,需要确保服务器环境支持Servlet容器,如Apache Tomcat、Jetty等,因为GWT应用通常使用GWT RPC (Remote Procedure Call) 机制,这依赖于Servlet来处理与服务器的通信。 5. **构建与打包**: 使用...

    java教程GWT开发

    本文的标题是 "Java GWT 开发",它旨在教授初级开发者如何使用 Google Web Toolkit(GWT)来开发基于 Java 的 Ajax 应用程序。GWT 是一种免费的开发工具包,由 Google 公司于 2006 年 5 月发布,旨在简化使用 Java ...

    GWT通信机制初探

    总结来说,本文可能会涵盖GWT的通信机制,包括RequestBuilder和AsyncCallback的使用,以及如何将GXT与Spring框架集成,利用Spring的功能如依赖注入、服务代理、安全控制和数据持久化来增强GWT应用的功能和性能。...

    firefox和 对应gwt插件

    这个插件通常被称为GWT Developer Plugin,它允许开发者在Firefox中直接运行和调试GWT应用程序,而无需部署到服务器。这大大提高了开发效率,因为开发者可以在本地环境中实时查看和修改代码。 **GWT Developer ...

    gwt 服务器端(内含配置教程)

    总结来说,"gwt服务器端(内含配置教程)"指的是如何在Eclipse中配置和开发GWT应用,包括服务器端的设置和与客户端的交互。通过学习和实践这个主题,开发者可以掌握使用Java开发高效、跨平台的Web应用的技能。

    GWT 开发和部署文档

    如果你对EXTJS提供的界面效果不满意,还可以开发自定义的GWT-EXT插件,增强GWT应用的界面功能。 总结来说,GWT通过Java语言为Web开发提供了一种高效且易维护的解决方案,它简化了前端开发的复杂性,使得开发者可以...

    利用GWT开发高性能Ajax应用

    总结来说,选择GWT进行Ajax应用开发,不仅可以利用Java的强大生态和工具链,还能获得高度优化的JavaScript代码,从而提升应用的性能和用户体验。GWT通过其独特的编译器、资源管理策略以及丰富的开发工具,降低了开发...

    gwt-windows-1.3.1

    总结,GWT 1.3.1虽然已是较早的版本,但它在Windows平台上的应用仍然提供了高效、便捷的Web开发体验。开发者可以通过掌握GWT的核心特性和使用技巧,充分发挥其潜力,打造出优秀的Web应用程序。随着GWT后续版本的不断...

    smartGWT 3.1 最新版本

    SmartGWT是一个基于Google Web Toolkit (GWT) 的扩展框架,它通过提供大量预定义的用户界面组件和高级数据管理功能,极大地简化了GWT应用的开发。SmartGWT 3.1在前一版本的基础上进行了改进和优化,提升了性能和...

    GWTDemo

    总结起来,GWTDemo项目是一个关于使用Google Web Toolkit开发Web应用的实例,涵盖了GWT的许多核心特性,如用户界面组件、事件处理、异步通信、本地存储、国际化、样式主题以及测试。通过学习和理解这个项目,开发者...

    GWT入门教程

    每个GWT应用都是由一个或多个模块组成的,模块定义在`.gwt.xml`文件中。你可以在这里配置应用的属性,如使用的兼容浏览器版本、导入的库等。 **4.2.gwt.xml配置** 在`module.gwt.xml`文件中,你可以指定应用的入口...

    maven创建的简单的gwt工程源码

    源代码可能包含了业务逻辑、视图组件和数据模型,这些都是GWT应用的核心部分。 7. **部署与运行**: 编译生成的WAR包可以被上传到任何支持Servlet 2.5或更高版本的Web服务器,如Tomcat、Jetty等。服务器会解压WAR...

    gwt-servlet-2.3.0.jar

    总结来说,`gwt-servlet-2.3.0.jar`是GWT应用服务器端的核心组件,它负责处理客户端的RPC请求,实现业务逻辑,并确保与客户端的通信安全高效。开发者在构建基于GWT的应用时,必须正确配置和使用这个库,以充分利用其...

    smartgwt-1.3

    总结来说,"smartgwt-1.3"压缩包很可能是SmartGWT 1.3版本的完整包,包含了使用SmartGWT开发富互联网应用程序所需的所有资源。无论是初学者还是有经验的开发者,都能从中受益,利用其强大的功能和丰富的组件来构建...

    gwt in practice gwt快速开发

    - **国际化和本地化**:如何在GWT应用中支持多语言。 - **性能优化**:包括代码分割、延迟加载、压缩和缓存策略等提高应用性能的方法。 - **测试和调试**:使用GWT测试工具如GWTTestCase进行单元测试,以及使用开发...

Global site tag (gtag.js) - Google Analytics