Carregar combo box com dados de uma tabela com Struts

Boa noite amigos,

Estou tentando carregar um único combo box no meu JSP com alguns registros vindos de uma tabela. Estou fazendo da seguinte forma e não está carregando com os valores do BD e tb não dá erro. O que está errado?

Combo box no JSP:

<select name="nomeCategoria" property="opcao" onchange="document.forms[0].action='listarCategorias.do';document.forms[0].submit();" value="LISTARCATEGORIAS">   
<option value="">.. Selecione ..</option>   
   <c:forEach var="categorias" items="${empresasolicitante}">   
        <option value="${categorias.idCategoria}">${categorias.nomeCategoria}</option>   
   </c:forEach>   
</select>

Action no Struts-config:

<action path="/listarCategorias.do" type="br.com.sce.controller.action.fornecedor.ActionFornecedor" name="beanFornecedor" input="/jsp/fornecedor/inicioFornecedor.jsp" scope="request" validate="false">
   <forward name="sucesso" path="/jsp/fornecedor/inicioFornecedor.jsp"/>
</action>

Classe ActionFornecedor:

if(bf.getOpcao().equals("LISTARCATEGORIAS")) {
	ArrayList beanFornecedorArray = daoFornecedor.listarCategorias();
	request.setAttribute("lCategoria", beanFornecedorArray);
	System.out.println("Populou lCategoria com: " + beanFornecedorArray.size());
}

Método listarCategorias:

	public ArrayList<BeanFornecedor> listarCategorias() throws Exception {

		try	{
			String query =	"SELECT * " +
							"FROM TBL_CATEGORIA "+
							"ORDER BY NOME_CATEGORIA";
			
			System.out.println("Query listarCategorias: " + query);

			xConn = new XConnection();
			xConn.rs = xConn.seleciona(query);

			ArrayList<BeanFornecedor> lCategoria = new ArrayList<BeanFornecedor>();
			while(xConn.rs.next()) {
				BeanFornecedor fornecedor = new BeanFornecedor();			
				fornecedor.setIdCategoria(xConn.rs.getString(1));
				fornecedor.setNomeCategoria(xConn.rs.getString(2));
				lCategoria.add(fornecedor);
			}
			
			System.out.println("Montou lCategoria " + lCategoria.size());

			xConn.fechaConexao();		
			return lCategoria;

		} catch(SQLException e) {
			System.out.println("ERROR listarCategorias: " + e.toString());
			xConn.fechaConexao();
			return null;
		} catch(Exception e) {
			System.out.println("ERROR listarCategorias: " + e.toString());
			xConn.fechaConexao();
			return null;
		}					

	}

Cara, primeiro faça um debug para verificar se existe valor logo apos o seu select no codigo que vc enviou da ActionFornecedor depois tente utilizar somente as tags do struts em uma pagina struts, evite fazer bagunca entre tipos de codigos diferentes, utilize a notação abaixo para este selectbox

<html:select property="CategoriaSelecionada" >
  <html:option value="..Selecione.."></h:option>
  <html:optionsCollection property="${variavelComALista}" value="idCategoria" label="nomeCategoria"/>
</html:select>

espero ter ajudado
boa sorte

Amigo mackalister, entendi oq vc postou, mas estou com uma dúvida… Como faço para preencher a lista CategoriaSelecionada, de forma que quando abrir o campo do tipo listbox, todos os valores já estejam carregados ?

Obrigado…

Igor,
a variavel “categoriaSelecionada” irá receber o valor do campo definido na propriedade value. value=“idCategoria”
a lista de objetos a ser exibida esta na variavel “variavelComALista”

caso voce queira que um objeto da lista comece selecionado, voce pode colocar o value dele na Variavel “categoriaSelecionada” que ele irá aparecer selecionado.

boa sorte

Amigo mackalister, tentei fazer mas não funfou… ficou assim:

JSP:

<html:select property="idCategoria" >   
  <html:option value="..Selecione.." />   
  <html:options collection="listarCategorias" property="${beanFornecedor.idCategoria}" labelProperty="nomeCategoria"/>   
</html:select>

ERROR quando testo:

javax.servlet.ServletException: Cannot find bean under name listarCategorias
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

O DAO onde está a query é o mesmo que já postei.

A minha dificuldade está na classe action e como vou mapear o struts-config para popular o bean automaticamente quando abrir a pagina onde tem o listbox. Teria um exemplo ?

Vlw…

olha so … esta errada a linha … veja novamente como eu coloquei a linha do optionsCollection !

<html:select property="idCategoria" >     //ATRIBUTO DO FORM QUE RECEBERÁ O VALOR SELECIONADO
  <html:option value="..Selecione.." />     //APENAS UMA OPÇÃO A MAIS QUE SE FOR SELECIONADA COLOCARA UM VALOR VZIO NA VARIAVEL idCategoria do FORM
  <html:optionsCollection property="${listarCategorias}" value="idCategoria" label="nomeCategoria"/>  
</html:select>

para cada elemento da lista listarCategorias será atribuido o value correspondente a propriedade idCategoria e o label correspondente a propriedade nomaCategoria

lembrando … sua lista é de objetos Categoria
objeto ategoria possui alem de outras as propriedades idCategoria e nomeCategoria

voce gerou uma lista de objetos Categoria = listarCategorias

logica da tag optionsCollection:
para cada elemento da lista listarCategoria coloque o valor da propriedade idCategoria no campo value da option e o valor da propriedade nomeCategoria da mesma option.

consegui explicar de forma clara ? srrsrsr as vezes eu sou meio confuso

Eu havia tentado fazer da forma que você postou anteriormente, mas estava dando um erro no optionsCollection… mas não lembro direito deste erro rsrs… entendi como funciona a montagem do select só não sei como ele vai mostrar (carregar) os valores vindos do BD dentro deste select quano abrir esta pagina… Entendi como ele vai jogar os valores “idCategoria” e “idCategoria” para a variavel “categoria”… Só queria que vc explicasse como a lista “listarCategorias” vai ser carregada ‘automaticamente’ para mostrar os valores do BD, quando esta pagina que contem o select for aberta ?

<html:select property="categoria" >  //ATRIBUTO DO FORM QUE RECEBERÁ O VALOR SELECIONADO. TROQUEI "idCategoria" PARA "categoria", PARA MELHOR ENTENDIMENTO
   <html:option value="Selecione" /> //APENAS UMA OPÇÃO A MAIS QUE SE FOR SELECIONADA COLOCARA UM VALOR VZIO NA VARIAVEL idCategoria do FORM 
   <html:optionsCollection property="${listarCategorias}" value="idCategoria" label="nomeCategoria"/>    
</html:select>

Obrigado…

cara, na sua action vc vai fazer uma logica e popular esta lista

List a = new ArrayList();

a.add(new Categoria(1,"nomeCategoria1"));
a.add(new Categoria(2,"nomeCategoria2"));
a.add(new Categoria(3,"nomeCategoria3"));
a.add(new Categoria(4,"nomeCategoria4"));

form.setListarCategoria(a);

o resto o struts se encarrega !

abraços

a logica poderia ser diferente e vc pode chamar um método do dao para buscar os dados do banco …

ex:

form.setListarCategorias (dao.getListaCategorias());

Amigo mackalister,

Entendi como deve funcionar, mas não consegui implementar. Ainda estou tentando colocar para funfar, mas se vc ou algum membro do forum tiver um exemplo completo para postar eu agradeceria muito.

Vlw.

Obrigado.

cara fiz um projetinho e coloquei no rapidshare!

http://rapidshare.com/files/151299433/ComboStruts.rar.html

espero que ajude !

abraços