[Resolvido] JSP não mostra dados resgatados de uma Servlet

Obs:Não sei se fui claro no Assunto, não sei como escrever. Se algum moderador achar melhor mudar, ta blza XD.

Fala pessoa, blza?
Estou com um problema.

Tenho uma Servlet que pega os dados de uma tabela “pessoa”, cria um objeto Pessoa com os mesmo campos.
Adiciona o resultado do executeQuery() no objeto Pessoa e depois adiciona o objeto num ArrayList.
Na tabela só tem dois registros. Segue o ServletControl:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection con = Conexao.getConexao(); PessoaDAO dao = new PessoaDAO(); Pessoa p = new Pessoa(); List<Pessoa> lista = new ArrayList<Pessoa>(); ResultSet rs = dao.getResultSet(con); try { while (rs.next()) { p.setNome(rs.getString("nome")); p.setId(rs.getInt("id")); p.setEndereco(rs.getString("endereco")); p.setTelefone(rs.getString("telefone")); lista.add(p); } } catch (SQLException ex) { Logger.getLogger(ServletControl.class.getName()).log(Level.SEVERE, null, ex); } HttpSession session = request.getSession(true); session.setAttribute("lista",lista); response.sendRedirect("resposta.jsp"); }
A lista contém 2 obejtos.
Quando o response.sendRedirect() manda para a página resposta.jsp ele não mostra os dados resgatados da tabela. Segue a resposta.jsp

[code]
<jsp:useBean class=“br.com.classes.Pessoa” id=“p” scope=“session”/>
<%
List lista = (ArrayList) session.getAttribute(“lista”);

    for (int i = 0; i < lista.size(); i++) {
        p = (Pessoa)lista.get(i);
     %>
     <p>
     Nome: ${p.nome}</br>
     Id: ${p.id}</br>
     Endereço: ${p.endereco}</br>
     Telefone: ${p.telefone}</br>
     <%
    }
    %>
</body>[/code]

Não sei se usei o jsp:useBean corretamente, mas antes de usa-lo, eu fiz um JSP puro. Peguei o objeto List da sessão, fiz um cast para Pessoa e mostrei num out.print() e foi. Quando mudei para esse modo não está mostrando.
O estranho é que ele reconhece que contém 2 objetos na lista, pois ele repete duas vezes do for.
Ah, não sei se ajuda. Quando vai mostrar o ID, nos 2 objetos mostra sempre 0.

Agradeço pela atenção.

Olá!

O response.sendRedirect apenas redireciona para a página, e não encaminha a requisição. Isso quer dizer que os parametros que você incluir no request não estarão disponíveis.

Use a classe RequestDispatcher da api de servlet:

request.setAttribute("lista", lista);
request.getRequestDispatcher("resposta.jsp").forward(request, response);

Fala cara, blza?

Então, eu nem tentei com essa qp eu achava que não ia funfar, e realmente não funfou.
Ele mostra assim:
Nome:
Id: 0
Endereço:
Telefone:
Nome:
Id: 0
Endereço:
Telefone:

Pq quando eu faço sem o jsp:useBean só com JSP puro ele funciona. :shock:
Preciso mudar alguma coisa a mais na resposta.jsp?
Ah, se vc puder me explicar, pq que com request.getRequestDispatcher o bixo vai 1000 de vezes mais rápido do que com response.sendRedirect???

Abraço

Descobri onde está o erro:

Nome: ${p.nome}</br> Id: ${p.id}</br> Endereço: ${p.endereco}</br> Telefone: ${p.telefone}</br>
Quando eu coloco out.print(p.getId()); e os outros gets, as informações aparecem. E agora estou utilizando o jsp:useBean, que eu achava que estava com problema.

Mas por que com as ELs não aparece as informações. Precisa fazer alguma coisa antes???

Grato

[quote=Thiago Luis]Fala cara, blza?

Então, eu nem tentei com essa qp eu achava que não ia funfar, e realmente não funfou.
Ele mostra assim:
Nome:
Id: 0
Endereço:
Telefone:
Nome:
Id: 0
Endereço:
Telefone:

