上一篇文章中介绍了GWT技术的一些理论性的东西,涉及到GWT得一些技术原理及实现。接下来笔者将通过创建一个GWT工程去理解分析GWT工程架构。

    GWT工程架构解析

笔者使用的是Eclipse插件的方式进行GWT开发,具体开发环境如何搭建我也就不多提了,网上可以搜到。好了我们新建一个GWT工程。展开工程的各个目录结构,如下图所示:

src:该目录存放工程的源代码;

client:该包下主要存放UI界面部分的代码,会被GWT编译器交叉编译成javascript代码嵌入网页进行调用;

server:存放服务端的代码,不会被编译成javascript;

shared:一般存放的是页面校验代码,会被编译成javascript;

test:存放工程测试代码;

war:存放的是工程的发布信息;

接下来笔者分别进入各个目录分析。

GWT模块

独立的GWT配置单元成为GWT模块,GWT模块定义文件包含了工程所需的设置信息。这些个设置信息主要是:模块的入口点、模块继承信息、源代码路径设置、资源文件路径设置、延迟绑定规则。

GWT模块定义文件一般为工程名.gwt.xml,模块名则由模块定义文件的所在包名+模块定义文件名(不带后缀)组成。

上述工程图片中,GwtGuide.gwt.xml即为模块定义文件,我们看看其配置信息。

<?xml version="1.0" encoding="UTF-8"?>
<!-- rename-to重命名: 将编译信息放在指定的目录下, 该目录位于war下 -->
<module rename-to='gwtguide'>
<!-- inherrits: 指定继承其他模块,大多数情况下我们 的项目是由多个GWT构成的(项目依赖),必须 继承其他模块。 -->
<!--核心模块,必须继承 包括EntryPoint接口,界面控件、DOM访问功能等 -->
<inherits name='com.google.gwt.user.User' />
<!-- 主题模块,GWT提供的一些可选主题 -->
<inherits name='com.google.gwt.user.theme.clean.Clean' />
<!-- <inherits name='com.google.gwt.user.theme.standard.Standard'/> -->
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->
<!-- Other module inherits -->
<!-- 指定工程的入口类,写全类路径 -->
<entry-point class='com.guide.client.GwtGuide' />
<stylesheet src="../GwtGuide.css" />
<!-- 指定哪些目录编译成javascript代码 -->
<source path='client' />
<source path='shared' />
</module>

上述配置只是Eclipse生成的一些个常用的配置信息。模块配置详细信息入下图表:

模块继承

继承提高了复用性,GWT模块同样支持继承。模块中定义了大量的配置信息,通过继承可以简 化和分割模块的配置信息。

<inherits name='com.google.gt.user.User'/>

name属性为继承的模块名称(配置文件所在路径+配置文件名),当用到其他GWT工程的库时

必须继承其模块,否则会报"No such code is available"的错误。

Tips:模块继承会增加编译时间,不要无谓的去继承一些不用的模块。

模块入口点

GWT中实现EntryPoint接口的类可以作为GWT应用的入口点(重写onModelLoad函数),一个

GWT模块中可以定义多个入口点,编译时这些入口点都会被实例化,并执行onModelLoad函数

Tips:实现EntryPoint的类应该有一个无参构造方法

资源文件路径设置

在使用GWT进行AJAX开发的时候会用到一些CSS样式和javascript代码,考虑到某个模块会被

系统重用,如果将CSS样式和javacript文件直接在页面进行引入这回碰坏程序的高内聚低耦合

原则。而且每个使用该模块的界面都必须添加样式引用,特别麻烦。

GWT模块提供了将CSS等样式文件的引用写入GWT模块定义文件中,在模块初始化的时候将其引

入到页面中。

<entry-point class='com.guide.client.GwtGuide'/>
<stylesheet src="../GwtGuide.css"/>

stylesheet指示编译器将src文件作为CSS样式文件加入到页面中。

Tips:前面的..表示的上级目录,当前所在的目录是GWT编译后的定义文件指定的目录

"rename-to"。而且使用这种方式在浏览器中查看网页源码的时候是看不见css样式文件的。

善于思考才能真正的学习!

其实只要仔细思考一下就可以明白,前面的配置中我们继承了GWT的主题模块,其模块定义

