1

私はカーソルが初めてで、次の方法があります。

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);
}

get は次のメソッドです

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;
}

さて、これが私が現在行っていることです-これは少しハックです。私は Apache Shiro を使用してユーザーのセッションを追跡しています - ユーザーのセッションでは、最後に使用されたカーソルを保持しています - ユーザーがページから離れてナビゲートした場合、カーソルを false に設定します (明らかに、これは必要なため非常に脆弱です)最後のカーソルを無効にするコードを持つすべてのメソッド)。

さて、ここで私が捕まるところです。私は単純な HasCursor インターフェイスを作成し、その中に Cursor を含む List をクライアント側に返すつもりでした - 唯一の問題は、RequestFactory がサーバーからクライアントへの特定のタイプの受け渡ししか処理できないことです - この Custom タイプはそれらの 1 つではありません。では、GWT RequestFactory を使用して、Objectify Cursor をサーバーからクライアントに渡す良い方法はありますか?

また-私が遭遇している別の問題-DataGridにこのデータを入力すると、グリッドにデータが正常に表示されます-しかし、それだけです-ページャーは25のうち1-25と言います。だから、私が疑問に思っているのは、サーバー上で利用可能なデータが他にもあることを DataGrid に実際にどのように伝えますか。これについて利用可能なドキュメント/例があまりないように見えるので、少し混乱しています。

どうもありがとうございました


この問題に遭遇した他の人のために、私はその一部に対する答えを見つけました-標準のJava BeanをマップしてRequestFactoryを使用してサーバーからクライアント側に返すことができるValueProxiesについてすべて忘れました。

残念ながら、ValueProxies で Generics を使用することはできないため、個別の型ごとに 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);
}

それで - それはそれの一部です - 私がまだ完全に理解していないことの1つは、ポケットベルを正しくセットアップすることです - ページャー内のアイテムの総数を表示して、ページをめくることができるようにしたいと思います.しかし、これを行う方法はまだ正確にはわかりません-解決策が見つかったら投稿します

4

1 に答える 1

0

シリアル化可能な文字列に変換できCursorます-実際には、すでにこれを使用しています:iterator.getCursor().toWebSafeString()

シリアル化されたカーソル(=文字列)を他のすべてのリストデータと一緒にクライアントに返し、次のリクエストでそれをパラメータとして提供するだけです。

フラグメント識別子、別名GWT履歴トークンでOptonalyを使用して、ユーザーがリスト内の特定のページを実際にブックマークできるようにします(ユースケースによって異なりますが、リストデータがあまり変更されない場合は意味があります)。

于 2012-06-15T22:23:16.980 に答える