`
stone
  • 浏览: 37473 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Gwt延迟绑定介绍

阅读更多
Gwt延迟绑定介绍

Gwt的延迟绑定是一种gwt对反射机制的一种支持方案。简单的说就是在使用gwt进行代码开发的时候,可以使用接口和抽象类,而不用管它的实现,在编译后或者host模式的情况下,gwt会自己跟模块配置的信息来使用具体哪一个实现类替代代码中的接口和抽象类。

使用说明:

1. 定义接口或者抽象类,然后再定义一个实现类。

2. 在xxx.gwt.xml(模块文件中定义)替换的参数信息和具体替换的类
<replace-with class="com.google.gwt.user.client.impl.DOMImplMozilla">
		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
		<when-property-is name="user.agent" value="gecko1_8"/>
	</replace-with>

上面的配置是将在firefox浏览器里面使用DOMImpl该类的地方使用DOMImplMozilla这个类进行替换。其中的replace-with是指实际用到的类,when-type-is则是要替换的类,when-property-is则是一些参数信息,可以添加0到多个。另外,关于参数的配置还可以加一些逻辑的限制,如Any,
<any>
      <when-property-is name="user.agent" value="gecko"/>
      <when-property-is name="user.agent" value="gecko1_8" />
    </any>


3. 在代码中使用
通过GWT.create方法可以动态的获取不同的实现类,如下:
DOMImpl impl = (DOMImpl) GWT.create(DOMImpl.class);
再结合gwt的dom模块的配置信息(如下),impl对象将会根据不同的浏览器而动态采用不同的domimpl类的实现。

<module>
	<inherits name="com.google.gwt.core.Core"/>
	<inherits name="com.google.gwt.user.UserAgent"/>

	<replace-with class="com.google.gwt.user.client.impl.DOMImplOpera">
		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
		<when-property-is name="user.agent" value="opera"/>
	</replace-with>

	<replace-with class="com.google.gwt.user.client.impl.DOMImplSafari">
		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
		<when-property-is name="user.agent" value="safari"/>
	</replace-with>

	<replace-with class="com.google.gwt.user.client.impl.DOMImplIE6">
		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
		<when-property-is name="user.agent" value="ie6"/>
	</replace-with>

	<replace-with class="com.google.gwt.user.client.impl.DOMImplMozilla">
		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
		<when-property-is name="user.agent" value="gecko1_8"/>
	</replace-with>

	<replace-with class="com.google.gwt.user.client.impl.DOMImplMozillaOld">
		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
		<when-property-is name="user.agent" value="gecko"/>
	</replace-with>
</module>





参考:
http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&s=google-web-toolkit-doc-1-5&t=DevGuideDeferredBinding
分享到:
评论
17 楼 crazywan 2008-11-28  
这个功能很好用,可以自动生成代码,让RPC变得简单而且统一了!在和spring配合,绝了!
16 楼 stone 2008-11-27  
weirihai 写道
我不会这个啊你能说具体点啊!!!

那个地方不明白?我已经在帖子里面引用了gwt官方介绍的文档,那个应该更详细一些。
15 楼 weirihai 2008-11-27  
我不会这个啊你能说具体点啊!!!
14 楼 jvincent 2008-11-18  
你的意思是把类名放到xml文件里?那如果新增一个菜单怎么办?写文件?

我给你发了消息..
13 楼 edokeh 2008-11-18  
再次确认下需求,呵呵
1.已经实现了一个业务系统
2.根据需求,需要增加一个模块
3.为这个模块写好对应的UI类,其余代码不做改动
4.系统中的菜单会自动地多出与这个模块对应的项,点击即可显示这个模块


如果是这样的话,用我帖子里面的代码是可以实现的,不需要把类名放数据库
12 楼 jvincent 2008-11-18  
不是,就是个业务系统,实现增加功能不修改代码...
11 楼 edokeh 2008-11-18  
是不是为了实现权限系统?
10 楼 jvincent 2008-11-18  
是的,只不过是在初始化的时候把当前登陆的用户的所有菜单都取出来,然后放到一个对象里,在点击菜单的时候就实例化对应的类...

要是支持反射就好了....
9 楼 edokeh 2008-11-18  
你是不是希望实现这样的需求:
1.点击菜单某项
2.发AJAX请求从服务器取得这个菜单项对应的UI类名
3.实例化UI类并显示

要是这样的话不如用iframe来显示对应的UI,菜单项控制iframe的src
要不这么做的话。。。我一时也没想到什么好办法。。。
8 楼 jvincent 2008-11-18  
是啊...菜单可以手工增加,这样就必须在增加菜单的时候指定执行类,然后在加载的时候实例化...
7 楼 edokeh 2008-11-18  
类名写在数据库里面?
6 楼 jvincent 2008-11-18  
执行类是保存在数据库中,在加载菜单的时候才取出...
这时怎么写xml文件?
5 楼 edokeh 2008-11-18  
jvincent 写道
如果有个功能菜单,当点击后实例化该菜单对应的执行类,从而显示该菜单对应的界面...没有反射,这种功能如何实现?

实例化执行类这个步骤应当在点击之前就完成,然后将相应的对象与菜单项绑定,例如对于TreeItem类有个setUserObject的方法,可以用来进行绑定用户自定义对象
4 楼 jvincent 2008-11-18  
如果有个功能菜单,当点击后实例化该菜单对应的执行类,从而显示该菜单对应的界面...没有反射,这种功能如何实现?
3 楼 stone 2008-10-28  
edokeh 写道
最近正好项目用到延迟绑定,顺便帮楼主完善一下这篇文章“在代码中使用”的部分
延迟绑定很强大,反射,注解都可以支持
我用个实际例子来介绍:例如现在GWT中有很多Animal接口的实现类,比如Cat,Dog等等,现在需要在onModuleLoad的时候能够将Animal的所有实现类实例化,简单的写法就是一个一个地new,当实现类很多时候不仅累而且容易出错,这时候可以用延迟绑定来实现


非常感谢edokeh的完善。
2 楼 edokeh 2008-10-28  
最近正好项目用到延迟绑定,顺便帮楼主完善一下这篇文章“在代码中使用”的部分
延迟绑定很强大,反射,注解都可以支持
我用个实际例子来介绍:例如现在GWT中有很多Animal接口的实现类,比如Cat,Dog等等,现在需要在onModuleLoad的时候能够将Animal的所有实现类实例化,简单的写法就是一个一个地new,当实现类很多时候不仅累而且容易出错,这时候可以用延迟绑定来实现

首先在入口类里面写个空的类,然后用GWT.create方法来实例化它

private static class AnimalCreator{}

public void onModuleLoad(){
  GWT.create(AnimalCreator.class);
}


在配置XML文件里面做如下配置
<generate-with class="com.google.generator.AnimalGenerator">
  <when-type-assignable class="com.google.client.AnimalCreator"/>  
</generate-with>


解释一下这个配置:
当代码执行到GWT.create(AnimalCreator.class)时,GWT会调用AnimalGenerator这个类的generate方法(AnimalGenerator必须实现com.google.gwt.core.ext.Generator接口),generate方法返回一个类名的字符串(含package name),GWT.create方法将会根据这个字符串找到实际的类,然后将它实例化。
需要指出的是,上述过程都是在compile期间发生。也就是说这个Generator的实现类并不会被编译成js,所以不要把这个类放到client包下面;同时,这也意味着在这个Generator类里面,我们可以使用jdk提供的类,而不是局限于GWT JRE Emulation

下面直接给出AnimalGenerator的代码

public class ShowcaseGenerator extends Generator {
	private String className=null;
	private String packageName=null;
	
  public String generate(TreeLogger logger, GeneratorContext context,String typeName) throws UnableToCompleteException {
    try{
    	JClassType classType=context.getTypeOracle().getType(typeName);
    	//取包名
    	packageName=classType.getPackage().getName();
    	//取类名,然后加上Impl,也就是AnimalCreatorImpl
    	className=classType.getClass().getSimpleSourceName()+"Impl";
    	generateClass(logger,context);
  	}catch(Exception e){
  		logger.log(TreeLogger.ERROR, "ERROR!!!", e); 
  	}
  	return packageName+"."+className;
  }
  
  //尝试创建AnimalCreatorImpl这个类
  private void generateClass(TreeLogger logger, GeneratorContext context){
		PrintWriter printWriter = null;
		
		printWriter = context.tryCreate(logger, packageName, className);
		if (printWriter == null) return; 

		ClassSourceFileComposerFactory composer = null; 
		composer = new ClassSourceFileComposerFactory(packageName, className); 
		SourceWriter sourceWriter = null; 
		sourceWriter = composer.createSourceWriter(context, printWriter); 
		//手工写入代码 
		sourceWriter.println("public "+className+" {");
		sourceWriter.indent(); 
		try{
			JClassType superType=context.getTypeOracle().getType("com.google.client.Animal");
			JClassType[] Types=superType.getSubtypes();
			for(JClassType type:types){
				sourceWriter.println("new "+type.getPackage().getName()+"."+type.getName()+"();");
			}
		}catch(NotFoundException e){
			e.printStackTrace();	
		}
		sourceWriter.outdent(); 
		sourceWriter.println("}"); 		
		
		sourceWriter.outdent(); 
		sourceWriter.println("}"); 		
		//提交写入的新类
		context.commit(logger, printWriter); 
	}
}

generate方法返回的是com.google.client.AnimalCreatorImpl,但是我们目前并没有这个类,所以执行generateClass方法来动态生成这个类,在方法里面看到,我们首先找到com.google.client.Animal的所有实现类,然后将这些类名都以new Cat();这样的形式写入类的构造函数
那么当我们执行GWT.create(AnimalCreator.class)时,GWT会实例化我们用代码生成的AnimalCreatorImpl类,这个类的构造函数里面写着new Cat();new Dog();等等的代码,如果我们新建一个Animal接口的实现类,不用改动任何代码,这个类就会在onModuleLoad时被实例化
仔细查看GWT的com.google.gwt.core.ext包下面的API,我们可以发现更多对反射,注解等高级特性支持的方法
1 楼 crazywan 2008-10-24  
呵呵,牛人必做牛事!我支持!谢谢

相关推荐

    smartgwt最新版本GWT的DEMO

    2. **数据绑定**:SmartGWT支持数据绑定,允许开发者将UI组件直接与后台数据模型关联,实现数据的动态更新。在DEMO中,可以看到如何使用DataSource和Record来实现这一功能。 3. **事件处理**:DEMO会演示如何注册...

    SmartGwt学习文档

    在性能优化方面,SmartGwt采用了延迟加载和按需加载策略,只有在用户实际需要时才会加载相应的组件或数据,从而减少了初始加载时间和网络带宽消耗。此外,它还提供了缓存机制和资源管理,进一步提高了应用的响应速度...

    smartgwt官方实例

    2. **数据绑定**:SmartGWT支持自动的数据绑定,使得UI组件可以与后台数据源(如数据库或Web服务)进行交互。通过实例,你可以学习如何实现数据的动态加载、更新和保存。 3. **事件处理**:事件驱动编程是GUI开发的...

    SmartGWT2.0 API

    在性能优化方面,SmartGWT 使用了延迟加载(Lazy Loading)和分块加载(Chunk Loading)策略,减少初始页面加载的时间,改善用户体验。特别是处理大数据集时,这些策略可以显著减少网络传输量,避免一次性加载过多...

    GWT-API 帮助文档

    在GWT中,API包含了各种控件、服务、事件处理和数据绑定等模块,使得开发者可以便捷地构建Web应用。 **GWT API 帮助文档** 是一份详细的资源,用于指导开发者理解和使用GWT框架的各种功能。这份文档通常包含以下...

    smartGWT

    在描述中提到的博文链接指向了ITEYE博客上的一篇文章,虽然具体内容未给出,但我们可以推测这篇博客可能详细介绍了如何使用SmartGWT进行开发,可能包括了示例代码、最佳实践或者常见问题的解决方法。 标签“源码”...

    myeclipse 8.6 配置 gwt

    8. **性能优化**:GWT支持本地优化和延迟绑定,使得大型应用的加载和运行更加高效。开发者需要了解这些优化技术,并在项目配置中考虑它们。 9. **社区资源**:描述中提到了一个博客链接,这表明社区资源对于学习和...

    gwt揭秘_pdf

    此外,书中还会涵盖GWT的优化技术,如代码分割、延迟加载和本地化支持,这些对于提高Web应用的性能和用户体验具有重大意义。此外,GWT的国际化和本地化策略也是开发者在构建全球化应用时必须掌握的知识。 对于测试...

    GWT-EXT2.0最佳实践教程,源代码打包供下载

    5. **数据绑定和模型**:理解GWT的数据绑定概念,以及如何使用ValueProviders和Models进行数据操作。 6. **事件处理**:学习GWT和EXT-JS中的事件监听和处理机制,如何在用户交互中响应事件。 7. **本地存储和持久...

    gwt学习笔记汇总

    开发者手册通常会详细介绍GWT的高级特性,比如Deferred Binding(延迟绑定)用于实现代码分割,减少初始加载时间;History and Bookmarks(历史记录和书签)功能使用户可以使用浏览器的前进/后退按钮在应用内导航;...

    GWT例子中的分页研究.

    这通常涉及到一个列表视图(如`CellList`或`DataGrid`),它可以绑定到数据源,并自动处理数据的加载和显示。 6. **事件处理**:当用户点击分页按钮时,触发相应的事件处理器,调用服务接口获取新的数据,并更新...

    gwt-ext培训教程

    GWT-Ext通过延迟加载和按需加载策略,降低了初始加载时的资源消耗。同时,GWT的编译优化也能确保代码在客户端高效运行。 10. **实践与进阶** 本教程将逐步引导你了解GWT-Ext的基础知识,并通过实例教你如何创建和...

    EXT-GWT(GXT) 2.2.4 JAVA API DOC chm 版

    此CHM版的API文档包含了EXT-GWT 2.2.4的所有核心类、接口和方法的详细介绍,对于开发者来说是一个非常宝贵的资源。CHM(Compiled HTML Help)文件是一种Windows平台下的帮助文件格式,它将HTML页面打包成单一文件,...

    Gwt-Ext基础-中级-进阶

    7. **数据绑定**:Gwt-Ext的数据绑定机制,包括模型(Model)、视图(View)和控制器(Controller)的概念,以及如何实现数据的双向绑定。 在"中级篇"中,你将深入到以下内容: 1. **高级组件**:探索Gwt-Ext的...

    GWT入门,进阶,中级

    达到中级水平,你应熟悉GWT的性能优化技巧,包括代码分割、延迟加载、压缩和合并,以减少HTTP请求并提高页面加载速度。学习使用GWT的ClientBundle和Resource Bundle来管理静态资源,以及如何使用RequestBuilder进行...

    smartgwt-2.5.zip

    2. **数据绑定**:SmartGWT支持数据驱动的UI,这意味着组件可以直接与服务器端的数据源进行绑定,减少了手动处理数据的繁琐工作。 3. **事件处理**:它具有强大的事件处理机制,使得组件间的交互变得简单而直观。 ...

    GWT in action

    5. **数据绑定与持久化**:GWT的数据绑定机制使得视图和模型能够自动同步,同时,讲解如何使用GWT的RequestFactory或GAE的JDO/Persistence API进行数据持久化操作。 6. **异步通信与RPC**:GWT的Remote Procedure ...

    <<GWT in Action>> Source Code

    这本书《GWT in Action》深入浅出地介绍了GWT的各个方面,包括基本概念、组件使用、异步通信、用户界面设计以及高级特性等。其附带的源码提供了丰富的示例,帮助读者更好地理解和应用书中所讲解的知识。 1. **GWT...

    GWT IN Action

    - **第17章:延迟绑定**,探讨如何通过编译时决策来提高应用程序的性能和灵活性。 - **第18章:自动代码生成**,讨论GWT提供的代码生成机制,用于简化常见的编程任务。 - **第19章:度量和代码分割**,讲解如何监控...

Global site tag (gtag.js) - Google Analytics