Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Erro na exibição de lista

Prezados,

Ao criar um projeto do zero, sem usar o arquivo disponibilizado para o curso, encontrei um problema na exibição de uma lista no JSP. O nome da classe é Sublotacao; consigo acessar o banco e a lista é corretamente recuperada e repassada para o JSP; contudo, a lista só é corretamente exibida quando o atributo "var" tem nome diferente de "sublotacao", como exibido abaixo:

<c:forEach items="${sublotacaoList}" var="item">
    <tr>    
        <td>${item.descricao} </td>
        <td>${item.caixainstitucional} </td>
    </tr>
</c:forEach>

Seguindo o exemplo do curso e o da documentação do framework, o código ficaria como apresentado abaixo, mas dessa forma, os campos não são exibidos, observando-se apenas que as linhas da tabela correspondem a quantidade de registros:

<c:forEach items="${sublotacaoList}" var="sublotacao">
    <tr>    
        <td>${sublotacao.descricao} </td>
        <td>${sublotacao.caixainstitucional} </td>
    </tr>
</c:forEach>

O que pode estar acontecendo para gerar esse erro?

Obrigada, Cristiane

10 respostas

Oi Cristiane, tudo bem? O que acontece? O campo só fica em branco? Como está o código do seu controller? Não existe ninguém mais incluindo um parâmetro com esse nome (sublotacao) na view? Um abra;co

Tudo bem, Rodrigo! Acontece que os campos são exibidos em branco e a quantidade de linhas criadas na tabela é a mesma de registros que deveriam ser retornados. Por exemplo, são 10 sub-lotações cadastradas no banco e são criadas 10 linhas na tabela, com os campos em branco.

O código do controller segue abaixo:

@Controller
public class SublotacaoController {

    private SublotacaoDAO sublotacaodao;
    private EmpregadoDAO empregadodao;
    private Result result;

    @Inject
    public SublotacaoController(SublotacaoDAO sublotacaodao, EmpregadoDAO empregadodao, Result result) {
        this.sublotacaodao = sublotacaodao;
        this.empregadodao = empregadodao;
        this.result = result;
    }

    @Deprecated
    SublotacaoController() {
        this(null, null, null); // Para uso do CDI!
    }

    @Get("/sublotacao/")
    public List<Sublotacao> listar() {
        return sublotacaodao.listar();
    }

     ...

O código da view é o seguinte:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<html>
<body>

    <div class="container">
        <h3><font color="#265a88">SUB-LOTAÇÕES</font></h3>
          <br>

          <button type="button" class="btn btn-primary">Nova Sub-lotação</button>
          <br><br>
          <div class="table-responsive">
              <table class="table table-hover table-bordered table-condensed">
                 <tr class="info">
                    <th colspan="2" align="center">OPERAÇÕES</td>
                    <th>DESCRIÇÃO</th>
                    <th>CAIXA INSTITUCIONAL</th>
                </tr>
                <c:forEach items="${sublotacaoList}" var="item">
                    <tr>
                        <td align="center"><a href="./alterar/${item.sublotacaoid}" class="btn btn-default"><span class="glyphicon glyphicon-pencil"></span></a></td>
                        <td align="center"><a href="./excluir/${item.sublotacaoid}" class="btn btn-default"><span class="glyphicon glyphicon-remove"></span></a></td>
                        <td>${item.descricao} </td>
                        <td>${item.caixainstitucional} </td>
                    </tr>
                </c:forEach>
              </table>

        </div>
    </div>

</body>
</html>

Obrigada pela atenção, Cristiane

mas com item funciona? Isso é, o problema acontece apenas se o nome da veriável é sublotacao? Ou acontece sempre?

Com item funciona! Essa é a questão! Por quê? Estou com o mesmo problema em outra view e não sei o que estou fazendo errado...

hehe é realmente um mistério! Faz um teste? Coloca no seu JSP a seguinte expression language:

sublotacao: ${sublotacao}

E veja se aparece alguma coisa. Sem alterar nada na lista. Só pra garantir que ninguém mais está usando esse nome de parâmetro

br.embrapa.cnpa.model.Sublotacao@1a6e3cab

Onde é que esse parâmetro está sendo passado, pela caridade?!

a classe Sublotacao está anotada com @Named?

Está!

@Entity
@Named("sublotacao")
@SequenceGenerator(name="SUBLOTACAO_ID", sequenceName="sublotacao_sublotacaoid_seq", allocationSize=1, initialValue=1)
public class Sublotacao { 

    @Id       
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SUBLOTACAO_ID")  
    Long sublotacaoid;
    ...
solução!

O problema é esse! Toda classe anotada com @Named fica disponível na view. Pelo que vi, não faz sentido ter esse @Named ai :) tira que vai funcionar

Exatamente isso! Muitíssimo obrigada!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software