Pq quando eu faço sem o jsp:useBean só com JSP puro ele funciona. :shock:
Preciso mudar alguma coisa a mais na resposta.jsp?
Ah, se vc puder me explicar, pq que com request.getRequestDispatcher o bixo vai 1000 de vezes mais rápido do que com response.sendRedirect???

Abraço[/quote]

Então cara, na verdade deveria ser o contrário. sendRedirect seria mais rápido. Não sei te explicar o porque disso…

O caso do jsp:useBean é que você não colocou um atributo “p” (id=“p” do teu jsp:useBean) no request ou session, por isso ele não mostra nada. Você quer mostrar a lista certo? Então a tag jsp:useBean não vai servir pra nada.

tente assim:

 <body>  
     <%  
     List<Pessoa> lista = (ArrayList<Pessoa>) session.getAttribute("lista");  

     for (int i = 0; i < lista.size(); i++) {  
         Pessoa pessoa = (Pessoa)lista.get(i);  
      %>  
      <p>  
      Nome: ${pessoa.nome}</br>  
      Id: ${pessoa.id}</br>  
      Endereço: ${pessoa.endereco}</br>  
      Telefone: ${pessoa.telefone}</br>  
      <%  
     }  
     %>  
 </body>

Blza,

Agora eu fui saí do trabalho e meu programa está lá, só vou testar segunda agora, mas vou fazer o teste.

No caso do jsp:useBean eu só usei para instanciar um objeto de Pessoa, só por teste mesmo para não fazer a instanciação dentro das tags <% %> pq depois vou usar tags JSTL para ficar mais apresentável.

Abraço

Cara, não foi de novo :evil:
Ta osso mano, não sei o que fazer.
O que é mais estranho. Eu testei tbm com jsp:getProperty para mostrar os dados, e agora aparece assim:
Nome: null
Id: 0
Endereço: null
Telefone: null
Nome: null
Id: 0
Endereço: null
Telefone: null

Com as ELs não mostra null e com jsp:getProperty mostra :shock:
Aí eu volto para out.print(p.getEndereco());, por exemplo, e funciona perfeitamente.

Quem eu devo chamar, o Padre Quevedo ???
Ow mano, se vc souber, da um help awe que ta ruim a coisa :lol:

Abraço.

você tentou testar com o código que eu passei no post acima? tem que funcionar!

Testei cara, testei sim, mas deu a mesma situação
Eu tenho que configurar alguma coisa antes de usar EL ou as tags ???

Tem uma coisa que eu percebi:
Parece que as ELs e as jsp:getProperty não entendem este trecho:

p = (Pessoa) lista.get(i);

Pq elas pegam os valores da própria classe Pessoa, que não tem nada setado nas variáveis. por isso mostram null.
Agora se eu seto diretamente, por exemplo, a variável endereco na classe Pessoa, quando eu uso:

${pessoa.endereco} <jsp:getProperty name="pessoa" property="endereco" />
Ele mostra o endereço que eu setei diretamente na classe :shock:

A minha grande dúvida é: Pq que com out.print(); funciona???

Abraço

hmmm… acho que cometi um equivoco la no código que te envie… :oops:

As tags EL trabalham com sistema de escopos pra mostrar os valores:

page => escopo da página
request => escopo de requisição
session => escopo de sessão
application => escopo de contexto / aplicação

No caso daquele for, só vai funcionar com out.println a não ser que você coloque o objeto “pessoa” em algum escopo visível. Ex:

 for (int i = 0; i < lista.size(); i++) {    
         Pessoa pessoa = (Pessoa)lista.get(i);   
         request.setAttribute("pessoa", pessoa);

Agora vai cara!

Resolvido !!!

Vlw cara, era isso mesmo.
Nunca que eu ia saber dessa sacada ai, negócio complicado :smiley:
Mas vou estudar mais.

Abraços e mais uma vez, obrigado.

Heheh… q nada… desculpe pela mancada ai…

Amigos estou começando agora estudar isso…tem como colocar o codigo completo pra eu ver como funciona isso. Obrigado a todos!!!