文件中必定使用stylesheet指定了CSS文件。如何查看样式文件呢?GWT项目是发布到web容

器中的,主题中所用的css,图片肯定有嘛,因此只要我们能够将应用发布,就能够找到!

查找资料"gwt发布"如下:

选中项目->右键->Googele->GWT Compile。

   
在编译信息下看见了,
 接下来进入指定的信息目录去查看:



       
so!按照此种思路,以及clean.css的内容,去定制一套专有的Look and feel吧!

源代码路径设置

<source path='client'/>
<source path='shared'/>   

source用于指定GWT编译器将那个目录下的源码编译成javascript代码。

延迟绑定规则

对于延迟绑定这部分,笔者处在刚接触GWT的阶段,前期不会涉及到。以后再做补充吧。

Over!欢迎大家交流~。

参考资料:

《GWT揭秘》

http://blog.csdn.net/lanpiao_87/article/details/7227697

GWT工程架构分析与理解的更多相关文章

  1. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  2. Redis面试热点工程架构篇之数据同步

    温馨提示 更佳阅读体验:[决战西二旗]|Redis面试热点之工程架构篇[2] 前言 前面用了3篇文章介绍了一些底层实现和工程架构相关的问题,鉴于Redis的热点问题还是比较多的,因此今天继续来看工程架 ...

  3. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  4. Android架构分析之Android消息处理机制(二)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...

  5. Qualcomm Android display架构分析

    Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...

  6. Deep Learning论文笔记之(六)Multi-Stage多级架构分析

    Deep Learning论文笔记之(六)Multi-Stage多级架构分析 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些 ...

  7. 分布式MySQL数据库TDSQL架构分析

    摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TD ...

  8. Tomcat系统架构分析

    Tomcat系统架构分析 关于这边blog呢,实际开发中并不会用到,但是我觉得还是很有必要认真的写一下.毕竟我们每天在本地撸码的时候使用的就是tomcat来做web服务器.一个常识就是说我们本地在to ...

  9. 高通Android display架构分析

    目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...

随机推荐

  1. 51nod1204 Parity

    如果sm[j]和sm[i]奇偶性相同,那么(i+1,j)个数为偶数如果奇偶性相同看成是朋友,不同的看成是敌人,那么就跟bzoj1370的做法差不多了. 如果奇偶性相同,就将x和y合并,x+n,y+n合 ...

  2. BZOJ 1202 狡猾的商人

    前缀和+带权并查集. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  3. POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)

    题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...

  4. 解决Eclipse快捷键被其他软件占用

    做为一个java攻城狮,eclipse是我最常用的攻城设备,eclipse快捷键 极大的提高了我的开发效率!!!! 前段时间升级了一下我的战斗装备——给电脑的系统盘换成了一个固态硬盘,因此需要重装系统 ...

  5. activiti 源码笔记之startProcess

    rumtimeService.startProcessInstanceByXX方法将启动流程的任务委派给StartProcessInstanceCmd,此时会根据rumtimeService.star ...

  6. Ensemble Learning 之 Adaboost

    Boosting Boosting 是一种提升方法,将一系列弱学习器组合成为强学习器.基于样本权重的 Boosting 的工作流程是这样的,给定初始训练集构建一个基学习器,根据基学习器对训练样本的分布 ...

  7. 【解题报告】[动态规划] RQNOJ - PID273 / 马棚问题

    原题地址:http://www.rqnoj.cn/problem/273 题目大意:中文题不说了. 设从第i匹马到第j-1匹马放在一个马棚里得到的系数为f(i,j). 状态表示:dp[i][j]表示前 ...

  8. Mysql事物与Metadata lock 问题

    环境说明:     MySQL 5.6.16     OS:Linux RedHat 6.2 64bit 1.问题描述 目前新上一个使用MySQL数据库项目,在数据库中,每隔5分钟做truncate某 ...

  9. Android 注解的一些应用以及原理

    在这边文章之前你首先需要对java 的注解部分有一个基本的了解(不需要太过的深入). 简单来说,注解这个东西就是用于辅助我们开发java代码的,注解本身无法干扰java源代码的执行. 在android ...

  10. [摘]string.jion() 解决办法

    for (int j = 1; j <= 5; j++)            {                List<int> list = new List<int&g ...