[RESOLVIDO]Recuperar valor de option com JSTL-EL

Buenas galera,

Tenho um no meu jsp que lista os estados do país

		<label>Estado:</label>
	  		<form action="SrvEstabelecimento?carregaCidade" method="post" name="estadoFrm">  
				<select>
					<c:forEach var="estado" items="${listaEstados}">
						<option name="${estado.dom02Id}"><c:out value="${estado.dom02Sigla}" /></option>
					</c:forEach>
				</select>
				<input type="submit" value="Selecionar" />	
	 	 	</form>  

Até ai beleza o meu problema é que eu preciso do id do estado para utilizar como parâmetro em um select no banco de dados só que não sei como pegar isso na servlet sendo que o ID é gerado pela EL.

Grato,

[quote=gabriel_nunes]Buenas galera,

Tenho um no meu jsp que lista os estados do país

		<label>Estado:</label>
	  		<form action="SrvEstabelecimento?carregaCidade" method="post" name="estadoFrm">  
				<select>
					<c:forEach var="estado" items="${listaEstados}">
						<option name="${estado.dom02Id}"><c:out value="${estado.dom02Sigla}" /></option>
					</c:forEach>
				</select>
				<input type="submit" value="Selecionar" />	
	 	 	</form>  

Até ai beleza o meu problema é que eu preciso do id do estado para utilizar como parâmetro em um select no banco de dados só que não sei como pegar isso na servlet sendo que o ID é gerado pela EL.

Grato,

[/quote]

Estava faltando o id e name do select, e adicionar o atributo “value” no option.

Tenta assim:

		<label>Estado:</label>
	  		<form action="SrvEstabelecimento?carregaCidade" method="post" name="estadoFrm">  
				<select name="estado" id="estado">
					<c:forEach var="estado" items="${listaEstados}">
						<option value="${estado.dom02Id}"><c:out value="${estado.dom02Sigla}" /></option>
					</c:forEach>
				</select>
				<input type="submit" value="Selecionar" />	
	 	 	</form>  

Na servlet vc faz o request.getParameter(“estado”);

eae orlandogpe vlw pela resposta…

Mas me surgiu outra duvida, o name do select você colocou como “estado” mas é igual ao var do c:forEach é assim mesmo ou devo substituir algum deles?

é assim msm… o estado do var e para voce conseguir acessar cada objeto da lista, e o estado do select é apenas o nome msm.

entendi…

O Que você falou deu certo valeu !

Mas surgiu outro problema, na minha pagina eu tenho 2 um é o estado e o outro o de cidades daquele estado.

Seleciono o estado e clico no submit e da esse erro.

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:500)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	marhysystem.agenda.servlet.cadastro.estabelecimento.SrvEstabelecimento.service(SrvEstabelecimento.java:45)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>WebAgenda - Selecione o estado, a cidade e o estabelecimento.</title>
	</head>
	<body>
		<h2>WebAgenda</h2>
		<h4>Selecione sua localidade.</h4>
		
		<br />
		
		<label>Estado:</label>
	  		<form action="SrvEstabelecimento?carregaCidade" method="post" name="estadoFrm">  
				<select name="estado" id="estado">
					<c:forEach var="estado" items="${listaEstados}">
						<option value="${estado.dom02Id}"><c:out value="${estado.dom02Sigla}" /></option>
					</c:forEach>
				</select>
				<input type="submit" value="Selecionar" />	
	 	 	</form>  
		
		<br />
		
		<label>Cidade:</label>
 	 		<form action="SrvEstabelecimento?carregaEstabelecimento" method="post" name="cidadeFrm">  
				<select name="cidade" id="cidade">
					<c:forEach var="cidade" items="${listaCidade}">
						<option value="${cidade.dom03Id}"><c:out value="${cidade.dom03Nome}" /></option>
					</c:forEach>
				</select>
  			</form>

		<br />
		
		<label>Estabelecimento:</label>
			<table>
				<tr>
					<td>Nome</td>
					<td>Telefone</td>
					<td>Endere&ccedil;o</td>
				</tr>
				<c:forEach var="estabelecimento" items="${listaEstabelecimento}">
					<tr name="${estabelecimento.idCad001}">
						<td>${estabelecimento.c01Fantasia}</td>
						<td>${estabelecimento.c01Fone}</td>
						<td>${estabelecimento.c01Endereco}</td>
						<td>
							<a href="SrvEstabelecimento?visualizaAgenda">
								<input type="button" value="Visualizar Agenda" />
							</a>
						</td>		
					</tr>				
				</c:forEach>				
			</table>
	</body>
</html>

Servlet

package marhysystem.agenda.servlet.cadastro.estabelecimento;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import marhysystem.agenda.bean.cadastro.Ansdom02;
import marhysystem.agenda.bean.cadastro.Ansdom03;
import marhysystem.agenda.dao.cadastro.AnsDom02DAO;
import marhysystem.agenda.dao.cadastro.AnsDom03DAO;
import marhysystem.agenda.dao.cadastro.Tbcad001DAO;

