【问题标题】:GXT - RequestFactory integration with Paging GridGXT - RequestFactory 与分页网格的集成
【发布时间】:2023-04-22 18:07:01
【问题描述】:

我很难理解应该如何编写我的 Service 类以使用 RequestFactory 实现 GXT 分页

我按照Demo site中提供的示例,以及Sencha网站中提供的javadoc example,但都未能完全理解。

首先让我们说我的 Service 正在返回 List<Data>Data 是服务器 POJO),需要以分页方式加载。

这是我的服务类,它暴露了一个分页方法

class BackendService {

   public List<Data> getData(int pageNumber, int pageSize) {
        int f = pageNumber * pageSize;
        int l = f + pageSize;
        if(f > 0 && l < datas.size()) {
            return  datas.subList(f, l);
        }
        return null;
   }
}

RequestFactory 看起来像这样

    @Service(value=BackendService.class, locator=BackendServiceLocator.class)
    interface BackendRequestContext extends RequestContext {

       Request<List<DataProxy>> getData(int pageNumber, int pageSize);

    }

    BackendRequestContext context();
}

分页Grid 期望DataProxy 实现如下

DataProxy<PagingLoadConfig, PagingLoadResult<com.emc.test.client.model.DataProxy>> proxy = new RequestFactoryProxy<PagingLoadConfig, PagingLoadResult<com.emc.test.client.model.DataProxy>>() {

            @Override
            public void load(PagingLoadConfig loadConfig, Receiver<? super PagingLoadResult<com.emc.test.client.model.DataProxy>> receiver) {
                int pageNum = loadConfig.getOffset();
                int pageSize = loadConfig.getLimit();
                Request<List<com.emc.test.client.model.DataProxy>> request = backendRequestFactory.context().getData(pageNum, pageSize);
                request.fire(receiver);
            }

};

在上述load方法中,这一行给出编译错误

request.fire(receiver);

因为Receiver应该是

Receiver<? super PagingLoadResult<com.emc.test.client.model.DataProxy>>

谁能帮我解决一下

  • 我应该如何实现服务方法?
  • 我是否应该从服务本身返回PagingLoadResult 而不是List?如果是怎么办?

感谢您抽出宝贵时间参与此主题!

【问题讨论】:

    标签: java gwt gxt requestfactory


    【解决方案1】:

    您还需要一对扩展 PagingLoadResultBean/PagingLoadResult 的 dto-proxy。

    1) 在后端部分,您创建了以下 dto:

    public class YourCustomPagingLoadResultBean extends PagingLoadResultBean<Data> {
    
      protected YourCustomPagingLoadResultBean () {
      }
    
      public YourCustomPagingLoadResultBean (List<Data> list, int totalLength, int offset) {
        super(list, totalLength, offset);
      }
    }
    

    2) 为这个 dto 创建代理:

    @ProxyFor(YourCustomPagingLoadResultBean.class)
    public interface YourCustomPagingLoadResultProxy extends ValueProxy, PagingLoadResult<DataProxy> {
      @Override
      List<DataProxy> getData();
    }
    

    3) 更改您的服务以返回分页 bean:

    public YourCustomPagingLoadResultBean getData(int pageNumber, int pageSize) {
      ...
      return new YourCustomPagingLoadResultBean(list, totalLength, offset);
    }
    

    4) 请求也更改为:

    Request<YourCustomPagingLoadResultProxy> getData(int pageNumber, int pageSize);
    

    您使用的DataProxy 看起来正确,您的分页网格将在这 4 个步骤后工作。

    【讨论】:

    • 太棒了!..感谢您清除了这一点..我经常难以理解预计将由 Sencha 实施的复杂合同。您能否指出我在网上提供的相关文件?
    • 我希望有任何:( GXT 示例页面是你最好的朋友。如果那里缺少什么,肯定在官方论坛或这里讨论过,在 * 上。Official blog 也有几篇解释性文章并且是一个很好的起点。
    最近更新 更多