一.什么是GWT的Module
Module是GWT打包资源的方式,一个资源的集合。根据资源的类型,一个modul可以包含定义不同的内容,GWT定义有好几种Module, 其中定义界面的为com.google.gwt.user.User,在其中可以定义连接的CSS,Javascript,GWT UI及Entry Point,这个集合的内容由一个xml文件定义,这个文件通常命名为:“模块名.gwt.xml”。一个Module要使用其它Module必须通过 进行定义。inherits就表示:如果你自己的module inherits了一个module,那么该module中的所有内容及该module inherit的其它内容,包括css,javascript等所有资源都在你自己的module中可见并可直接使用。GWT编译的时候会为每个module生成自己的文件夹,并把该moduel的所有内容及项目的public目录中的内容生成到该文件夹中,文件夹的命名是“包名.module名”
二.什么是GWT的Entry Point
Entry Point可以理解为gwt对界面上不同模块部分的封装,比如一个web界面有两个主要的部分,一个部分是实时显示内容的告示区域,一个部分是留言的区域,那个就可以定义两个Entry Point,分别处理这两个界面部分,每个Entry Point是一个Java代码,这样不同功能、不一样的界面模块就可以分别写到不同的java代码中去了,当然你也可以把整个页面都定义在一个Entry Point里面去,那这个java代码里既要处理显示实时告示的逻辑,又要处理留言的逻辑,代码就很混杂,这就像现在的用php来整个定义一个页面一 样,Entry Point的定义在Module中通过 <entry-point class=””/>指定。
那么这个Entry Point显示在那个地方呢?
这不是Entry Point处理的内容,Entry Point只表示一个页面会分成几个不同功能的模块及负责这些模块的java类,甚至实际的界面会显示在什么地方由java类里面定义布局的代码定义。这里每个Module都有一个html页面,该页面负责加载最终gwt编译的javascript代码及ui,那么在这个html里面我们就可以定义一个布局显示的模板构架。定义好哪里要显示什么,比如:
那就可以定义两个Entry Point一个负责BBS,一个负责Message,然后在BBS的java代码里通过
把两个不同的功能代码放到我们预定义的地方,如果RootPanel.get().add(”布局定义”);则加取页面的最后。
EntryPoint的EntryPoint.onModuleLoad()方法就是负责定义界面的地方,相当于RCP IViewPart的createPartControl
三.什么是Remote Module
GWT没有这个概念,这个概念是Cypal插件定义的,它其实就是指GWT访问远程服务的代码,共有三个类:
XXXService:这是远程服务的定义接口,定义暴露的接口方法。该方法的实现在XXXServiceImpl中实现,同时该类需要通过@RemoteServiceRelativePath定义该服务的url路径名,由于XXXServiceImpl其实就是一个Servlet,所以这个路径会在web.xml的url-pattern用到
XXXServiceAsync:该接口是XXXService的副本,它的作用是当Java(最终应该说是javascript)调用XXXService后,该接口提供一个回调,所以该接口的方法定义比XXXXService的方法定义多了个AsyncCallbak<T>接口,该接口定义了两个方法:
onFailure(Throwable caught)//失败时调用
onSuccess(T result)//成功时调用
XXXServiceImpl:这是具体类,这就是具体实现远程接口的地方,可以在这里实现业务逻辑,访问ejb,访问web service等等
除了XXXServiceImpl这几个类外,其它两个接口都不需要我们实现,GWT会通过动态代理来实现这两个接口,所以那两个接口只要定义就可以了
那如何调用Remote Module呢?
调用Remote Module需要使用到XXXServiceAsync副本接口,首先需要通过GWT生成两个接口的动态代理:
XXXServiceAsync service = GWT.create(XXXService.class);
然后就可以调用了,在相关的界面事件处理的地方调用XXXServiceAsync的方法,该方法比XXXService多了一个AsyncCall回调参数,这是我们需要实现的类: