2012-06-15 21 views
1

我全新的遊標,並具有以下方法:GWT從服務器與RequestFactory客戶通過物化光標,並顯示在DataGrid中多個頁面

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 Shiro來跟蹤用戶的會話 - 在用戶的會話中,我保留最後使用的遊標 - 如果用戶從頁面導航離開頁面,我將光標設置爲false(顯然 - 這是非常非常脆弱的,因爲它需要每個方法都有一個代碼來使最後一個遊標無效)。

現在,這裏是我被抓到的地方。我做了一個簡單的HasCursor接口,並且將要傳回帶有Cursor的List到客戶端 - 唯一的問題是RequestFactory只能處理從服務器到客戶端的某些類型的傳遞 - 這個Custom類型不是其中之一。所以,現在使用GWT RequestFactory - 是否有一種將Objectify光標從服務器傳遞到客戶端的好方法?

另外 - 我遇到的另一個問題 - 如果我用這個數據填充DataGrid它顯示網格中的數據罰款 - 但就是這樣 - 尋呼機說25-25中的1-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); 
} 

所以 - 這是它的一部分 - 有一件事我仍然還沒有完全想通了如何做是讓頁面設置正確 - 我想顯示在尋呼機中的項目的總數,讓您通過它,但我不知道如何做到這一點 - 但如果我找到解決方案我將發佈它

回答

0

您可以將Cursor轉換爲可串行化的字符串 - 實際上您已經使用了這個:iterator.getCursor().toWebSafeString()

只需將序列化的遊標(=一個字符串)與所有其他列表數據一起返回給客戶端,並在下一個請求中將其作爲參數提供。

Optonaly用它fragment identifier,又名GWT history token,使用戶可以真正書籤特定頁面的列表(取決於所使用的情況下,有道理的,如果列表數據沒有太大變化)。

+0

嗯 - 這就是問題 - 使用RequestFactory我不知道如何返回它 - 使用RequestFactory,好像我無法將兩者一起返回 - 從請求工廠網站它說我只能返回原語,盒裝原語,其他(枚舉,大整數,大小數,日期),值/實體的代理,和設置/列表 - 我無法弄清楚如何將字符串返回列表,因爲我無法傳回包含一個列表和一個字符串的對象 –

相關問題