数据支持组件:GXT中的数据处理与持久化
立即解锁
发布时间: 2025-08-18 00:43:32 阅读量: 1 订阅数: 2 

### 数据支持组件:GXT 中的数据处理与持久化
在 AJAX 应用程序中,能够在浏览器中操作数据是一项重要优势。GXT 提供了一系列有用的数据支持可视化组件,如 ListField、ComboBox 和 Grid,可让我们高效地对本地数据进行排序、过滤和编辑等操作。同时,还有一组组件用于在后台检索远程数据、在客户端缓存数据并将其提供给可视化组件。本文将详细介绍如何为这些可视化组件准备所需的数据,以及如何实现数据的持久化和检索。
#### 1. 数据模型准备
在使用 GXT 的数据支持组件时,数据对象必须实现 `ModelData` 接口。以一个名为 `Feed` 的 JavaBean 为例,它目前未实现该接口,因此不能直接用于 GXT 组件。我们可以通过以下三种方法来解决这个问题:
- **方法 1:扩展 BaseModel**
`BaseModel` 是 `ModelData` 接口的默认实现。扩展 `BaseModel` 的类使用 `HashMap` 来存储数据,而不是本地字段。数据的添加和检索分别使用 `BaseModel` 的 `set` 和 `get` 方法。不过,这种方法需要使用字符串作为属性名,容易引入错误。以下是 `Feed` 类扩展 `BaseModel` 的示例代码:
```java
public class Feed extends BaseModel {
public Feed () {
}
public Feed (String uuid) {
set("uuid", uuid);
}
public String getDescription() {
return get("description");
}
public String getLink() {
return get("link");
}
public String getTitle() {
return get("title");
}
public String getUuid() {
return get("uuid");
}
public void setDescription(String description) {
set("description", description);
}
public void setLink(String link) {
set("link", link);
}
public void setTitle(String title) {
set("title", title);
}
}
```
- **方法 2:实现 BeanModelTag**
`BeanModelTag` 是一个接口,可用于标记符合 JavaBean 规范的现有 Java 对象。通过 `BeanModelFactory`,可以从这些 JavaBean 生成 `BeanModel` 实例。要使现有的 `Feed` JavaBean 可作为 GXT `BeanModel` 使用,只需实现 `BeanModelTag` 接口,示例代码如下:
```java
public class Feed implements Serializable, BeanModelTag {
private String description;
private String link;
private String title;
private String uuid;
public Feed() {
}
public Feed(String uuid) {
this.uuid = uuid;
}
public String getDescription() {
return description;
}
public String getLink() {
return link;
}
public String getTitle() {
return title;
}
public String getUuid() {
return uuid;
}
public void setDescription(String description) {
this.description = description;
}
public void setLink(String link) {
this.link = link;
}
public void setTitle(String title) {
this.title = title;
}
}
```
- **方法 3:创建 BeanModelMarker**
`BeanModelMarker` 是一个接口,通过创建一个扩展它的接口,并使用注解来定义要包装的 JavaBean,可将现有 JavaBean 标记为 `BeanModel`。以下是为 `Feed` JavaBean 创建 `BeanModelMarker` 的具体步骤:
1. 在 `client.model` 包中创建一个名为 `FeedBeanModel` 的新类,实现 `BeanModelMarker` 接口:
```java
public class FeedBeanModel implements BeanModelMarker {}
```
2. 添加 `@BEAN` 注解,告诉 GXT 使用 `Feed` JavaBean 类:
```java
@BEAN(com.danielvaughan.rssreader.shared.model.Feed.class)
public class FeedBeanModel implements BeanModelMarker {}
```
通过上述操作,我们为现有的 `Feed` JavaBean 创建了 `BeanModelMarker`,可以在不修改 `Feed` 类的情况下,将其用于 GXT 的数据支持控件。
#### 2. 数据存储与组件绑定
在 GXT 中,`Store` 是一个抽象类,用于在客户端缓存指定类的 `ModelData` 对象。数据支持的 GXT 组件通过 `Store` 来存储数据。具体有两种具体的 `Store` 类:`TreeStore` 用于 `Tree` 组件,`ListStore` 用于存储数据列表,通常与 `ListField`、`ComboBox` 和 `Grid` 组件一起使用。
以下是创建包含 `Feed` 对象的 `ListStore` 的示例:
```java
ListStore<BeanModel> feedStore = new ListStore<BeanModel>();
```
需要注意的是,`ListStore` 只能包含继承自 `ModelData` 类的对象。如果要添加 `Feed` JavaBean 对象,需要使用 `BeanModelFactory` 将其转换为 `BeanModel` 表示。
接下来,我们将修改示例应用程序,以便在创建新的 `Feed` JavaBean 对象时,将其 `BeanModel` 表示添加到客户端的 `ListStore` 中,具体步骤如下:
1. 在 `RSSReaderConstants` 类中,为 `feed store` 添加一个新的常量:
```java
public static final String FEED_STORE = "feedStore";
```
2. 在 `RSSReader` 类的 `onModuleLoad` 方法中,创建一个新的 `ListStore`,并使用 `FEED_STORE` 常量作为键将其添加到 `Registry` 中:
```java
public void onModuleLoad() {
Registry.register(RSSReaderConstants.FEED_SERVICE,
GWT.create(FeedService.class));
Registry.register(RSSReaderConstants.FEED_STORE, new
ListStore<BeanModel>());
…
}
```
3. 在 `FeedForm` 的 `save` 方法中,修改回调函数的 `onSuccess` 方法,从 `Registry` 中检索 `feed store`:
```java
public void save(final Feed feed) {
@Override
public void onSuccess(Void result) {
Info.display("RSS Reader", "Feed " + feed.getTitle()
+ " saved successfully");
final ListStore<BeanModel> feedStore = Registry
.get(RSSReaderConstants.FEED_STORE);
}
…
}
```
4. 获取 `Feed` 类的 `BeanModelFactory`:
```java
public void onSuccess(Void result) {
Info.display("RSS Reader", "Feed " + feed.getTitle() + " saved
successfully");
final ListStore<BeanModel> feedStore =
Registry.get(RSSReaderConstants.FEED_STORE);
BeanModelFactory beanModelFactory =
BeanModelLookup.get().getFactory(feed.getClass());
}
```
5. 使用 `BeanModelFactory` 创建 `Feed` 对象的 `BeanModel` 表示,并将其添加到 `feed store` 中:
```java
public void onSuccess(Void result) {
Info.display("RSS Reader", "Feed " + feed.getTitle() + " saved
successfully");
final ListStore<BeanModel> feedStore =
Registry.get(RSSReaderConstants.FEED_STORE);
BeanModelFactory beanModelFactory =
BeanModelLookup.get().getFactory(feed.getClass()
```
0
0
复制全文
相关推荐










