vRaptor2 + JSON + jqGrid =/*dificuldades em buscar a lista do logic para a tela*/ BARBADA [OK]

8 respostas
tucano

Olá,

algo me diz que é uma questão bem simples,
a resposta pode ser meio obvia,
mas não estou conseguindo “costurar” as informações…

preciso levar uma lista que tenho no logic para a tela através do jqGrid usando o JSON.

montado a lista sem o json, consegui legal (tem um exemplo em um antigo post meu http://www.guj.com.br/java/222010-jqgrid—ignorecase-resolvido)
daquela forma funciona beleza, exceto quando carrego uma lista pesada com vários registros (lentidão pra carregar, come muita memória do navegador e em casos o navegador dá uma arriada)

será que alguém com mais experiencia em json no vrpator poderia me ajudar?


exemplo que carrega (sem json)
SCRIPT:

...
            $(document).ready(function(){
                $("#listagem").jqGrid({
                    url:'minhaClasse.listar.logic',
                    datatype: "local",
                    colNames:['ID','Código','Descrição'],
                    colModel:[
                        {name:'id',index:'id', width:7, align:'center', resizable: false, hidden:true},
                        {name:'codigo',index:'codigo', width:12, align:'center', resizable: false},
                        {name:'descricao',index:'descricao', width:42, align:'left', resizable: false, sortable:false, search:false},
                    ],
                    sortname: 'id'
                });

                montaBasico("#listagem","#plistagem");

                <c:forEach var="elemento" items="${listMinhaClasse}" varStatus="row">
                    $("#listagem").jqGrid('addRowData',${row.index+1},{
                        id:"${elemento.id}",
                        codigo:"${elemento.codigo}",
                        descricao:"${elemento.descricao}",
                    });
                </c:forEach>


                $("#listagem").jqGrid().trigger("reloadGrid");
            });
...

LOGIC:

...
    @Out
    List<minhaClasse> listMinhaClasse;
...

com o método listar…

exemplo que nao funciona (com json)
SCRIPT:

...
            $(document).ready(function(){
                $("#listagem").jqGrid({
                    url:'minhaClasse.listar.ajax.logic',
                    datatype: "json",
                    colNames:['ID','Código','Descrição'],
                    colModel:[
                        {name:'id',index:'id', width:7, align:'center', resizable: false, hidden:true},
                        {name:'codigo',index:'codigo', width:12, align:'center', resizable: false},
                        {name:'descricao',index:'descricao', width:42, align:'left', resizable: false, sortable:false, search:false},
                    ],
                    sortname: 'id'
                });

                montaBasico("#listagem","#plistagem");

                $("#listagem").jqGrid().trigger("reloadGrid");
            });
...

no logic permaneceu tudo igual, apenas adicionado o @Remotable antes do método que estou chamando, será que faltou mais alguma coisa?

Algumas referencias básicas que tenho do jqGrid estão nos demos disponibilizados pelo desenvolvedor do plugin http://www.trirand.com/blog/jqgrid/jqgrid.html

Qualquer força é bem vinda!
Abraço, até mais!
:wink:

8 Respostas

Lucas_Cavalcanti

o jqgrid espera um formato específico de json, vc tem que fazer com que o vraptor gere esse mesmo formato…

qual é o formato certo?

tucano

olá lucas,

quanto ao formato no jqGrid ele compara o parametro name declarado no colModel com os atributos que minha classe possui.

colModel:[  
                        {name:'id',index:'id', width:7, align:'center', resizable: false, hidden:true},  
                        {name:'codigo',index:'codigo', width:12, align:'center', resizable: false},  
                        {name:'descricao',index:'descricao', width:42, align:'left', resizable: false, sortable:false, search:false},  
                    ],

neste caso a classe minhaClasse tem os atributos id, codigo e descricao e estes são jogados diretamente pra grid.

testando aqui percebi outro detalhe que até então tinha me passado despercebidamente…
…debugando o fonte percebi que no instante que ele carrega o “listMinhaClasse”, já é impresso na tela o conteudo da lista e depois quando a função sai (pelo return) passa pela classe padrão method.java e quando sai dessa a grid é limpa e fica sem conteudo algum.

com isso percebi que não é que eu não esteja conseguindo jogar o conteudo na lista, mas sim que o conteudo permaneça na lista.

algo me diz que é uma coisa mais simples que imagino, alguma coisa que precisava ser setado(ou coisa do genero) e que desconheço no momento… :?: :?: :?:

valeu aew pela atenção até então prestada lucas!
xD

tem ideia do que pode fazer ocorrer essa carga e limpeza da grid?

até mais!
xD

Lucas_Cavalcanti

nunca mexi com ele… mas tenta ver quais coisas estão acontecendo… o firebug no firefox ajuda bastante

tucano

depois de encontrar alguns errinhos (o que já era de esperar :roll: )

aliviar as ideias e aumentar a atenção em cima da documentação do jqGrid
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data

cheguei nos seguintes códigos

SCRIPT:

$("#listagem").jqGrid({
                    url:'MinhaClasse.listarParaGrid.ajax.logic',
                    datatype: "json",
                    colNames:['ID','Descrição'],
                    colModel:[
                        {name:'id',index:'id', width:7, align:'center', resizable: false, hidden:true},
                        {name:'descricao',index:'descricao', width:42, align:'left', resizable: false, sortable:false, search:false}
                    ],
                    jsonReader : {
                         root: "saidaJson>listRowGrid",
                         page: "saidaJson>pageGrid",
                         records: "saidaJson>recordsGrid",
                         total: "saidaJson>totalGrid",
                         cell: "listCellGrid",
                         repeatitems: true,
                         id: "saidaJson>id"
                       },
                       sortname: 'id'
                });

                $("#listagem").jqGrid('navGrid',"#plistagem",{edit:false,add:false,del:false,search:false,refresh:false});

LOGIC:

@Out
    public jqGridJson saidaJson;


    @Remotable
    public void listarParaGrid(){
        saidaJson = new jqGridJson();
        jqGridRow conteudoLinha = new jqGridRow();

        conteudoLinha.setId(1);
        conteudoLinha.setListCellGrid(new ArrayList<String>());
        conteudoLinha.getListCellGrid().add("Teste JSON");

        saidaJson.setTotalGrid(1);
        saidaJson.setPageGrid(1);
        saidaJson.setRecordsGrid(1);
        saidaJson.setListRowGrid(new ArrayList<jqGridRow>());
        saidaJson.getListRowGrid().add(conteudoLinha);

    }

pelo que entendi da documentação e o que eu tenho no json ele tá montando a estrutura certa, mas ainda to deixando passar algum detalhe pra não tá vingando o objetivo…

debugando vi uma coisa estranha…
… no netbeans consigo ver o conteudo da estrutura legal como deveria se carregar
http://picasaweb.google.com/lh/photo/g6UEYiXJMldMo7o3S1_C2MI5QB9TjhLJk5_D2qQxgrw?feat=directlink

mas depois que carrega a pagina, olhando no firebug, a parte do registro que deviria ter o conteudo a ser visualizado pelo grid, está vazio.
http://picasaweb.google.com/lh/photo/egYzICI0aBiU6Cr8MYyqAcI5QB9TjhLJk5_D2qQxgrw?feat=directlink

será que é alguma coisa que o grid faz ou eu não deveria ter feito?

valeu aew pela atenção Lucas!

até mais!
:wink:

Lucas_Cavalcanti

qual é o texto da resposta? (dá pra ver no firebug)

tucano

o json respondido referente a variavel que estamos manipuando vem

“saidaJson”:{“listRowGrid”:[{“id”:1,“listCellGrid”:[{}]}],“pageGrid”:1,“recordsGrid”:1,“totalGrid”:1},

onde carregamos “Teste JSON” está vindo vazio…

imagina o que pode estar acontecendo?

Lucas_Cavalcanti

tenta setar os levels (ou algo do tipo) dentro da anotação @Remotable, assim o vraptor vai serializar mais coisas

tucano

bah lucas, acertou na pinha!
=D

é o parametro “depth” da anotação @Remotable que configura os níveis como comentaste.

@Remotable( depth=8 )
(usei o 8 apenas para testar)

bah xirú muito obrigado pela força que deu aEW!!

com fins de deixar documentado aqui no guj, depois postarei um exemplo do resultado funcionando legal.
xD

foram apenas detalhes pequenos e chatos de depurarem que simplesmente faz não funcionar e que qualquer um que esta fazendo essa integração jqGrid e vRaptor com JSON em algum sistema pode tropeçar.

Criado 21 de janeiro de 2011
Ultima resposta 27 de jan. de 2011
Respostas 8
Participantes 2