Como extrair do banco as opçoes para o <select> com uma já selecionada?

Boa tarde , eu leio bastante esse fórum e já me ajudou bastante, eu to com uma dúvida que creio que seja bem básica mesmo, mas não to conseguindo resolver de jeito nenhum.

Eu estou fazendo um projeto com o CRUD completo, to com ele quase completo, só estou com problemas para passar o valor do banco com uma opção selecionada no para a JSP ediçao.

Controle - Servlet

[code]protected void editar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// Pegando o idProduto ao clicar no botão editar na JSP
Integer idProduto = new Integer(request.getParameter(“idProduto”));
try {

			// Alimenta a string produto com os dados do idProduto e envia para a JSP edicao
		request.setAttribute("produto", new ProdutoDao().findById(idProduto));
		request.getRequestDispatcher("edicao.jsp").forward(request, response);
		
			
	} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("msg", "ERRO : " + e.getMessage());
			request.getRequestDispatcher("edicao.jsp").forward(request, response);
	}
	
}[/code]

edicao.jsp

[code]

Id Produto:

Nome:

Quantidade:

Preço:

Data de Validade:

<! – AQUI QUE ESTÁ O PROBLEMA -->
Categoria:

${produto.categoria.nomeCategoria}

<p />

 <select name="categoria">
	<%
	List<Categoria> lista = new CategoriaDao().findAll();
		if(lista.size() > 0){
			for(Categoria c : lista){
				out.print("<option value='" + c.getIdCategoria()+"'>" 
						+ c.getNomeCategoria() + "</option>");
				}
		}
%> 
	

</select>



<p />
<input type="button" onclick="validar()" value="Editar" />	
</form>[/code]

Comentei aonde está a minha dúvida , eu gostaria de colocar a categoria selecionada pelo usuário e , no mesmo select , carregar as outras opções para que o usuário possa fazer a edição.

Quem puder ajudar ficarei grato, obrigado desde já galera!

Danilo,

Acho que entendi o que você quer. Você quer que na JSP seja trazida a lista de categorias, e já venha selecionada a categoria do produto que está sendo carregado.
Acho que dá para fazer da seguinte forma:

Você terá apenas o select que contém a lista (o segundo select). Dentro do for, para cada categoria deve testar se o seu id é o mesmo da categoria do produto.
Se a categoria estiver selecionada, deve aparecer no HTML um SELECTED. Assim:

Acho que dá para fazer mais ou menos assim:


for(Categoria c : lista){
    out.print("<option value='" + c.getIdCategoria() + "' " +
    ( c.getIdCategoria().equals( produto.getCategoria().getIdCategoria() ) ? "SELECTED" : "" ) +  
    ">" + c.getNomeCategoria() + "</option>"); 

Acho que se o idCategoria for Integer, precisa testar com equals(). Se for int ou algum tipo primitivo, pode testar com ==.

Obs.: em HTML usa-se:

Bar

em XHTML tem que ser:

Bar

al.barbosa obrigado pela resposta!

Eu entendi a sua lógica, só não entendi quando você utilizou o equals para testar o id da categoria com o que eu passei pela servlet, no caso para carregar a lista eu to utilizando scripplets e não tem como eu receber a string que eu passei da servlet para a JSP dentro dos scripplets, como eu faria isso ??

Eu só usei o equals porque achei que o id da categoria era Integer (classe wrapper). Se for int ou long, deve ficar assim:

for(Categoria c : lista){ out.print("<option value='" + c.getIdCategoria() + "' " + ( c.getIdCategoria() == produto.getCategoria().getIdCategoria() ? "SELECTED" : "" ) + ">" + c.getNomeCategoria() + "</option>");

Nos scriptlets do JSP você pode acessar os objetos que você enviou através do servlet.

No servlet você passou o produto para o JSP no código abaixo:

request.setAttribute("produto", new ProdutoDao().findById(idProduto)); 

Você deve estar criando um bean com esse produto no JSP, algo mais ou menos assim:

<jsp:useBean id="produto" class="pacote.Produto" />

Você tem acesso ao bean produto dentro dos scriptlets.

[code]
<%

	List<Categoria> lista = new CategoriaDao().findAll();
	
		if(lista.size() > 0){
			for(Categoria c : lista){  
			    out.print("<option value='" + c.getIdCategoria() + "' " +  
			    ( c.getIdCategoria().equals(produto.getCategoria().getIdCategoria())  ? "SELECTED" : "" ) +    
			    ">" + c.getNomeCategoria() + "</option>");  
		}
		}
%>
	

</select>[/code]

o meu ficou dessa forma e da erro 500 na JSP, exatamente no equals.

al.barbosa, obrigado pela ajuda, consegui fazer… vê ae o que achou! Vou botar aqui como ficou o código caso alguem tenha uma dúvida parecida.

[code]Categoria:

<%

List<Categoria> lista = new CategoriaDao().findAll();

Produto p = (Produto) request.getAttribute("produto");
	
	for(Categoria c : lista){
if(p.getCategoria().getIdCategoria().equals(c.getIdCategoria())){
	out.print("<option value='" + p.getCategoria().getIdCategoria()+"' selected>"   
            + p.getCategoria().getNomeCategoria() + "</option>");

		
		
	}else{
		out.print("<option value='" + c.getIdCategoria()+"'>"   
                + c.getNomeCategoria() + "</option>");
	
	
	}
	}
	

%>
</select>[/code]

Beleza, parabéns!

Uma outra forma de fazer é passar a lista de categorias como atributo no servlet.

Você pode também usar expressões JSP, que são no formato:
<%= expressao %>
São semelhantes a scriptlets, mas jogam o resultado na saída. Aí você não precisa usar o out.print().

Pela sugestão, teria o seguinte no servlet:

request.setAttribute("produto", new ProdutoDao().findById(idProduto)); request.setAttribute("lista", new CategoriaDao().findAll()); //passo a lista de categorias como atributo request.getRequestDispatcher("edicao.jsp").forward(request,response);

e no JSP, teria mais ou menos o seguinte:

[code]<%@page contentType=“text/html” pageEncoding=“UTF-8”%>
<%@page import=“modelo.Categoria”%>
<jsp:useBean id=“produto”
scope=“request”
class=“modelo.Produto”/>

<jsp:useBean id=“lista”
scope=“request”
class=“java.util.List<modelo.Categoria>”/>

JSP Page
<body>
    
<form action="Controle?cmd=editar1" name="form1" method="post">  
Nome:  
<input type="text" name="nome" size="25"  
value="${produto.nome}" />  
<p />  
Categoria:
<SELECT NAME="categoria">
    <% for(Categoria c : lista){ %>
        <OPTION VALUE="<%=c.getIdCategoria()%>"
        <%= c.getIdCategoria().equals( produto.getCategoria().getIdCategoria() ) ? " SELECTED " : "" %> >
        <%= c.getNomeCategoria() %>
        </OPTION>   
    <% } %>
</SELECT>
<p />  
<input type="button" value="Editar" />      
</form> 
</body>
[/code]

Show de bola! Chegando em casa eu testo dessa maneira também, obrigado ae pela atenção!