Wicket:使用PagingNavigator进行数据查看

时间:2017-08-24 21:33:14

标签: java wicket dataview

我不知道为什么但是在我将PagingNavigator添加到我的Dataview之后,该页面第一次加载的速度慢了5秒。

我的数据提供者正在从数据库加载数据。但是,使用相同的数据提供者并只删除PagingNavigator,页面加载速度提高约5秒。

以下是代码:

private void initScreen() {
    feedbackPanel = new FeedbackPanel(Constants.FEEDBACK_CONST);
    add(feedbackPanel.setOutputMarkupId(true));

    form = new Form<Void>(FORM_CONST);

    prepareDataView();

    form.add(estabelecimentoDataView);  
    form.add(new PagingNavigator(NAVIGATOR_CONST, estabelecimentoDataView));

    add(form);      
}

private void prepareDataView() {        
    dataProvider = new EstabelecimentosProvider();
    /** dataview que lista as agencias */
    estabelecimentoDataView = new DataView<Estabelecimento>(ROWS_CONST, dataProvider) {

        /**
         * Serial id
         */
        private static final long serialVersionUID = -3327582763351095154L;

        @Override
        protected void populateItem(Item<Estabelecimento> item) {
            final Estabelecimento estab = item.getModelObject();

            AjaxLink<Void> link = new AjaxLink<Void>(LINK_CONST) {

                /**
                 * Serial id
                 * , tipoEmpresa.getDescricao()
                 */
                private static final long serialVersionUID = -1668530681964357458L;

                @Override
                public void onClick(AjaxRequestTarget target) {
                    selectedEstabelecimento = estab;
                    ParamsWrapper params = new ParamsWrapper();
                    params.put(Constants.KEY_CONST, estab.getId());
                    PageManager.changePage(this, PageManager.ESTABELECIMENTOS_ALTERAR_PAGE, params);
                }

            };
            link.add(new Label(NOME_CONST, new PropertyModel<String>(estab, "nome")));

            item.add(link);                             

            item.add(new Label(ENDERECO_CONST, new PropertyModel<String>(estab, "endereco")));
            item.add(new Label(BAIRRO_CONST, new PropertyModel<String>(estab, "bairro")));
            item.add(new Label(CIDADE_CONST, new PropertyModel<String>(estab, "cidade")));
            item.add(new Label(UF_CONST, new PropertyModel<String>(estab, "uf")));
            item.add(new AjaxButton(DELETE_CONST) {                 
                /**
                 * Serial id
                 */
                private static final long serialVersionUID = 1762220739285945720L;

                @Override
                protected void onSubmit(AjaxRequestTarget target) {
                    // TODO Auto-generated method stub
                    super.onSubmit(target);
                    selectedEstabelecimento = estab;
                    //removeConfirmationMessage(Constants.REMOVER_AGENCIA_CONST + selectedAgencia.getRazaoSocial() + "?", target);

                }

            });
        }       
    };      

    estabelecimentoDataView.setOutputMarkupId(true);        
    estabelecimentoDataView.setItemsPerPage(Constants.ITEMS_PER_PAGE);
    estabelecimentoDataView.setItemReuseStrategy(ReuseIfModelsEqualStrategy.getInstance());


}

更新(EstabelecimentosProvider实施):

public class EstabelecimentosProvider implements IDataProvider<Estabelecimento> {

/**
 * Serial id
 */
private static final long serialVersionUID = 1L;

@Override
public Iterator<? extends Estabelecimento> iterator(long first, long count) {
    return InstaPontoWebController.get().buscarEstabelecimentos(first, count).iterator();
}

@Override
public long size() {
    return InstaPontoWebController.get().buscarEstabelecimentosTotal();
}

@Override
public IModel<Estabelecimento> model(Estabelecimento object) {
    return new LoadableDetachableModel<Estabelecimento>() {

        /**
         * Serial id
         */
        private static final long serialVersionUID = 1L;

        @Override
        protected Estabelecimento load() {
            return InstaPontoWebController.get().buscarEstabelecimento(object.getId());
        }
    };
}

}

UPDATE(DAO实施):

