首页 / 脚本样式 / Ajax / 使用Google Web Toolkit、Apache Derby和Eclipse构建Ajax应用程序 3
使用Google Web Toolkit、Apache Derby和Eclipse构建Ajax应用程序 32010-07-21 IBM Noel RappinAjax 中的 A启用了 Asynchronous JavaScript + XML (Ajax) 的 Web 应用程序与传统 Web 应用程序之间的主要差别在于 Ajax 中的 A:异步。Ajax 应用程序允许浏览器更新页面的特定部分而无需完全刷新整个页面。这种简单的技巧将提供更具有交互性的用户体验,因为简单的 Web 页面现在运行得更像是桌面应用程序。从开发人员的角度来看,这种异步行为有两个关键组件:XMLHttpRequest 对象是由浏览器定义的 JavaScript 对象,它将使 Web 页面可以在后台线程中发送 HTTP 请求和接收响应。与传统的页面请求不同的是,调用不会中断用户体验,而浏览器在等待响应时也不会暂停。某类回调是在响应完成后执行的。该回调通常使用 JavaScript 文档对象模型(Document Object Model,DOM)来根据新数据操作页面元素。屏幕上发生的变化很酷,用户也很开心。因此基本流程如下:向服务器发出调用,返回响应,并根据响应对页面采取操作。此外,需要记住的重要一点是所有操作都是在后台进行的,而无需忙时等待及根据浏览器中页面的典型更改进行刷新。整个 XMLHttpRequest/DOM 方法只有一个问题:它很令人头痛。一方面,每个浏览器都各自实现相应的 JavaScript 对象。另一方面,使数据到达服务器可能会十分棘手,因此将响应转换为有用的数据也可能会十分棘手。结果,每个名副其实的 Ajax 框架都有某种简单的包装器用于创建、调用和管理 RPC。GWT 也不例外。GWT 使用让人回想起 Enterprise JavaBeans (EJB) 技术的多接口基础设施管理 RPC,但是 —— 谢天谢地 —— 简单了很多。问题是要定义系统执行的远程调用的列表。GWT 将实现后台通道,用于转换返回服务器的数据、进行服务器调用,并将返回的数据转换回客户机数据。然后定义远程调用完全返回后要执行哪些操作。它不像执行一次普通的 Java 方法调用那样简单,但是它也不难。将对 Slicr 应用程序执行的更改是为了从服务器数据库中检索浇头的初始列表,而不是将浇头硬编码到客户机代码中。无可否认,这个简单示例将引导您完成执行 RPC 调用所需的所有步骤。要轻松地运行此示例,请以托管模式运行。在托管模式下,GWT 将自动模拟远程调用。如果使用诸如 Eclipse 或 IntelliJ IDEA 之类的集成开发环境 (IDE),您将获得一些关于在托管模式下运行的支持。注:在本系列文章的最后一篇文章里,我将向您展示如何在普通 servlet 环境中运行服务器端。定义服务GWT 过程调用中的大部分工作都是在两个类中进行的。在服务器端,定义 RemoteServiceServlet 的子类。在这个类中,将操作服务器数据并将值返回给客户机(或者抛出异常,但是此刻先让我们乐观一些认为不会出现这种情况)。在客户端,定义一个实现 AsyncCallback 接口的类。在这个类中,定义服务器操作完成时客户机页面如何处理数据(或异常)。除了这两个类之外,必须编写一些绑定代码使 GWT 可以将客户端类和服务器端类绑定在一起。没错,那真是一大堆 绑定代码。绑定代码包含两个不同的接口外加一些客户端代码以及一两个设置。但是不必担心;大部分代码都是样例,并且如果您按照它逐步执行,将不会遇到任何问题。从服务器端开始。在这里的目标只是要生成在 上一篇文章 末尾放入数据库中的所有浇头的列表。服务器将使用该文章中的简单 ObjectFactory(参见清单 1)帮助您工作。清单 1. 浇头服务实现public class ToppingServiceImpl extends RemoteServiceServlet
implements ToppingService {
public static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
public static final String PROTOCOL = "jdbc:derby:slicr;";
public List getAllToppings() {
try {
Class.forName(DRIVER).newInstance();
Connection con = DriverManager.getConnection(PROTOCOL);
Statement s = con.createStatement();
ResultSet rs = s.executeQuery(
"SELECT * FROM toppings order by name");
return ObjectFactory.convertToObjects(rs, Topping.class);
} catch (Exception e) {
e.printStackTrace();
return new ArrayList();
} finally {
try {
DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (SQLException ignore) {}
}
}
}
关于这段代码需要注意的第一件事是它实在没有任何神奇之处。GWT 远程服务的要求很简单,它必须扩展 RemoteServiceServlet 并实现一个接口,您将在下面两个段落中创建该接口。注:看似好像大部分 GWT 文档让您先创建接口。那很好,一点儿问题都没有。我只是认为先创建具体代码会显得更清晰。除那之外,这段代码与上一篇文章中的 ToppingTestr 示例(重新包装以供在 GWT 内使用)具有几乎相同的功能。对 Derby 数据库进行一次调用,使用对象工厂创建浇头对象,并返回浇头对象。