从2007.08进入项目到2008.11产品正式运营,经历了两个GWT项目开发(这两个项目共享相同widget)。基本全程都很顺利。现在分享一下开发历程和注意事项。

开发环境: ubuntu7.10 + apache php + jboss.

下面是开发总结:

[color=darkblue][b]1: GWT Version & Upgrade[/b][/color]

得到一份(新)版本后,你得作如下的工作:

1)看看支持哪些功能和特性

2)看看修正了哪些bug

3)看看屏蔽了哪些function

4)更新相关的编译,运行脚本

这通常是很有用的。比如, 一开始就知道GWT支持国际化这是非常重要的。还有就是

需要知道支持哪些java package, classes, 以及jdk版本和语法特性。这比编译通不过,再来反复修改,要节省大量时间。另外,版本的升级,部分代码需要跟着同步。 比如,

GWT 1.4.2 如果想让一个Popup在 browser居中,得自己另外写方法。 GWT 1.4.6就提供

popupPanel.center()直接支持。 GWT1.6.9时float类型已经不被支持,需要进行相应替换才能编译通过。

[color=darkblue][b]2:系统配置项:[/b][/color]

1)XML Schema(怎么取得这些数据,参考下面的Ajax设计模式)

2)Http header. 比如:

取得这些数据的方法:

public static String getMetaContentValueById(String metaTagId,String defaultValue){        String result = null;        try{            Element elem = DOM.getElementById(metaTagId);                result = DOM.getElementAttribute(elem, CommonDefn.LOCALE_TOKEN);            result = (result == null) ? defaultValue : result;            result = (result.trim().length() < 1) ? defaultValue : result;        }        catch(Exception e) {            result = defaultValue;        }        return result;    }

[color=darkblue][b]3:完全组件化开发[/b][/color]

自认为分模块(module)开发是不必要的,而且编译的开销特别大。

我们主要的分页面(Page)架构是基于History(Listener)的。从一个页面到另一个页面的代码页很简单: History.newItem(_link); GoBack也很简单: History.back();

这样的架构的一个额外好处,还解决了Ajax的go back问题。 我们可以判断一个页面是通过正常的路径来的,还是通过go back来的。 这样就可以分别对待处理。

[color=darkblue][b]4:JSNI & JavaScript[/b][/color]

1) 直接写javascript function,供页面或flash 调用

2)使用JSNI作多语言(英文,繁体,简体) 的选择

protected class HyperlinkCommand implements Command {        protected String _url = "";        public HyperlinkCommand(String url) {            _url = url;        }        /**         * Redirects the browser to the given URL.         * The following is an inline javascript:         *     $wnd is the handler for the browser         *  .location.href is the relative url         */        private native void link(String url) /*-{            $wnd.location.href = url;        }-*/;        public void execute() {            link(_url + CommonDefn.HTML_PAGE_SEPARATOR + History.getToken());    // the language link follows by the original page        }    }

[color=darkblue][b]5:架构属于你自己的RPC & Servlet. [/b][/color]

方便及时修改,测试(在eclipse里运行测试或debug),发布(考虑css兼容问题,你得在自己的browser测试).

Service部分: 采用一个Servlet来作集中控制。前端发送两个参数到Server, I.E.

/proxy/proxy.php?proxyinstr=getavailmovies&jsondto={"uusystemlanguageid":"1", "uuxxx":"1"}

Main.gwt.xml的

注意上面的class部分,他不在client包中,这也是我们想要的效果。 这个只供测试RPC用.

而httpProxy,是标准的Servlet.

public class HttpProxy extends HttpServlet {    public void doGet(HttpServletRequest httpRequest, HttpServletResponse httpResponse)     throws ServletException, IOException {        doPost(httpRequest, httpResponse);    }    /**     * Process POST requests     */    public void doPost (HttpServletRequest httpRequest, HttpServletResponse httpResponse)    throws ServletException, IOException {       ...}

}

之所以把这个包命名为debug,只是为了在eclipse里运行的时候debug rpc. 它是不会被编译输出到www的。

当在Browser(Firefox,以后简称FF)运行的时候,实际是访问Apache的php,而不是自己建立的Servlet(它负责把数据直接转发到8080的jboss). 而proxy.php也正是作这件事,把80端口的请求转发给8080的jboss的一个Servlet.这就是架构的巧妙之处。

技巧: 在apache下建立soft link到 开发环境下的目录(编译后生成的),就少了N次的cp to apache .

[color=darkblue][b]6:Server与Client的约定(term)[/b][/color]

1)共享一份相同的常量,定义在各自的CommonDefn中。 i.e.

public interface CommonDefn {    public static final int         PERMISSIONS_CHECKOUT            =    0x02000000; } 如果一方有修改,另一方需要同步。

2)由于双方都是用json交换数据,所以对于每个请求,它的json要稳定。如果Server端准备

