Popular select de acordo com a seleção anterior

4 respostas
M

Boa tarde galera do GUJ.
Em várias consultas no fórum para resolver meu problema, infelizmente não consegui encontrar uma mais próxima do meu. E parece que é um problema um tanto quanto comum entre os usuários.
Isso pode ser porque em meio a infinidade de frameworks e tecnologias, é muito difícil encontrar alguém que esteja fazendo com os mesmos recursos que você tenha em mãos.
Mas vamos lá!
O problema é o velho cadastro de Estado e Cidade.
Como posso resolver de acordo com o código que já tenho logo abaixo, para que ao escolher o País, venham somente os Estados a ele relacionados?
Lembrando que o CRUD está funcionando. Só está faltando algumas melhorias como essa citada
CidadeDAO

package br.com.offline.local.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.caelum.vraptor.ioc.Component;
import br.com.offline.infra.CriaSession;
import br.com.offline.local.Cidade;

@Component
public class CidadeDAO {
	
	private final Session session;
	
	public CidadeDAO(){
		this.session = CriaSession.getSession();
	}
	
	public void adiciona(Cidade cidade){
		Transaction transaction = session.beginTransaction();
		session.save(cidade);
		transaction.commit();
	}
	
	public void altera(Cidade cidade){
		Transaction transaction = session.beginTransaction();
		session.update(cidade);
		transaction.commit();
	}

	public void remove(Cidade cidade){
		Transaction transaction = session.beginTransaction();
		session.delete(cidade);
		transaction.commit();
	}
	
	public Cidade carrega(Long codigo){
		return (Cidade) this.session.load(Cidade.class, codigo);
	}
	
	@SuppressWarnings("unchecked")
	public List<Cidade> listaCidade(){
		return session.createCriteria(Cidade.class).list();
	}
	
}

CidadeController

package br.com.offline.local.controller;

import java.util.List;

import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.offline.local.Cidade;
import br.com.offline.local.Estado;
import br.com.offline.local.Pais;
import br.com.offline.local.dao.CidadeDAO;
import br.com.offline.local.dao.EstadoDAO;
import br.com.offline.local.dao.PaisDAO;

@Resource
public class CidadeController {
	
	private final CidadeDAO dao;
	private final Result result;
	private final EstadoDAO estadoDAO;
	private final PaisDAO paisDAO;

	public void novaCidade(){
		List<Pais> pais = paisDAO.listaPais();
		List<Estado> estados = estadoDAO.listaEstado();
			result.include("estados", estados);
			result.include("pais", pais);
	}
	
	public CidadeController(CidadeDAO dao, Result result, PaisDAO paisDAO, EstadoDAO estadoDAO){
		this.dao = dao;
		this.result = result;
		this.paisDAO = paisDAO;
		this.estadoDAO = estadoDAO;
	}
	
	// Métodos dao.
	public void adiciona(Cidade cidade){
		dao.adiciona(cidade);
		result.redirectTo(CidadeController.class).cidadeAdicionada();
	}
	
	public Cidade alteraCidade(Long codigo){
		List<Pais> pais = paisDAO.listaPais();
		List<Estado> estados = estadoDAO.listaEstado();
		result.include("pais", pais);
		result.include("estados", estados);
		return dao.carrega(codigo);
	}
	
	public void altera(Cidade cidade){
		dao.altera(cidade);
		result.redirectTo(this).listaCidade();
	}
	
	public void remove(Long codigo){
		Cidade cidade = dao.carrega(codigo);
		dao.remove(cidade);
		result.redirectTo(this).listaCidade();
	}
	
	public List<Cidade> listaCidade() {
		return dao.listaCidade();
	}

	public String cidadeAdicionada(){
		return "/cidade/cidadeAdicionada.jsp";
	}

}

novaCidade.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"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!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>Insert title here</title>
<style type="text/css"></style>
</head>
<body>
<div id="corpo">
	<h3>Adicionando uma nova Cidade.</h3>
	<form action="adiciona" method="post" name="novaCidade">
		<fieldset>
			<legend>Adicionar Cidade</legend>
			<input	id="codigo" type="hidden" name="cidade.codigo" />
			<br />
			<label	for="nome">Nome:</label>
			<input	id="nome" type="text" name="cidade.nome" />
			<br />
			<label	for="sigla">Sigla:</label>
			<input	id="sigla" type="text" name="cidade.sigla" maxlength="3" />
			
			<br />
			
 			<label	for="pais"> País:</label>
			<select id="pais" name="pais.codigo" onchange="buscaEstado()">
				<option>Selecione</option>
				<c:forEach items="${pais }" var="pais">
					<option id="pais" value="${pais.codigo }"> ${pais.nome }</option>
				</c:forEach>
			</select>
			
			<br />
			
			<label	for="estado"> Estado:</label>
			<select id="estado" name="cidade.estado.codigo">
				<option id="estado">Selecione</option>
				<c:forEach items="${estados }" var="estado">
					<option id="estado" value="${estado.codigo }"> ${estado.nome }</option>
				</c:forEach>
			</select>
			<br />
			<button type="submit">Enviar</button>
		</fieldset>
	</form>
<br />
</div>
</body>
</html>

Desde já agradeço a todos.

4 Respostas

D

vc pode fazer uma requisição ajax passando o id do pais e fazendo a consulta no banco, trazendo apenas os estados daquele país

L

Cade o código do buscaestado ?

Como o colega aí de cima definiu, faz uma requisição ajax que retorne uma lista com o que você quer.

Está usando algum framework web ou é servlet mesmo ?

M

Estou usando o vraptor.
Quanto ao buscaestado é justamente o que estou procurando.
Todos os que eu tentei fazer não deram certo.
Gostaria de receber um modelo exemplo baseado no que tenho de código atualmente.

M

Amigos do GUJ.
Encontrei um exemplo que é do google https://code.google.com/p/cidades-estados-js mas esse modelo já vem com tudo pronto e como o intuito é estudar o relacionamento entre od select através de dados obtidos do BD, não usei o do goole.
Alguém tem um help aí?

Criado 22 de fevereiro de 2013
Ultima resposta 24 de fev. de 2013
Respostas 4
Participantes 3