forEach com select + Vector não funciona

Olá,

Pessoal tenho uma classe chamada Proposta.java que lista o campo da minha tabela (MYSQL) chamada Nome que tem o método getListar1 que joga os dados da coluna do meu BD.

[/code]
public Vector getListar1(){

		    Vector x = new Vector();
		    try {
		      // Joga dados no vetor
		      PreparedStatement sql = conn.prepareStatement("select nome from clientes ");
		      ResultSet rs = sql.executeQuery();
		      while (rs.next()) {
		      x.addElement(new Proposta(rs.getString("nome")));
		                      
		      }
		      rs.close();
		    }
		    catch (SQLException ex) {
		      System.out.println(ex.getMessage());
		    }
		    return x;
		  }

}[code] 
    
    Na minha jsp está assim para listar estes nomes dentro de um Combobox usei o jstl para fazer isso. Acima da página já adicionei o jstl/fmt e o jstl/core e tbm os devidos jars.

<hr>

<jsp:useBean id=“proposta” scope=“page” class=“cadastro.Proposta”/>

<select name=“proposta”>
<c:forEach var=“z” items="${proposta.listar1}">
<option> ${z} </option> // aqui não pega a coluna nome!!
</c:forEach>
</select>

<hr>

Só que quando visualizo a página no Combobox aparece isso:

   &lt;option&gt; cadastro.Proposta@1b2d7df &lt;/option&gt;

 &lt;option&gt; cadastro.Proposta@7a9224 &lt;/option&gt;

 &lt;option&gt; cadastro.Proposta@110b640 &lt;/option&gt;

A var ${z}  não está pegando o valor . O que pode ser este erro sabe porque eu testei usando uma tabela com o mesmo projeto e funcionou direitinho ,será que o select no caso do Combobox não busca muitos valores, precisa colocar mais alguma linha de comando dentro desse 

select ?
Um grande abraço, espero ajuda mas tenho certeza que conseguirei a turma do GUJ sempre foi muito prestativa comigo… :lol:

Você está usando o objeto, e não um atributo dele… :slight_smile:

Troque:

[code]

${z} // aqui não pega a coluna nome!! [/code]

Por:

[code]

${z.getNome()} // aqui não pega a coluna nome!! [/code]

E veja se funciona…

Oi Felipe,

Fiz desse jeito que vc falou troquei por ${z.getNome()}  mas agora dá o seguinte erro :

org.apache.jasper.JasperException: /proposta.jsp(28,17) The function getNome must be used with a prefix when a default namespace is not specified.

Olá por fvr alguem tem um exemplo ou um pequeno projeto que usa o jstl com select para enviar por email …para mim assim tento fazer aqui …

[quote=Adriana Cardoso]Fiz desse jeito que vc falou troquei por ${z.getNome()} mas agora dá o seguinte erro :
[/quote]O certo seria ${ z.nome }.

Oi David,

Teste desse jeito e continua aparecendo :

 &lt;option&gt; cadastro.Proposta@13d9460 &lt;/option&gt;

Insisto alguem tem por fvr um peqeno projeto usando select , nao é falta de procura estou ha bastante tempo garimpando na net mas nao achei nada para solucionar o caso.

Vc precisa criar o ben e popular onde vc faz o while na sua classe

//NomeVO

public class NomeVO {

	private String nome;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}
	
}
public List getNome() throws SQLException {
		strSQL = "select * from tabela";
               PreparedStatement stmt = this.connection.prepareStatement(strSQL);
		ResultSet rs = stmt.executeQuery();
		List list = new ArrayList();
		while (rs.next()) {
			NomeVO dados = new NomeVO();
			dados.setNome(rs.getString("coluna"));
			list.add(dados);
		}
		rs.close();
		stmt.close();
		return list;
	}

Agora no seu jsp vc recebe o nome da lista via request e itera:

<c:forEach var="nomeLista" items="${nomeLista}">
    <option value="${nomeLista.nome}">${nomeLista.nome}</option>
</c:forEach>

A sua camada view não precisa saber de que classe vem, apenas recebe uma lista, ou seja nem precisa dessa linha:

<jsp:useBean id="proposta" scope="page" class="cadastro.Proposta"/>

passe a lista no controller

request.setAtributte("nomeLista", new Proposta().getNomes());

Note que esse nome é a variavel que foi criada no bean, assim deve funcionar agora!

oi Pedrosa,

Entao eu havia criado sim a classe Bean entao ai eu fiz dessa forma acrescentei o comando que vc passou : Esta classe herda da Conexao com o BD

[list]public class Proposta extends Conexao{

     private String nome;
     

public Proposta() {
	      conecta();
}


// ====== gets e sets===========

public String getNome() {
	return this.nome;
}


public void setNome(String nome) {
	this.nome = nome;
}

// Chama lista do bd para o ComboBox

 public List getListar() throws SQLException {
 		String strSQL = "select * from clientes";
        PreparedStatement stmt = this.conn.prepareStatement(strSQL);
 		ResultSet rs = stmt.executeQuery();
 		List list = (List) new ArrayList();
 			while (rs.next()) {
 			Proposta dados = new Proposta();
 			dados.setNome(rs.getString("nome"));
 			list.add(dados);
 		}
 		rs.close();
 		stmt.close();
 		return list;
 	}

}[/list]

Depois na jsp:

<jsp:useBean id=“proposta” scope=“request” class=“cadastro.Proposta”/>
<select name=“proposta”>
<c:forEach var=“listar” items="${listar}">
<option value="${listar.nome}">${listar.nome}</option>
</c:forEach>
</select>
A minha duvida é sobre esta instância do Bean como vc pode ver acima nesse caso fiz aqui direto na jsp e não na Controller.
Sobre o que vc falou request.setAtributte(“nomeLista”, new Proposta().getNomes());onde eu adiciono esta linha na propria classe Proposta ?

Olá amigos,

Então agradeço a ajuda de vcs , e encontrei a solução é o seguinte acabei fazendo a minha lista usando Vector mesmo como havia feito de principio.
Mas na instrução do select esqueci de colocar order by nome assim ele seleciona o item desejado da tabela Clientes - no caso Nomes.
Outra coisa no select na jsp usei da seguinte forma , instanciei o Bean na propria jsp acho mais fácil do que na Controller.

&lt;jsp:useBean id="proposta" scope="page" class="cadastro.Proposta"/&gt; &lt;select name="proposta"&gt; &lt;c:forEach var="listar1" items="${proposta.listar1}"&gt; &lt;option&gt; ${listar1.nome} &lt;/option&gt; &lt;/c:forEach&gt; &lt;/select&gt;

 Mas agradeço a todos até mais......