返回的json有变化,则要同步client。一般数据库的设计发生变化,则要修改Server端。 Server的变化,则带来Client的同步变化。因此,数据库设计决定了整个project的可维护性。

3)Client 与 Server共同维护 (自定义的) Session

4)在Client的CallbackHandler中,如果收到"Session expired!"的 json message, 则需要要求用户(重)登录

5)Client做数据的sort,cache还是Server做? 最后还是Server做。唯一原因是:考虑GWT最终输出是html, js. 精简client始终是整个开发流程都要遵守的规则。

[color=darkblue][b]7:Ajax设计模式[/b][/color]

1)读取本站的XML

HTTPRequest.asyncGet(_xmlFile, new ResponseTextHandler() {                  public void onCompletion(String responseText) {                    // In the real world, this text would come as a RPC response. This                    // technique is great for testing and samples though!                      renderXML(responseText);                  }

2)一次发送多条请求(以后称指令),待所有请求完成之后,再作处理。这样能减少指令间的耦合度。

处理方式,每一条指令返回后,在callBack中把计数加1,当所有的计数达到指令的条数后,再作具体的处理。

3)go back问题。我们用public class HistoryStack extends Stack {}的一个

SingleTon的实例来记录页面的流入,流出。来达到HTML Referrer的效果。 也就是说,能够

知道当前页面是来自于哪个页面,在此基础上,再判断是否是goback到达的。然后再作处理

4)TimeOut问题。 网络的延迟,中断,甚至处理时间超过指定的等待时间,都可能引发TimeOut问题。如果你开发的是嵌入式系统。这个问题,就得慎重考虑。目前我们的处理方式:客户端触发的TimeOut处理,我们转入到一个固定页面,这个页面显示:系统正在维护中。 这个页面会定时连接server,当连接成功,重置到index page. 另外,服务端与客户端维持一个

heartbeat,如果检查到一定时间没有(heartbeat),就重新启动client.

[color=darkblue][b]8:GWT & 动画效果 以及 Flash[/b][/color]

1)用GWT开发动画效果,是很容易的。记住,GWT既面向Widget,也面向DOM.

2)Flash与GWT通讯这里不多说 . 在linux下的FF, Flash可能会跳出来,挡住Popup, alert,menu 也就是说transparent特性无效。如果含有的Flash较多,这简直就是灾难。 我们采取的做法,以Flash挡住Popup为例子,我们采取FlashAnimation来显示Flash,FlashPopupManager来管理Flash与Popup的关系。以两个Popup(上面都有Flash)先后显示为例子.第2个Popup(上层的)显示的时候,把第一个Popup的Flash隐藏。第2个Popup关闭的时候,再显示第一层的flash.这是workaround.然而很有效。 算法采用Stack.

[color=darkblue][b]9:异常处理[/b][/color]

1)GWT提供全局的异常处理(也就是说能够捕获未被处理的异常), I.E.

// set uncaught exception handler, we should log exception for investigation        GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {            public void onUncaughtException(Throwable e) {                // TODO                // should call instruction for error message logging                e.printStackTrace();                Window.alert("Uncaught exception:\n" + e);//                String message = "";//                message += "GWT.getHostPageBaseURL(): " + GWT.getHostPageBaseURL();//                message += "GWT.getModuleBaseURL(): " + GWT.getModuleBaseURL();//                message += "GWT.getModuleName(): " + GWT.getModuleName();//                message += "GWT.isScript(): " + GWT.isScript();//                Window.alert("GWT message:\n" + message);            }        });

2)局部处理,同java一样: try, catch, finally block.

[color=darkblue][b]10:加入第三方module(通常也是直接或间接由GWT开发)[/b][/color]

1)注意版本的匹配和同步升级

2)在project.gwt.xml中加入模块 . I.E

.

3)在编译和运行的脚本中加入这些library的path

[color=darkblue][b]11:多个Project(在同一个目录下)共享widget(不同于上面说的引入module方式)[/b][/color]

1)设置各自的project.gwt.xml,以及配置里面的servlet path

2)在client Package下建立各自的EntryPoint Class

3)在public Folder下建立各自的Host web File

4)建立各自的编译(project-compile),运行(project-shell)脚本

