GWT从服务器通过物化光标到客户端与RequestFactory,并显示在DataGrid中多个页面

2019-10-16 21:17发布

我是全新的游标,并具有以下方法:

public List<Venue> findPage(Subject subject, Objectify ofy, int pageSize) {
  final Business business = (Business) subject.getSession().getAttribute(BUSINESS_ATTRIBUTE);
  final Query<Venue> query = ofy.query(Venue.class).filter(BUSINESS_ATTRIBUTE, business);
  final String encodedCursor = (String) subject.getSession().getAttribute(VENUE_CURSOR_CONDITION);
  if (encodedCursor != null) {
    query.startCursor(Cursor.fromWebSafeString(encodedCursor));
  }
  final QueryResultIterator<Key<Venue>> iterator = query.fetchKeys().iterator();
  final List<Key<Venue>> data = new ArrayList<Key<Venue>>(pageSize);
  boolean more = false;
  for (int i = 0; i < pageSize && (more = iterator.hasNext()); i++) {
    data.add(iterator.next());
  }
  subject.getSession().setAttribute(VENUE_CURSOR_CONDITION, iterator.getCursor().toWebSafeString());
  return get(ofy, data);
}

其中,得到的是下面的方法

public <T> List<T> get(Objectify ofy, List<Key<T>> keys) {
  if (keys == null) {
    return null;
  }
  final Map<Key<T>, T> map = ofy.get(keys);
  final List<T> list = new ArrayList<T>();
  for (T t : map.values()) {
    list.add(t);
  }
  return list;
}

现在,这里是我在做什么现在 - 这是一个小的hackish。 我使用的Apache四郎来跟踪用户会话 - 在用户的会话我保持使用的最后一个光标 - 如果用户导航离开页面我将光标设置为false(很明显 - 这是非常,因为它需要很脆每一个方法都有一个代码无效的最后一个光标)。

现在,这里的地方,我被逮住。 我做了一个简单的界面HasCursor,并打算在它传回用光标列表到客户端 - 唯一的问题是RequestFactory只能处理从服务器传递某些类型的客户 - 这个自定义类型是不是其中之一。 所以,现在与GWT RequestFactory - 有从服务器到客户端传递一个客体光标的好办法?

而且 - 我遇到的另一个问题 - 如果我填充DataGrid与此数据它显示在网格中的数据很好 - 但仅此而已 - 寻呼机1-25说出来的25.所以,我想知道是,你怎么居然告诉DataGrid中有服务器上可用的更多的数据。 我有点困惑,因为它似乎没有适用于此一大堆的文件/例子。

非常感谢你


对于其他人,运行到这个问题,我找到了答案,以它的一个组成部分 - 我忘了所有关于ValueProxies,使您可以映射标准的Java bean从与RequestFactory服务器返回给客户端。

不幸的是,你不能ValueProxies所以我不得不为每个单独的类型ListCursor包装使用泛型。

这里的代理:

@ProxyFor(value = VenueListCursorWrapper.class)
public interface VenueListCursorWrapperProxy extends ValueProxy {

  List<VenueProxy> getVenues();

  String getCursor();

  boolean isMoreAvailable();

  void setVenues(List<VenueProxy> venues);

  void setCursor(String cursor);

  void setMoreAvailable(boolean moreAvailable);
}

和这里的服务器上的更新方法:

public VenueListCursorWrapper findPage(Subject subject, Objectify ofy, int pageSize, String cursor) {
  final Business business = (Business) subject.getSession().getAttribute(BUSINESS_ATTRIBUTE);
  final Query<Venue> query = ofy.query(Venue.class).filter(BUSINESS_ATTRIBUTE, business);
  if (cursor != null) {
    query.startCursor(Cursor.fromWebSafeString(cursor));
  }
  final QueryResultIterator<Key<Venue>> iterator = query.fetchKeys().iterator();
  final List<Key<Venue>> data = new ArrayList<Key<Venue>>(pageSize);
  boolean more = false;
  for (int i = 0; i < pageSize && (more = iterator.hasNext()); i++) {
    data.add(iterator.next());
  }
  return new VenueListCursorWrapper(get(ofy, data), iterator.getCursor().toWebSafeString(), more);
}

所以 - 这是它的一部分 - 有一件事我还没有完全明白如何做的就是寻呼机设置正确 - 我想显示在寻呼机的项目总数,让您可以翻阅它但我不完全知道如何做到这一点,但 - 如果我找到一个解决方案,我将它张贴

Answer 1:

您可以转换Cursor到一个序列化字符串-实际上你已经在使用这样的: iterator.getCursor().toWebSafeString()

只是序列化光标(=一个字符串)与所有其他列表数据返回到客户端一起,并在下次请求提供它作为一个参数。

Optonaly使用它的片段标识符 ,又名GWT的历史标记 ,使用户可以真正书签特定页面的列表(取决于所使用的情况下,有道理的,如果列表数据没有太大变化)。



文章来源: GWT pass Objectify Cursor from Server to Client with RequestFactory and show more pages in DataGrid