Java Wicket:Dataview与PagingNavigator

Java Wicket:Dataview与PagingNavigator,java,wicket,dataview,Java,Wicket,Dataview,我不知道为什么,但在我将添加到之后,页面第一次加载时慢了5秒 我的数据提供程序正在从数据库加载数据。但是,使用相同的数据提供程序,只需删除,页面加载速度将加快约5秒 代码如下: private void initScreen() { feedbackPanel = new FeedbackPanel(Constants.FEEDBACK_CONST); add(feedbackPanel.setOutputMarkupId(true)); form = new Form

我不知道为什么,但在我将添加到之后,页面第一次加载时慢了5秒

我的数据提供程序正在从数据库加载数据。但是,使用相同的数据提供程序,只需删除,页面加载速度将加快约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());


}
private void initScreen(){
反馈面板=新的反馈面板(常数反馈常数);
添加(feedbackPanel.setOutputMarkupId(true));
表格=新表格(表格常数);
prepareDataView();
添加表格(EstablecimentOdatView);
添加(新的PagingNavigator(NAVIGATOR_CONST,EstableciementODataView));
添加(表格);
}
私有void prepareDataView(){
dataProvider=新的EstabelecimentosProvider();
/**作为代理的数据视图*/
estabelecimentoDataView=新数据视图(行常量,数据提供程序){
/**
*序列号
*/
私有静态最终长serialVersionUID=-3327582763351095154L;
@凌驾
受保护的无效填充项(项){
final Establecimento estab=item.getModelObject();
AjaxLink链路=新的AjaxLink(链路常数){
/**
*序列号
*,tipoEmpresa.getdescripcao()
*/
私有静态最终长serialVersionUID=-1668530681964357458L;
@凌驾
公共void onClick(AjaxRequestTarget目标){
选择了稳定的Elecimento=estab;
ParamsWrapper params=新的ParamsWrapper();
参数put(Constants.KEY_CONST,estab.getId());
PageManager.changePage(此,PageManager.ESTABELECIMENTOS_ALTERAR_页面,参数);
}
};
添加(新标签(NOME_CONST,新属性模型(estab,NOME));
添加(链接);
添加项目(新标签(ENDERECO_CONST,新属性模型(estab,ENDERECO));
添加项目(新标签(BAIRRO_CONST,新属性模型(estab,“BAIRRO”));
添加(新标签(CIDADE_CONST,新属性模型(estab,CIDADE));
添加(新标签(UF_CONST,新属性模型(estab,UF));
添加(新的AjaxButton(删除常量){
/**
*序列号
*/
专用静态最终长serialVersionUID=1762220739285945945720L;
@凌驾
提交时受保护的void(AjaxRequestTarget目标){
//TODO自动生成的方法存根
super.onSubmit(target);
选择了稳定的Elecimento=estab;
//RemoveConfigurationMessage(Constants.REMOVER_AGENCIA_CONST+selectedAgencia.getRazaoSocial()+“?”,目标);
}
});
}       
};      
setOutputMarkupId(true);
EstablecimentOdatView.setItemsPerPage(每页常量.ITEMS);
setItemReuseStrategy(ReuseIfModelsEqualStrategy.getInstance());
}
更新(EstabelecimentosProvider实施):

public类establecimentosProvider实现IDataProvider{
/**
*序列号
*/
私有静态最终长serialVersionUID=1L;
@凌驾

公共迭代器让我们看看
EstabelecimentosProvider
的代码


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

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

InstaPontoWebController.get().buscarEstabelecimentosTotal()

这个方法能工作多久?

dataprovider与分页概念兼容吗?我想是的,它是兼容的。也许吧。我已经把EstableCimentOProvider代码,还有EstableCimentOdao代码,它在数据库中执行查询。对吗?调试代码时,我注意到代价高昂的方法是“onRender”pagingNavigator的。它的具体价格是多少?我不清楚,但在呈现pagingNavigator的“第一个”链接时,它在renderNext()方法中。
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();
}
}
InstaPontoWebController.get().buscarEstabelecimentosTotal()