public class EstabelecimentoDao {

/***
 * Usado para registrar todas chamadas da classe.
 */
Logger log = LogManager.getLogger(EstabelecimentoDao.class);

/**
 * Pesquisa por todas os estabelecimentos do sistema.
 * @return uma lista de estabelecimentos.
 */
public final List<Estabelecimento> buscarEstabelecimentos() {
    return EntityManagerHelper.getEntityManager().createQuery("FROM Estabelecimento",
            Estabelecimento.class).getResultList();
}


/**
 * Retorna o status que representa sem uso no sistema.
 * @param empresa a empresa em uso.
 * @return os estabelecimentos sem uso para a empresa passada.
 */
public List<Estabelecimento> buscarEstabelecimentosSemUso(Empresa empresa) {
    TypedQuery<Estabelecimento> query = null;
    List<Integer> estabelecimentos = prepareList(empresa.getPontos());
    List<Integer> ramosAtividade = prepareList(empresa.getRamosAtividade());
    if (estabelecimentos.size() > 0 && ramosAtividade.size() > 0) {
        query = EntityManagerHelper.getEntityManager().createQuery(
                "From Estabelecimento e where e.id not IN :filter and e.ramoAtividade.id IN :ids and e.ativo = :key Order by e.nome ASC",
                Estabelecimento.class);
        query.setParameter(Constants.FILTER_CONST, estabelecimentos);
        query.setParameter(Constants.IDS_CONST, ramosAtividade);
    } else if (ramosAtividade.size() > 0) {
        query = EntityManagerHelper.getEntityManager().createQuery(
                "From Estabelecimento e where e.ramoAtividade.id IN :ids and e.ativo = :key Order by e.nome ASC",
                Estabelecimento.class);
        query.setParameter(Constants.IDS_CONST, ramosAtividade);
    } else {
        query = EntityManagerHelper.getEntityManager().createQuery(
                "From Estabelecimento e where e.ativo = :key Order by e.nome ASC", Estabelecimento.class);
    }

    query.setParameter(Constants.KEY_CONST, true);

    return query.getResultList();
}


/**
 * Prepara lista de ids dos ramos de atividades. 
 * @param ramosAtividade os ramos de atividades.
 * @return a lista.
 */
private List<Integer> prepareList(Set<RamoAtividade> ramosAtividade) {
    List<Integer> list = new ArrayList<Integer>();
    for (RamoAtividade ramoAtividade : ramosAtividade) {
        list.add(ramoAtividade.getId());
    }
    return list;
}


/**
 * Prepara a lista de ids de pontos.
 * @param pontos a lista de pontos.
 * @return a lista de id de pontos.
 */
private List<Integer> prepareList(List<Ponto> pontos) {
    List<Integer> list = new ArrayList<Integer>();
    for (Ponto ponto : pontos) {
        list.add(ponto.getEstabelecimento().getId());
    }
    return list;
}


/**
 * Retorna os estabelecimentos sem uso no sistema.
 * @return os estabelecimentos sem uso.
 */
public List<Estabelecimento> buscarEstabelecimentosSemUso(List<Ponto> pontos) {
    TypedQuery<Estabelecimento> query = null;
    if (pontos.size() > 0) {
        query = EntityManagerHelper.getEntityManager().createQuery("From Estabelecimento e where e.id not IN :filter and e.ativo = :key Order by e.nome ASC",
            Estabelecimento.class);
        List<Integer> estabelecimentos = prepareList(pontos);
        query.setParameter(Constants.FILTER_CONST, estabelecimentos);
    } else {
        query = EntityManagerHelper.getEntityManager().createQuery("From Estabelecimento e where e.ativo = :key Order by e.nome ASC",
                Estabelecimento.class);
    }       

    query.setParameter(Constants.KEY_CONST, true);  

    return query.getResultList();
}


/**
 * Retorna os estabelecimentos em uso no sistema.
 * @return os estabelecimentos em uso.
 */
public List<Estabelecimento> buscarEstabelecimentosEmUso(List<Ponto> pontos) {
    TypedQuery<Estabelecimento> query = null;
    List<Estabelecimento> result = null;
    if (pontos.size() > 0) {
        query = EntityManagerHelper.getEntityManager().createQuery(
                "From Estabelecimento e where e.id IN :filter and e.ativo = :key Order by e.nome ASC",
                Estabelecimento.class);
        List<Integer> estabelecimentos = prepareList(pontos);
        query.setParameter(Constants.FILTER_CONST, estabelecimentos);
        query.setParameter(Constants.KEY_CONST, true);
        result = query.getResultList();
    } else {
        result = new ArrayList<Estabelecimento>();
    }

    return result;
}


/**
 * Retorna os estabelecimentos inativos no sistema.
 * @return os estabelecimentos inativos.
 */
public List<Estabelecimento> buscarEsetabelecimentosInativos() {
    TypedQuery<Estabelecimento> query = EntityManagerHelper.getEntityManager().createQuery("From Estabelecimento e where e.ativo = :key Order by e.nome ASC",
            Estabelecimento.class);
    query.setParameter(Constants.KEY_CONST, false);  

    return query.getResultList();
}

/**
 * Procura um estabelecimento pelo identificador. 
 * @param id o identificador do estabelecimento.
 * @return o estabelecimento ou null se nao for encontrado.
 */
public Estabelecimento buscar(Integer id) {     
    return EntityManagerHelper.getEntityManager().find(Estabelecimento.class, id);      
}


/**
 * Retorna lista de estabelecimentos com nome parecido com o texto.
 * @param texto o filtro a ser usado no nome.
 * @return a lista de estabelecimentos encontrados
 */
public List<Estabelecimento> buscarEstabelecimentos(String texto) {
    TypedQuery<Estabelecimento> query = EntityManagerHelper.getEntityManager().createQuery(
            "From Estabelecimento e where UPPER(e.nome) LIKE UPPER(:filter) and e.ativo = true Order by e.nome ASC",
            Estabelecimento.class);
    query.setParameter(Constants.FILTER_CONST, "%" + texto + "%");
    return query.getResultList();
}


/**
 * Retorna o total de estabelecimentos.
 * @return total de estabelecimentos.
 */
public long buscarTotal() {
    TypedQuery<Long> query = EntityManagerHelper.getEntityManager().createQuery(
            "SELECT count(e) FROM Estabelecimento e",
            Long.class);
    return query.getSingleResult();
}


/**
 * Faz a paginacao nos estabelecimentos cadastrados.
 * @param first o offset inicial
 * @param count a quantidade da paginacao (tamanho)
 * @return a lista baseada nos argumentos passados.
 */
public List<Estabelecimento> buscarEstabelecimentos(int first, int count) {
    TypedQuery<Estabelecimento> query = EntityManagerHelper.getEntityManager().createQuery(
            "From Estabelecimento e Order by e.nome ASC",
            Estabelecimento.class);
    query.setFirstResult(first);
    query.setMaxResults(count);     
    return query.getResultList();
}
}

2 个答案:

答案 0 :(得分:1)

让我们看一下EstabelecimentosProvider的代码。

我猜原因是你没有缓存结果。分页导航器需要知道数据的大小,我想这在您的实现中很昂贵。

答案 1 :(得分:0)

在正常情况下,表和带导航的表之间的唯一区别是tablesize方法调用。

InstaPontoWebController.get().buscarEstabelecimentosTotal()

这种方法有多长时间了?