使用GWT框架1.5版本进行应用迁移与优化
立即解锁
发布时间: 2025-08-17 02:12:27 阅读量: 1 订阅数: 3 

### 使用 GWT 框架 1.5 版本进行应用迁移与优化
#### 1. 引言
在软件开发过程中,框架的更新换代是常有的事。GWT 框架 1.5 版本的发布,可能会对现有的应用产生影响。为了了解这些影响,我们将以 BookStore、LoanServicingSystem 和 AdvancedWidgets 这几个应用为例,详细探讨如何在新的 1.5 版本框架下进行应用的迁移和优化。
#### 2. 配置并运行 BookStore 示例应用
##### 2.1 复制并清理项目文件夹
首先,将 `C:\gwt\bookstore` 文件夹复制到 `C:\gwt15` 文件夹中。然后,删除 `C:\gwt15\bookstore` 文件夹中所有生成的文件,确保该文件夹的内容符合预期。
##### 2.2 修改配置文件中的库路径
需要修改 `.classpath`、`BookStore.launch`、`BookStore-compile.cmd` 和 `BookStore-shell.cmd` 这四个文件,将其中引用的库路径从 `c:\gwt` 文件夹修改为 `c:\gwt15` 文件夹。例如,原始的 `BookStore-shell.cmd` 文件内容如下:
```
@java -cp "%~dp0\src;%~dp0\bin;C:/gwt/gwt-user.jar;C:/gwt/gwt-dev-windows.jar"
com.google.gwt.dev.GWTShell -out "%~dp0\www" %*
com.apress.gwt.chapter6.BookStore/BookStore.html
```
修改后的 `BookStore-shell.cmd` 文件内容如下:
```
@java -cp "%~dp0\src;%~dp0\bin;C:/gwt15/gwt-user.jar;C:/gwt15/gwt-dev-windows.jar"
com.google.gwt.dev.GWTShell -out "%~dp0\www" %*
com.apress.gwt.chapter6.BookStore/BookStore.html
```
**注意**:之所以要修改这四个文件,是因为它们是使用 `C:\gwt`(代表 1.4.61 版本)文件夹中的 `projectCreator` 和 `applicationCreator` 工具创建的。如果一开始就使用 `C:\gwt15` 文件夹中的工具创建应用,这些文件应该会正确引用 `gwt15` 文件夹中的库路径。
##### 2.3 在 Eclipse 中导入并运行项目
在确保所有文件的库路径配置正确后,在 Eclipse 中导入该项目。需要注意的是,要先从 Eclipse 工作区中删除旧的 bookstore 项目,因为 Eclipse 不允许添加同名的多个项目。删除现有项目时,要选择“不删除内容”选项,以免删除项目的源代码。
假设 Eclipse IDE 的“自动构建”设置已启用,导入项目后,通过双击 `BookStore-shell.cmd` 脚本即可运行 BookStore 应用。应用将在托管窗口中启动,相关窗口会显示应用日志和错误堆栈跟踪信息。
#### 3. 使用泛型实现类型安全的集合
在运行 BookStore 应用时,可能会在堆栈跟踪信息中看到警告消息,提示 `gwt.typeArgs` 参数标签已被弃用,建议使用泛型来指定集合类中对象的类型。例如:
```plaintext
Method public abstract java.lang.String storeOrder(java.util.List books,
java.lang.String userName)
Deprecated use of gwt.typeArgs for parameter books; Please use
java.util.List<com.apress.gwt.chapter6.client.Book> as the parameter's type
Method public abstract java.util.List getBooks(java.lang.String category)
Deprecated use of gwt.typeArgs for the return type; Please use
java.util.List<com.apress.gwt.chapter6.client.Book> as the method's return type
```
为了解决这个问题,需要修改 `BookStoreService` 类,使用泛型来指定集合类中包含的对象类型。修改后的 `BookStoreService` 接口代码如下:
```java
package com.apress.gwt.chapter6.client;
import java.util.List;
import com.google.gwt.user.client.rpc.RemoteService;
/**
* @author Vipul Gupta ([email protected])
*/
public interface BookStoreService extends RemoteService {
public List<Book> getBooks(String category);
public String storeOrder(List<Book> books, String userName);
public List<Book> addToCart(List<Book> books);
}
```
修改完成后,再次使用 `BookStore-shell.cmd` 脚本重启应用。此时,在嵌入式 Web 服务器窗口中运行应用将不再出现相关警告。不过,Java 编译器可能还会针对集合类和 `AsyncCallback` 对象的类型安全问题抛出一些警告。为了确保类型安全,还需要修改 `BookStoreServiceAsync`、`BookUtil` 和 `BookStoreServiceImpl` 等类,添加列表中使用的对象类型(在本应用中为 `Book` 对象)。
#### 4. 类型安全的 AsyncCallback 对象
即使在 `BookStoreServiceAsync` 接口中对 `List` 类添加了泛型,Java 编译器仍然可能会针对 `AsyncCallback` 对象抛出警告,提示对泛型类型 `AsyncCallback<T>` 的引用应该进行参数化。这是因为 `AsyncCallback` 对象也已经实现了类型安全,需要指定 RPC 方法的返回类型作为相应回调对象的类型,即:
```java
AsyncCallback<Return type of the RPC call>
```
这个返回类型会映射到 `AsyncCallback` 对象的 `onSuccess(...)` 方法的参数,该方法用于处理 RPC 调用的响应。以下是 `StoreOrderCallback` 类的原始版本和修改后的版本示例:
**原始版本**:
```java
public class StoreOrderCallback implements AsyncCallback {
public void onFailure(Throwable caught) {
GWT.log("Error in storing order.", caught);
Window.alert("Error in storing order. Try again later.");
}
public void onSuccess(Object result) {
showSuccessMessage((String) result);
}
}
```
**修改后的版本**:
```java
public class StoreOrderCallback implements AsyncCallback<String> {
public void onFailure(Throwable caught) {
GWT.log("Error in storing order.", caught);
Window.alert("Error in storing order. Try again later.");
}
public void onSuccess(String result) {
showSuccessMessage(result);
}
}
```
同样地,`BookListUpdaterCallback` 类也需要进行类似的修改:
```java
public class BookStore implements EntryPoint, ClickListener, HistoryListener {
...
private List<Book> booksBeingDisplayed;
...
public class BookListUpdaterCallback implements AsyncCallback<List<Book>> {
public void onFailure(Throwable caught) {
GWT.log("Error in retrieving books list.", caught);
Window.alert("Error in retrieving books list. Try again later.");
}
public void onSuccess(List<Book> result) {
booksBeingDisplayed = result;
displayBooks(result);
}
}
...
private void displayBooks(List<Book> booksList) {
...
}
}
```
此外,还需要修改 `AddToCartCallback` 类和 `BookStoreServiceAsync` 接口。修改后的 `BookStoreServiceAsync` 接口代码如下:
```java
package com.apress.gwt.chapter6.client;
import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.RemoteService;
/**
* @author Vipul Gupta ([email protected])
*/
public interface BookStoreServiceAsync extends RemoteService {
public void getBooks(String category, AsyncCallback<List<Book>> callback);
public void storeOrder(List<Book> books, String userName,
AsyncCallback<String> callback);
public void addToCart(List<Book> books, AsyncCallback<List<Book>> callback);
}
```
按照上述方式修改其余类,使用泛型指定 BookStore 应用中所有对象的类型,这样可以使应用更加类型安全,减少出错的可能性。
#### 5. 迁移 LoanServicingSystem 应用
##### 5.1 配置项目
迁移 LoanServicingSystem 应用的步骤与 BookStore 应用类似。同样需要将项目复制到 `C:\gwt15` 文件夹,并修改相关配置文件中的库路径。不同的是,对于这个应用,还需要保留测试文件夹和所有相应的测试脚本(如 `TestLoanServicingSystem-hosted.cmd`),并修改这些测试脚本中的 GWT 库路径。
##### 5.2 处理基准测试类的变更
新的库版本对基准测试相关类进行了一些更改。当在 Eclipse 中打开 LoanServicingSystem 项目(已进行修改以适配新库)时,可能会在测试文件夹中,特别是 `StructureBenchmark` 类中看到一些错误。经过仔细检查会发现,IDE 在查找该测试中使用的 `Benchmark`、`IntRange` 和 `Operator` 类时抛出了错误。这是因为基准测试类已经从 `com.google.gwt.junit.client` 包移动到了 `com.google.gwt.benchmarks.client` 包。只需修改文件顶部的导入语句,使用新包路径,即可消除项目中的编译错误。
##### 5.3 基准测试的新注解
在命令行中使用 `StructureBenchmark-hosted.cmd` 脚本启动基准测试时,可能会看到编译器抛出的关于 `gwt.benchmark.param` 参数标签的警告信息:
```plaintext
C:\gwt15\LoanServicingSystem>StructureBenchmark-hosted.cmd
.Rebinding com.apress.gwt.chapter3.client.StructureBenchmark
Invoking <generate-with
class='com.google
```
0
0
复制全文
相关推荐