public class SrvEstabelecimento extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public SrvEstabelecimento() {super();}

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String acao = request.getQueryString();
		
		
		if(acao.equals("carregaEstado")){
			
			AnsDom02DAO estado = new AnsDom02DAO();
			
			request.setAttribute("listaEstados", estado.listarEstados());
			
			request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);
			
		}
		else if(acao.equals("carregaCidade")){

			AnsDom03DAO cidade = new AnsDom03DAO();
			
			int idEstado = Integer.parseInt(request.getParameter("estado"));
			
			cidade.listarCidades(idEstado);
			
			request.setAttribute("listaCidade", cidade);
			
			request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response); 
		
		}
		else if(acao.equals("carregaEstabelecimento")){
			
			Tbcad001DAO estabelecimento = new Tbcad001DAO();
			Ansdom03 cidade = new Ansdom03();

			int idCidade = Integer.parseInt(request.getParameter("idCidade"));

			estabelecimento.listarEstabelecimentos(idCidade);

			request.setAttribute("listaEstabelecimento", estabelecimento);
			
			request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);

		}
	}
}

Acho q o problema esta na sua servlet.

...
 }  
        else if(acao.equals("carregaCidade")){  
  
            AnsDom03DAO cidade = new AnsDom03DAO();  
              
            int idEstado = Integer.parseInt(request.getParameter("estado"));  
              
            cidade.listarCidades(idEstado);  
              
            request.setAttribute("listaCidade", cidade);  // Acho q o problema esta aqui, está passando a referencia da variavel cidade, e  não a lista de cidades
              
            request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);   
          
        }  
...

Tenta isso:

...
 }  
        else if(acao.equals("carregaCidade")){  
  
            AnsDom03DAO cidade = new AnsDom03DAO();  
              
            int idEstado = Integer.parseInt(request.getParameter("estado"));  
              
            //tenta isso
            request.setAttribute("listaCidade",  cidade.listarCidades(idEstado)).
              
            request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);   
          
        }  
...

Pelo q vi vc tem q fazer isso no carregaEstabelecimento.

Uma dica… pra nao precisar clicar no botao para carregar a cidade, vc pode colocar o atributo onChange no select.

... <select name="estado" id="estado" onChange="submit()">   ....

putz cara que vacilo meu foi mal…

fiz isso pra carregar o estado mas nao pra cidade…heheh de novo vlw!..

só uma ultima duvida aproveitando o topico…

no caso quando eu peço pra carregar o com as cidades o estado volta a ficar em branco…como posso manter o valor do estado selecionado?

Agradeço a paciencia e a ajuda ate o momento…

Abs

Na sua servlet vc tem q passar um novo atributo.

        }    
        else if(acao.equals("carregaCidade")){    
    
            AnsDom03DAO cidade = new AnsDom03DAO();    
                
            int idEstado = Integer.parseInt(request.getParameter("estado"));    
                
            //será usado para fazer o request na pagina. Obs: passe o atributo com String. Ex:  ""+idEstado .
            request.setAttribute("idEstado",  ""+idEstado);

            request.setAttribute("listaCidade",  cidade.listarCidades(idEstado));
                
            request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);     
            
        } 

e no seu select do estado fazer o seguinte:


                <select name="estado" id="estado">  
                    <c:forEach var="estado" items="${listaEstados}">  
                        <option value="${estado.dom02Id}" ${idEstado.equals(""+estado.dom02Id) ? "selected":""} ><c:out value="${estado.dom02Sigla}" /></option>  
                    </c:forEach>  
                </select>  

ou assim:


                <select name="estado" id="estado">  
                    <c:forEach var="estado" items="${listaEstados}">  
                        <option value="${estado.dom02Id}" <% if((""+request.getAttribute("idEstado")).equals(""+estado.dom02Id)) out.print("selected"); %>  ><c:out value="${estado.dom02Sigla}" /></option>  
                    </c:forEach>  
                </select>  

funciona dos 2 jeitos

depois no metodo do carregaEstabelecimento, vc tem q passar 2 atributos, idEstado e idCidade, e fazer essa alterção no select da cidade.

Cara num ta dando certo não…tentei aqui de alguns jeitos ate…

		else if(acao.equals("carregaCidade")){

			AnsDom03DAO cidade = new AnsDom03DAO();
			
			int idEstado = Integer.parseInt(request.getParameter("estado"));
			
			request.setAttribute("idEstado", ""+idEstado);
			request.setAttribute("listaCidade", cidade.listarCidades(idEstado));
			
			request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);

JSP

				<select name="estado" id="estado">
					<c:forEach var="estado" items="${listaEstados}">
						<option value="${estado.dom02Id}"  ${idEstado.equals(""+estado.dom02Id) ? "selected":""}><c:out value="${estado.dom02Sigla}" /></option>
					</c:forEach>
				</select>