java gwt开发_GWT项目和开发总结相关推荐

  1. OpenDaylight开发hello-world项目之开发工具安装

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  2. 【创科之龙】零基础学习嵌入式开发以及项目实战开发【第二期视频】

    [创科之龙]零基础学习嵌入式开发以及项目实战开发[学习交流零基础火热进行ing] 大家好,我是aiku,上期的项目学习资料在电子发烧友论坛上分享,大家觉得都很好. 在这里我首先要感谢电子发烧友给我们的 ...

  3. 最新仿映客直播APP开发实战项目IOS开发实战8天(最全最新)

    最新仿映客直播APP开发实战项目IOS开发实战8天 第 1 章:直播准备 1: [录播] 课程大纲介绍 09:56 2: [录播] 了解直播技术和腾讯云直播 09:54 3: [录播] 基础封装 23 ...

  4. JAVA工作总是维护项目_开发维护大型 Java 项目的建议

    原标题:开发维护大型 Java 项目的建议 假设你是正在开发和维护一个包含2000个类并使用了很多框架的Java开发者.你要如何理解这些代码?在一个典型的Java企业项目小组中,大部分能够帮你的高级工 ...

  5. java 电商 插件 开发_JAVA项目实战开发电商项目案例(六与七)商品分类与商品模块管理开发...

    购物网站中,商品管理板块也是重要的一个版块,下面我会从后台管理系统和前台管理页面去讲述购物网站商品模块功能的开发. 1演示效果 1.1前台演示地址演示地址 1.2后台演示地址演示地址 2商品分类功能 ...

  6. java gwt教程_GWT入门教程

    2.下载完成之后解压,我解压的目录是D:\Program Files\gwt-2.5.1 3.配置环境变量,相信安装过jdk的人都应该知道环境变量在那配置吧!设置path为你解决的的目录,set pa ...

  7. python项目案例开发pdf-Python项目案例开发从入门到实战——爬虫、游戏

    资料简介: 本书以Python 3.5为编程环境,从基本的程序设计思想入手,逐步展开Python语言教学,是一本面向广大编程学习者的程序设计类图书.本书以案例带动知识点的讲解,将Python知识点分解 ...

  8. 最新仿映客直播APP开发实战项目IOS开发实战8天

    第 1 章:直播准备 1: [录播] 课程大纲介绍 09:56   2: [录播] 了解直播技术和腾讯云直播 09:54   3: [录播] 基础封装 23:13   4: [录播] 网络封装讲解 1 ...

  9. 仿映客直播APP开发实战项目IOS开发实战8天课程

    第 1 章:直播准备 1: [录播] 课程大纲介绍 09:56   2: [录播] 了解直播技术和腾讯云直播 09:54   3: [录播] 基础封装 23:13   4: [录播] 网络封装讲解 1 ...

  10. 项目架构开发:数据访问层之Cache

    数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...

最新文章

  1. Android初学第29天
  2. JSP的3大指令Page,include,taglib
  3. 文件包含——概念(一)
  4. Spring对AspectJ的支持
  5. How to Simulate the Price Order or Price Line Function using API QP_PREQ_PUB.PRICE_REQUEST Includes
  6. CCD 与 CMOS
  7. C语言--(四)常用运算符
  8. PDF格式分析(六十五) Text 文字——字体数据结构
  9. pascal编游戏攻略
  10. 如何将win7系统的电脑屏幕改成护眼的豆沙绿
  11. 企业实践|分布式系统可观测性之应用业务指标监控
  12. 汉字读音表GB2312版 (共7809个汉字)
  13. 鸿蒙系统用的什么代码,鸿蒙系统是用什么语言开发的?
  14. 计算机软件申请专利描述,计算机软件能否申请专利?
  15. igxe本地机器人怎么用_IGXE自售机器人第四批申请开启
  16. 英语学习——逻辑之道
  17. 四磺基铝酞菁(AlS4 Pc),酞青铜相对分子质量,齐岳生物供应
  18. 华为荣耀v9计算机恢复,华为荣耀v9手机自动关机解决方法教程_华为荣耀v9手机自动关机、黑屏死机的四种解决办法_好特教程...
  19. leaflet 结合 d3.js 实现 geojson 数据地形剖面分析(附源码下载)
  20. (完美解决)java文件操作报错:java.io.FileNotFoundException(拒绝访问)

热门文章

  1. 百度Clouda的初步探索
  2. 仿支付宝股票 猜涨跌View
  3. java duplicate_java中出现duplicate local variable
  4. 我用Python爬虫获取数据,分析双色球中奖概率,差点就中了
  5. ImportError:cannot import name ‘save_state_warning‘和解决torch1.7.1报分布式错误No rendezvous handler for env:
  6. 没Switch也能玩有氧拳击 咕咚智能运动手表F4全面评测
  7. ssb的matlab仿真,单边带调制(SSB调制)的理论基础和MATLAB仿真
  8. 2016百度笔试题交流
  9. 此计算机 未识别的网络,未识别的网络无网络访问解决方法(图文)
  10. 基于wincap写抓包程序