GWT - 问题与解答
Google Web Toolkit (GWT) 是一个用于构建和优化复杂基于浏览器的应用程序的开发工具包。 GWT 被 Google 的许多产品所使用,包括 Google AdWords 和 Orkut。
以下是 GWT 的功能 −
Google Web Toolkit (GWT) 是一个用于创建 RICH Internet Application(RIA) 的开发工具包。
GWT 为开发人员提供了使用 JAVA 编写客户端应用程序的选项。
GWT 将使用 JAVA 编写的代码编译为 JavaScript 代码。
使用 GWT 编写的应用程序兼容跨浏览器。GWT 会自动生成适用于每种浏览器的 javascript 代码。
GWT 是开源的、完全免费的,全球有成千上万的开发人员在使用。它根据 Apache 许可证版本 2.0 获得许可。
以下是选择 GWT 进行开发项目的原因 −
基于 Java,您可以使用 Eclipse 等 JAVA IDE 来开发 GWT 应用程序。开发人员可以使用代码自动完成/重构/导航/项目管理以及 IDE 的所有功能。
GWT 提供完整的调试功能。开发人员可以像调试 Java 应用程序一样调试客户端应用程序。
GWT 可轻松与 Junit 和 Maven 集成。
同样基于 Java,GWT 对于 Java 开发人员来说学习难度较低。
GWT 生成优化的 javascript 代码,自行生成浏览器特定的 javascript 代码。
GWT 提供的 Widgets 库可满足应用程序中所需的大部分任务。
GWT 可扩展,可以创建自定义小部件以满足应用程序需求。
最重要的是,GWT 应用程序可以在所有主流浏览器和智能手机上运行,包括基于 Android 和 iOS 的手机/平板电脑。
以下是 GWT 的缺点 −
不可索引 − GWT 生成的网页不会被搜索引擎索引,因为这些应用程序是动态生成的。
不可降级 − 如果您的应用程序用户禁用 Javascript,则用户只会看到基本页面,而不会看到其他内容。
对设计师不友好 − GWT 不适合喜欢使用纯 HTML 和占位符在以后插入动态内容的网页设计师。
以下是 GWT 的核心组件−
GWT Java 到 JavaScript 编译器 − 这是 GWT 最重要的部分,它使其成为构建 RIA 的强大工具。GWT 编译器用于将所有用 Java 编写的应用程序代码转换为 JavaScript。
JRE 模拟库 − Google Web Toolkit 包含一个模拟 Java 运行时库子集的库。该列表包括 java.lang、java.lang.annotation、java.math、java.io、java.sql、java.util 和 java.util.logging。
GWT UI 构建库 − GWT 的这一部分由许多子部分组成,包括实际的 UI 组件、RPC 支持、历史记录管理等等。
GWT 托管 Web 浏览器 − GWT 托管 Web 浏览器允许您在托管模式下运行和执行 GWT 应用程序,其中您的代码在 Java 虚拟机中以 Java 形式运行,而无需编译为 JavaScript。
GWT 应用程序由以下四个重要部分组成,其中最后一部分是可选的,但前三个部分是必需的−
模块描述符
公共资源
客户端代码
服务器端代码
模块描述符是 XML 形式的配置文件,用于配置 GWT 应用程序。模块描述符文件扩展名为 *.gwt.xml,其中 * 是应用程序的名称,此文件应位于项目的根目录中。
这提供了应用程序的名称。
这会在应用程序中添加其他 gwt 模块,就像在 java 应用程序中导入一样。可以通过这种方式继承任意数量的模块。
这指定了将开始加载 GWT 应用程序的类的名称。
是的!可以添加任意数量的入口点类。
onModuleLoad() 函数被调用,其行为类似于 Java 应用程序的 main 方法。
它们按照入口点类在模块文件中出现的顺序依次调用。因此,当第一个入口点的 onModuleLoad() 完成时,将立即调用下一个入口点。
这指定了 GWT 编译器将搜索源编译的源文件夹的名称。
公共路径是项目中存储 GWT 模块引用的静态资源(例如 CSS 或图像)的位置。
默认公共路径是存储模块 XML 文件的公共子目录。
自动注入位于 src 指定位置的外部 JavaScript 文件。
自动注入位于 src 指定位置的外部 CSS 文件。
模块入口点是任何可分配给 EntryPoint 且无需参数即可构造的类。加载模块时,每个入口点类都会被实例化,并且其 EntryPoint.onModuleLoad() 方法会被调用。
它包含解析延迟绑定配置(例如,浏览器检测)和使用 GWT 编译器生成的查找表来定位其中一个 .cache.html 所需的 javascript 代码。
它包含 GWT 应用程序的实际程序。
以下是浏览器加载 GWT 应用程序时 GWT 应用程序的引导过程步骤 −
浏览器加载主机 html 页面和 .nocache.js 文件。
浏览器执行 .nocache.js 文件的 javascript 代码。
.nocache.js 代码解析延迟绑定配置(例如,浏览器检测)并使用 GWT 编译器生成的查找表来定位其中一个.cache.html。
.nocache.js 代码随后创建一个 html 隐藏 iframe,将该 iframe 插入到主机页面的 DOM 中,并将 .cache.html 文件加载到同一个 iframe 中。
.cache.html 包含 GWT 应用程序的实际程序,一旦加载到 iframe 中,就会在浏览器中显示 GWT 应用程序。
每当编译 GWT 应用程序时,GWT 编译器每次都会生成具有相同名称的 .nocache.js 文件。因此,浏览器应始终下载 .nocache.js 文件以获取最新的 gwt 应用程序。 gwt.js 代码实际上在文件名末尾附加了一个唯一的时间戳,以便浏览器始终将其视为新文件,并且永远不会缓存它。
最重要的公共资源是主机页,用于调用实际的 GWT 应用程序。应用程序的典型 HTML 主机页可能根本不包含任何可见的 HTML 正文内容,但始终希望通过 <script.../> 标记包含 GWT 应用程序。
默认情况下,每个组件的类名是 gwt-<classname>。例如,Button 小部件具有 gwt-Button 的默认样式,类似地,TextBox 小部件具有 gwt-TextBox 的默认样式。
不!默认情况下,浏览器和 GWT 都不会为小部件创建默认的 id 属性。
此方法将清除所有现有样式,并使用 style 将小部件样式设置为提供的新 CSS 类。
此方法将向小部件添加次要或依赖的样式名称。次要样式名称是附加样式名称,因此,如果之前已应用任何样式名称,则将保留这些名称。
此方法将从小部件中删除给定样式,并保留与小部件关联的任何其他样式。
此方法获取对象的所有样式名称,以空格分隔的列表形式显示。
此方法设置对象的主要样式名称并更新所有依赖样式名称。
默认情况下,小部件的主要样式名称将是其小部件类的默认样式名称。例如,按钮小部件的默认样式名称为 gwt-Button。当我们使用 AddStyleName() 方法添加和删除样式名称时,这些样式称为次要样式。
小部件的最终外观由添加到它的所有次要样式的总和加上其主要样式决定。您可以使用 setStylePrimaryName(String) 方法设置小部件的主要样式。
有多种方法可以将 CSS 文件与模块关联。现代 GWT 应用程序通常结合使用 CssResource 和 UiBinder。
在主机 HTML 页面中使用 <link> 标记。
在模块 XML 文件中使用 <stylesheet> 元素。
使用 ClientBundle 中包含的 CssResource。
使用内联 <ui:style> UiBinder 模板中的元素。
UIObject 类是所有用户界面对象的超类。
UIObject 类是所有用户界面对象的超类。它只是包装了一个 DOM 元素,不能接收事件。它提供直接子类,如 Widget、MenuItem、MenuItemSeparator、TreeItem。
所有 UIObject 对象都可以使用 CSS 进行样式设置。
每个 UIObject 都有一个主样式名称,用于标识应始终应用于它的关键 CSS 样式规则。
通过操作对象的次要样式名称,可以实现更复杂的样式行为。
Widget 类是大多数用户界面对象的基类。小部件增加了从浏览器接收事件并直接添加到面板的支持。
此小部件包含文本,未使用 <div> 元素将其解释为 HTML,从而导致其以块布局显示。
此小部件可以包含 HTML 文本并使用 <div> 显示 html 内容元素,使其以块布局显示。
此小部件在给定的 URL 处显示图像。
此小部件代表一个简单的 <a>元素。
按钮小部件代表标准按钮。
PushButton 代表具有自定义样式的普通按钮。
ToggleButton 小部件代表时尚的状态按钮,允许用户在向上和向下状态之间切换。
CheckBox 小部件代表标准复选框小部件。此类还充当 RadioButton 的基类。
RadioButton 小部件代表互斥选择单选按钮小部件。
ListBox 小部件代表用户的选择列表,无论是作为列表框还是下拉列表。
SuggestBox 小部件代表一个文本框或文本区域,显示与用户输入匹配的一组预配置选择。每个 SuggestBox 都与一个 SuggestOracle 相关联。 SuggestOracle 用于根据特定查询字符串提供一组选择。
TextBox 小部件代表单行文本框。
PasswordTextBox 小部件代表一个文本框,它在视觉上掩盖其输入以防止窃听。
TextArea 小部件代表允许输入多行文本的文本框。
RichTextArea 小部件代表允许复杂样式和格式的富文本编辑器。
FileUpload 小部件包装 HTML <input type='file'>元素。
隐藏小部件代表 HTML 表单中的隐藏字段。
树小部件代表标准分层树小部件。树包含用户可以打开、关闭和选择的 TreeItem 层次结构。
MenuBar 小部件代表标准菜单栏小部件。菜单栏可以包含任意数量的菜单项,每个菜单项都可以触发命令或打开级联菜单栏。
DatePicker 小部件代表标准 GWT 日期选择器。
CellTree 小部件代表树视图。此小部件仅在标准模式下工作,这要求运行它的 HTML 页面具有显式 <!DOCTYPE>声明。
CellList 小部件代表单列单元格列表。
CellTable 小部件代表支持分页和列的表格视图。
CellBrowser 小部件代表树的可浏览视图,其中每个级别一次只能打开一个节点。此小部件仅在标准模式下工作,这要求运行它的 HTML 页面具有显式 <!DOCTYPE> 声明。
布局面板可以包含其他小部件。这些面板控制小部件在用户界面上的显示方式。每个 Panel 小部件都从 Panel 类继承属性,而 Panel 类又从 Widget 类继承属性,Widget 类又从 UIObject 类继承属性。
Panel 是所有面板的抽象基类,面板是可以包含其他小部件的小部件。
FlowPanel 小部件表示使用默认 HTML 布局行为格式化其子小部件的面板。
HorizontalPanel 小部件表示将其所有小部件都放在单个水平列中的面板。
VerticalPanel 小部件表示将其所有小部件都放在单个垂直列中的面板。
HorizontalSplitPanel 小部件表示将两个小部件排列在单个水平行中的面板,并允许用户以交互方式更改两个小部件各自所占宽度的比例。必要时,HorizontalSplitPanel 中包含的小部件将自动用滚动条装饰。
VerticalSplitPanel 小部件表示一个面板,该面板将两个小部件排列在一个垂直列中,并允许用户以交互方式更改两个小部件各自专用的高度比例。必要时,VertialSplitPanel 中包含的小部件将自动用滚动条装饰。
FlexTable 小部件表示一个灵活的表格,可根据需要创建单元格。它可以是锯齿状的(即每行可以包含不同数量的单元格),并且可以将单个单元格设置为跨越多行或多列。
Grid 小部件表示一个矩形网格,其单元格内可以包含文本、html 或子小部件。必须将其大小明确调整为所需的行数和列数。
DeckPanel 是一个面板,它在"面板"中显示其所有子小部件,一次只能看到一个。它由 TabPanel 使用。
此小部件表示一个面板,该面板将其子小部件"停靠"在其外边缘,并允许其最后一个小部件占据其中心的剩余空间。
此小部件表示一个包含 HTML 的面板,并且可以将子小部件附加到该 HTML 中已识别的元素。
此小部件表示一个面板,该面板表示一组选项卡式页面,每个页面包含另一个小部件。当用户选择与其关联的各种选项卡时,将显示其子小部件。选项卡可以包含任意 HTML。
此小部件表示一种可以包装另一个小部件的小部件,隐藏被包装的小部件的方法。当添加到面板时,复合窗口的行为与它所包装的小部件被添加时的行为完全相同。
SimplePanel 是仅包含一个小部件的面板的基类。
ScrollPanel 小部件代表一个将其内容包装在可滚动区域中的简单面板。
FocusPanel 小部件代表一个使其内容可聚焦的简单面板。其内容可聚焦,并增加了捕获鼠标和键盘事件的能力。
此小部件表示将其内容包装在 HTML <FORM> 元素中的面板。
此小部件表示可以弹出到其他小部件上的面板。它覆盖浏览器的客户区(以及任何先前创建的弹出窗口)。
此小部件表示一种弹出窗口形式,其顶部有一个标题区域,用户可以拖动它。与 PopupPanel 不同,即使尚未添加小部件,对 PopupPanel.setWidth(String) 和 PopupPanel.setHeight(String) 的调用也会设置对话框本身的宽度和高度。
GWT 提供了类似于 Java AWT 或 SWING 用户界面框架的事件处理程序模型。
侦听器接口定义了小部件调用以宣布事件的一个或多个方法。 GWT 提供了与各种可能事件相对应的接口列表。
希望接收特定类型事件的类会实现关联的处理程序接口,然后将对自身的引用传递给小部件以订阅一组事件。
例如,Button 类发布点击事件,因此您必须编写一个类来实现 ClickHandler 来处理点击事件。
所有 GWT 事件处理程序都已从 EventHandler 接口扩展,并且每个处理程序都只有一个带有单个参数的方法。此参数始终是关联事件类型的对象。每个事件对象都有多种方法来操作传递的事件对象。
GWT 提供了三种创建自定义用户界面元素的方法。有三种通用策略可供遵循 −
通过扩展 Composite Class 创建小部件 − 这是创建自定义小部件最常见、最简单的方法。在这里,您可以使用现有小部件创建具有自定义属性的复合视图。
使用 JAVA 中的 GWT DOM API 创建小部件 − GWT 基本小部件就是以这种方式创建的。但这仍然是一种非常复杂的创建自定义小部件的方法,应谨慎使用。
使用 JavaScript 并使用 JSNI 将其包装在小部件中 − 这通常只应作为最后的手段来完成。考虑到本机方法的跨浏览器影响,它变得非常复杂,也更难调试。
UiBinder 是一个旨在分离用户界面功能和视图的框架。
UiBinder 框架允许开发人员将 gwt 应用程序构建为 HTML 页面,并在其中配置 GWT 小部件。
UiBinder 框架使与更熟悉 XML、HTML 和 CSS 而不是 Java 源代码的 UI 设计人员的协作更加容易。
UIBinder 提供了一种定义用户界面的声明性方式。
UIBinder 将编程逻辑与UI。
UIBinder 类似于 JSP 与 Servlet。
RPC,远程过程调用,是 GWT 使用的机制,客户端代码可以直接执行服务器端方法。
GWT RPC 基于 servlet。
GWT RPC 是异步的,客户端在通信期间永远不会被阻止。
使用 GWT RPC Java 对象可以直接在客户端和服务器之间发送(由 GWT 框架自动序列化)。
服务器端 servlet 称为服务。
远程从客户端代码调用服务器端 servlet 的方法的过程调用称为调用服务。
以下是 GWT RPC 通信机制中使用的三个组件 −
在服务器上运行的远程服务(服务器端 servlet)。
用于调用该服务的客户端代码。
将在客户端和服务器之间传递的 Java 数据对象。
GWT 客户端和服务器都会自动序列化和反序列化数据,因此开发人员无需序列化/反序列化对象,并且数据对象可以通过 HTTP 传输。
Java 数据对象应实现 isSerializable 接口,以便可以在 GWT RPC 中通过网络传输。
国际化是一种在网站上显示特定于语言环境的信息的方式。例如,在美国以英语显示网站内容,而在法国以丹麦语显示网站内容。
GWT 提供了三种方法可以使 GWT 应用程序国际化 −
静态字符串国际化。
动态字符串国际化。
可本地化的界面。
这种技术最为普遍,运行时所需的开销很小;是一种非常有效的翻译常量和参数化字符串的技术;最容易实现。静态字符串国际化使用标准 Java 属性文件来存储翻译的字符串和参数化消息,并创建强类型 Java 接口来检索它们的值。
这种技术非常灵活,但比静态字符串国际化慢。主机页面包含本地化字符串,因此,当我们添加新的语言环境时,不需要重新编译应用程序。如果要将 GWT 应用程序与现有的服务器端本地化系统集成,则可以使用此技术。
这种技术是三种技术中最强大的。实现 Localizable 允许我们创建自定义类型的本地化版本。这是一种先进的国际化技术。
extend-property 标签的属性名称设置为语言环境,值设置为特定语言环境,例如 de 表示德语语言环境。
为了使用 GWT 历史记录支持,我们必须首先将以下 iframe 嵌入到我们的主机 HTML 页面中。
<iframe src="javascript:''" id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe>
日志框架模拟 java.util.logging,因此它使用相同的语法,并且具有与服务器端日志代码相同的行为。
GWT 日志使用 .gwt.xml 文件进行配置。
我们可以配置日志的启用/禁用;我们可以启用/禁用特定处理程序,并更改默认日志记录级别。
SystemLogHandler 记录到 stdout,并且这些消息只能在 DevMode 窗口中的开发模式下看到。
DevelopmentModeLogHandler 通过调用方法 GWT.log 进行记录。这些信息只能在 DevMode 窗口中的开发模式下看到。
ConsoleLogHandler 将日志记录到 javascript 控制台,该控制台由 Firebug Lite(适用于 IE)、Safari 和 Chrome 使用。
FirebugLogHandler 将日志记录到 Firebug 控制台。
启用此处理程序后,PopupLogHandler 将日志记录到位于应用程序左上角的弹出窗口。
此处理程序将日志消息发送到服务器,服务器将使用服务器端日志记录机制记录这些消息。