org.apache.jasper.JasperException: /estabelecimentos.jsp(19,43) The function equals must be used with a prefix when a default namespace is not specified

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 19 in the jsp file: /estabelecimentos.jsp
estado.dom02Id cannot be resolved to a type
16: 	  		<form action="SrvEstabelecimento?carregaCidade" method="post" name="estadoFrm">  
17: 				<select name="estado" id="estado">
18: 					<c:forEach var="estado" items="${listaEstados}">
19: 						<option value="${estado.dom02Id}"   <% if((""+request.getAttribute("idEstado")).equals(""+estado.dom02Id)) out.print("selected"); %> /></option>
20: 					</c:forEach>
21: 				</select>
22: 				<input type="submit" value="Selecionar" />	

Cara, foi mal esse segundo modo nao vai dar certo pq vc ta usando JSTL, ele so daria certo usando scriptlet na hora q montei o exemplo esqueci desse detalhe, foi mal.

Mas a 1º opção era pra funcionar. Ta tudo certo no código, até fiz um teste aqui e funcionou.

a var estado nao funciona só no escopo da onde foi declarado? no caso do c:forEach?

só funciona no escopo do c:forEach

estranho cara nao vai mesmo…tentei colocar o EL dentro de atributo do option mas mesmo assim o erro persiste

vou continuar pesquisando aqui… mas por hora obrigado pela ajuda o/

abs

estranho msm…

Se descobrir algo te dou um toque

abraço

cara consegui depois de kebrar a cuca…

ficou assim

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<title>WebAgenda - Selecione o estado, a cidade e o estabelecimento.</title>
	</head>
	<body>
		<h2>WebAgenda</h2>
		<h4>Selecione sua localidade.</h4>
		
		<br />
		
		<label>Estado:</label>
	  		<form action="SrvEstabelecimento?carregaCidade" method="post" name="estadoFrm">  
				<select name="estado" id="estado" onchange="submit()">
					<c:forEach var="estado" items="${listaEstados}">
						<option value="${estado.dom02Id}"/><c:out value="${estado.dom02Sigla}"/></option>
					</c:forEach>
				</select>
	 	 	</form>  
		
		<br />
	
		<label>Cidade:</label>
 	 		<form action="SrvEstabelecimento?carregaEstabelecimento" method="post" name="cidadeFrm">  
				<select name="cidade" id="cidade" onchange="submit()">
					<c:forEach var="cidade" items="${listaCidade}">
						<option value="${cidade.dom03Id}"><c:out value="${cidade.dom03Nome}" /></option>
					</c:forEach>
				</select>
  			</form>

		<br />
		
		<label>Estabelecimento:</label>
			<table>
				<tr>
					<td>Nome</td>
					<td>Telefone</td>
					<td>Endere&ccedil;o</td>
				</tr>
				<c:forEach var="estabelecimento" items="${listaEstabelecimento}">
					<tr name="${estabelecimento.idCad001}">
						<td>${estabelecimento.c01Fantasia}</td>
						<td>${estabelecimento.c01Fone}</td>
						<td>${estabelecimento.c01Endereco}</td>
						<td>
							<a href="SrvEstabelecimento?visualizaAgenda">
								<input type="button" value="Visualizar Agenda" />
							</a>
						</td>		
					</tr>				
				</c:forEach>				
			</table>
	</body>
</html>

Servlet

package marhysystem.agenda.servlet.cadastro.estabelecimento;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import marhysystem.agenda.bean.cadastro.Ansdom02;
import marhysystem.agenda.bean.cadastro.Ansdom03;
import marhysystem.agenda.dao.cadastro.AnsDom02DAO;
import marhysystem.agenda.dao.cadastro.AnsDom03DAO;
import marhysystem.agenda.dao.cadastro.Tbcad001DAO;

public class SrvEstabelecimento extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public SrvEstabelecimento() {super();}

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String acao = request.getQueryString();
		
		
		if(acao.equals("carregaEstado")){ 
			
			AnsDom02DAO estado = new AnsDom02DAO();
			
			request.setAttribute("listaEstados", estado.listarEstados());
			
			request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);
			
		}
		else if(acao.equals("carregaCidade")){

			AnsDom03DAO cidade = new AnsDom03DAO();
			AnsDom02DAO estado = new AnsDom02DAO();
			
			
			int idEstado = Integer.parseInt(request.getParameter("estado"));
			String siglaEstado = request.getParameter("siglaEstado");
			
			request.setAttribute("listaEstados", estado.listarEstados());         //A Diferença ta aqui...simplesmente chamei o metodo de listas os estados novamente!
			request.setAttribute("listaCidade", cidade.listarCidades(idEstado));
			
			request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);
		
		}
		else if(acao.equals("carregaEstabelecimento")){
			
			Tbcad001DAO estabelecimento = new Tbcad001DAO();

			int idCidade = Integer.parseInt(request.getParameter("cidade"));
			
			request.setAttribute("listaEstabelecimento", estabelecimento.listarEstabelecimentos(idCidade));
			
			request.getRequestDispatcher("estabelecimentos.jsp").forward(request, response);

		}
	}
}

Não sei se é o correto mas pelo menos consigo trabalhar agora…mais pra frente quando eu estiver com tempo eu procuro melhor o que você havia explicado

mas mto obrigado mesmo pela atenção e ajuda e fica ai a soluçao pra quem tiver um problema parecido

abs