Erro com JSTL ao listar duas classes

Olá amigos, estou com um problema e devido a falta de experiência, não sei resolver.

É o seguinte:

Tenho a Superclasse Cadastro:

package classe.modelo.vo;

import java.sql.Date;

public class Cadastro{
	private int id;
    private String cnpjCpf;
    private String razaoSocial;
    private String nome;
    private String inscrEstadual;
    private String rg;
    private String inscrMun;
    private String rua;
    private String complemento;
    private String numero;
    private String bairro;
    private Municipio municipio; // campo municipio id
    private String cep;
    private String telefone;
    private String www;
    private String email;
    private String obs;
    private Date dtCadastro;
    private String sts;
    private Empresa empresa;
    
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	public String getCnpjCpf() {
		return cnpjCpf;
	}
	public void setCnpjCpf(String cnpjCpf) {
		this.cnpjCpf = cnpjCpf;
	}
	public String getRazaoSocial() {
		return razaoSocial;
	}
	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getInscrEstadual() {
		return inscrEstadual;
	}
	public void setInscrEstadual(String inscrEstadual) {
		this.inscrEstadual = inscrEstadual;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public String getInscrMun() {
		return inscrMun;
	}
	public void setInscrMun(String inscrMun) {
		this.inscrMun = inscrMun;
	}
	public String getRua() {
		return rua;
	}
	public void setRua(String rua) {
		this.rua = rua;
	}
	public String getComplemento() {
		return complemento;
	}
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public Municipio getMunicipio() {
		return municipio;
	}
	public void setMunicipio(Municipio municipio) {
		this.municipio = municipio;
	}
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getWww() {
		return www;
	}
	public void setWww(String www) {
		this.www = www;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getObs() {
		return obs;
	}
	public void setObs(String obs) {
		this.obs = obs;
	}
	public Date getDtCadastro() {
		return dtCadastro;
	}
	public void setDtCadastro(Date dtCadastro) {
		this.dtCadastro = dtCadastro;
	}
	public String getSts() {
		return sts;
	}
	public void setSts(String sts) {
		this.sts = sts;
	}
	public Empresa getEmpresa() {
		return empresa;
	}
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
   
}

e a Classe Usuario:

package classe.modelo.vo;

public class Usuario extends Cadastro{
	private int Id;
    private String login;
    private String senha;
    private String status;
    
    @Override
	public int getId() {
		return Id;
	}
    @Override
	public void setId(int id) {
		Id = id;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
    
}

e o método listar em UsuarioDao:

   public static ArrayList<Usuario> listar(){
    	try {
			conexao = Conexao.conectar();
			ArrayList<Usuario> lista = null;
			
		    StringBuffer query = new StringBuffer();  
		    query.append("SELECT c.cad_id , ");  
		    query.append("c.cad_nome ,  ");  
		    query.append("c.cad_email ,  ");  
		    query.append("c.cad_telefone ,  ");  
		    query.append("c.cad_cnpjcpf ,  ");  
		    query.append("c.cad_rg ,  ");  
		    query.append("c.cad_rua ,  ");  
		    query.append("c.cad_complemento ,  ");  
		    query.append("c.cad_numero ,  ");  
		    query.append("c.cad_bairro ,  ");  
		    query.append("c.cad_dtcadastro, ");
		    query.append("u.usu_id, ");
		    query.append("u.usu_login, "); 
		    query.append("u.usu_senha, ");
		    query.append("u.usu_sts, ");
		    query.append("m.mun_descricao ");
		    query.append("FROM cadastro c ");  
		    query.append("INNER JOIN usuario u ");  
		    query.append("ON ");  
		    query.append("u.usu_id = c.cad_id "); 
		    query.append("INNER JOIN municipio m ");  
		    query.append("ON ");  
		    query.append("m.mun_id = c.cad_munid"); 
		    PreparedStatement consulta = conexao.prepareStatement(query.toString());     
		    ResultSet resultado = consulta.executeQuery();    
			lista = new ArrayList<Usuario>();
			while(resultado.next()){
				  Usuario usuario = new Usuario();
				  usuario.setMunicipio(new Municipio());
				  usuario.setNome(resultado.getString("cad_nome"));
				  usuario.setEmail(resultado.getString("cad_email"));
				  usuario.setTelefone(resultado.getString("cad_telefone"));
				  usuario.setCnpjCpf(resultado.getString("cad_cnpjcpf"));
				  usuario.setRg(resultado.getString("cad_rg"));
				  usuario.setRua(resultado.getString("cad_rua"));
				  usuario.setComplemento(resultado.getString("cad_complemento"));
				  usuario.setNumero(resultado.getString("cad_numero")); 
				  usuario.setBairro(resultado.getString("cad_bairro"));
				  usuario.setDtCadastro(resultado.getDate("cad_dtcadastro"));
				  usuario.setId(resultado.getInt("usu_id"));
				  usuario.setLogin(resultado.getString("usu_login"));
				  usuario.setSenha(resultado.getString("usu_senha"));
				  usuario.setStatus(resultado.getString("usu_sts"));
				  usuario.getMunicipio().setDescricao(resultado.getString("mun_descricao"));
				  lista.add(usuario);
			}
			return lista;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
    }

acho que o problema está aqui em listaUsuario.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%> 
<jsp:useBean id="usuario" scope="session" class= "classe.modelo.vo.Usuario" /> 
<jsp:useBean id="listaUsuario" scope="request" class="java.util.ArrayList"/> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Lista de Usuários</title>
</head>
<body>
  <table class="titulo">
<tr>
  <td class="cel">C&oacute;digo</td>
  <td class="cel">Nome</td>
  <td class="cel">Rua</td>
  <td class="cel">Complemento</td>
  <td class="cel">Número</td>
  <td class="cel">Bairro</td>
  <td class="cel">Município</td>
  <td class="cel">Cep</td>
  <td class="cel">Data Cadastro</td>
  <td class="cel">Alterar</td>
  <td class="cel">Excluir</td>
</tr>
<c:forEach items="${listaUsuario}" var="lista"> 
<tr>
  <td class="cel"><c:out value="${lista.Id}"></c:out></td>
  <td class="cel"><c:out value="${lista.rua}"></c:out></td>
  <td class="cel"><c:out value="${lista.complemento}"></c:out></td>
  <td class="cel"><c:out value="${lista.numero}"></c:out></td>
  <td class="cel"><c:out value="${lista.bairro}"></c:out></td>
  <td class="cel"><c:out value="${lista.descricao}"></c:out></td>
  <td class="cel"><c:out value="${lista.cep}"></c:out></td>
  <td class="cel"><c:out value="${lista.dtCadastro}"></c:out></td>
  <td class="cel"><a href="ServletUsuario?acao=AlterarUsuario&cod=<c:out value="${lista.Id}"></c:out>">
  V</a></td>
  <td class="cel"><a href="ServletUsuario?acao=ExcluirUsuario&cod=<c:out value="${lista.Id}"></c:out>">
  X</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>

Quando eu executo e mando listar, dá o seguinte erro:

21/01/2012 23:57:03 org.apache.catalina.core.ApplicationDispatcher invoke
GRAVE: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property ‘Id’ not found on type classe.modelo.vo.Usuario…

Parece que está dizendo que não existe o atributo Id na classe usuario mas existe sim. O que pode ser?

vc esqueceu dentro do while do id

while(resultado.next()){  ..aqui vc esqueceu..

Opa…

Brother, dei uma olhada no código e parece que tanto o select, quanto o set do “Id” consta no teu while…

Classe UsuarioDao, método listar():

query.append("u.usu_id, "); // linha 18

usuario.setId(resultado.getInt("usu_id")); // linha 46

O que vou falar daqui pra baixo não é uma certeza, mas vale a pena tentar…
Notei que na Classe Usuario, vc nomeou teu atributo como sendo “Id”.
Segundo os padrões de “boas normas” do Java, é um equivoco. A nomenclatura deveria ser “id”.
Não tenho certeza quanto a esta norma, mas sei que a biblioteca JSTL utiliza alguns padrões e faz necessário que estes sejam implementados de forma correta.
Me parece que ao utilizar “Id” com a inicial maiuscula, o cógido acaba ferindo essas normas.
A biblioteca JSTL não consegue encontrar o atributo, quando chamado da forma presente no fonte “${lista.Id}”.

Posso estar falando besteira…
Mas eu tentaria alterar o nome do atributo “Id” para “id”. Alteraria tb sua chamada de “${lista.Id}” para “${lista.id}”.
Também vale frisar que na superclasse Cadastro, o atributo é “id”, e não “Id”.

É uma possibilidade…
Não custa tentar…

Valeu BrunoFurtado. Eu fiz o que você disse em trocar Id por id e agora tá certo só que tá dando erro nas linhas debaixo:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%> 
<jsp:useBean id="cadastro" scope="session" class= "classe.modelo.vo.Cadastro" /> 
<jsp:useBean id="listaUsuario" scope="request" class="java.util.ArrayList"/> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Lista de Usuários</title>
</head>
<body>
  <table class="titulo">
<tr>
  <td class="cel">C&oacute;digo</td>
  <td class="cel">Nome</td>
  <td class="cel">Login</td>
  <td class="cel">Status</td>
  <td class="cel">Rua</td>
  <td class="cel">Complemento</td>
  <td class="cel">Número</td>
  <td class="cel">Bairro</td>
  <td class="cel">Município</td>
  <td class="cel">Cep</td>
  <td class="cel">Data Cadastro</td>
  <td class="cel">Alterar</td>
  <td class="cel">Excluir</td>
</tr>
<c:forEach items="${listaUsuario}" var="lista"> 
<tr>
  <td class="cel"><c:out value="${lista.id}"></c:out></td>
  <td class="cel"><c:out value="${lista.login}"></c:out></td>
  <td class="cel"><c:out value="${lista.status}"></c:out></td>
//daqui para baixo onde são os dados da classe cadastro está dando erro
  <td class="cel"><c:out value="${lista.rua}"></c:out></td>
  <td class="cel"><c:out value="${lista.complemento}"></c:out></td>
  <td class="cel"><c:out value="${lista.numero}"></c:out></td>
  <td class="cel"><c:out value="${lista.bairro}"></c:out></td>
  <td class="cel"><c:out value="${lista.descricao}"></c:out></td>
  <td class="cel"><c:out value="${lista.cadastro.cep}"></c:out></td>
  <td class="cel"><c:out value="${lista.dtCadastro}"></c:out></td>
  <td class="cel"><a href="ServletUsuario?acao=AlterarUsuario&cod=<c:out value="${lista.id}"></c:out>">
  V</a></td>
  <td class="cel"><a href="ServletUsuario?acao=ExcluirUsuario&cod=<c:out value="${lista.id}"></c:out>">
  X</a></td>
</tr>
</c:forEach>
</table>   
</body>
</html> 

22/01/2012 02:16:45 org.apache.catalina.core.ApplicationDispatcher invoke
GRAVE: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property ‘descricao’ not found on type classe.modelo.vo.Usuario

Resolvido aqui valeu gente.

O certo é ${lista.municipio.descricao} porque descricao vem da classe Municipio que é atributo da classe Cadastro.

Obrigado a todos.