Jquery + JSP e Select

5 respostas
F
Preciso de ajuda para fazer um esquema que faça o seguinte:

A partir de 1 SELECT com o nome de alguns paises, ao ser selecionado 1 pais ele cria outro select com os estados relacionados a este pais;

e a partir do select com os estados ele cria um outro com as cidades, bairros, logradouros e ETC;

o codigo que fiz ai embaixo ele faz só o primeiro passo, porem, do segundo passo em diante ele “exclui” os outros selects e dexa somente 1 com as informacoes necessarias.

segue abaixo o codigo.

Obrigado

HTML:

<!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>

<script type="text/javascript">
function showHint(str)
{
var xmlhttp;

if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200){
	  document.getElementById("div1").innerHTML=xmlhttp.responseText;
  }
		
  }
xmlhttp.open("GET","Selecionador.jsp?q="+str,true);
xmlhttp.send();

}
</script>
 
</head>
<body>
	<form action="" method="get">
		
		<p>País:
		<select name ="Paises" id="pais" onchange="showHint(this.value);" onclick="adicionarOpcoesSelect();">
			<option value="vazio">Selecionar
			<option value="Brasil">Brasil
			<option value="Argentina">Argentina
			<option value="EUA">EUA
			<option value="Africa">Africa
		</select>
		
		<p> Cidades:
			<select name ="Cidades" id="cidade" onchange="showHint(this.value);" onclick="adicionarOpcoesSelect();">
				<option value="vazio"> Selecione </option> 
			</select>
		
		<p> Estados:
			<select name ="Estados" id="estados" onchange="showHint(this.value);" onclick="adicionarOpcoesSelect();">
				<option value="vazio"> Selecione </option> 
			</select>
		
		<p> Bairros:
			<select name ="Bairros" id="bairros" onchange="showHint(this.value);" onclick="adicionarOpcoesSelect();">
				<option value="vazio"> Selecione </option> 
			</select>
		
		<p> Logradouros:
			<select name ="Logradouros" id="logradouros" onchange="showHint(this.value);" onclick="adicionarOpcoesSelect();">
				<option value="vazio"> Selecione </option> 
			</select>
		
	</form>
	<div id="div1">
	
		</div>
</body>
</html>

JSP:

<%@ page import="java.sql.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="Negocio.NegocioPais"%>
<%@ page import="Negocio.NegocioCidade"%>
<%@ page import="Negocio.NegocioBairro"%>
<%@ page import="Negocio.NegocioLogradouro"%>
<%@ page import="Negocio.NegocioLogradouroBairro"%>
<%@ page import="entidade.Pais"%>
<%@ page import="entidade.Cidade"%>
<%@ page import="entidade.Bairro"%>
<%@ page import="entidade.Logradouro"%>
<%@ page import="entidade.LogradouroBairro"%>

<% 
	//NegocioPais negocioPais = new NegocioPais();
	//ArrayList<Pais> paises = negocioPais.Consulta();
	
	String q = request.getParameter("q");
	int flag = 0;
	int flagBairro = 0;
	int flagLogradouro = 0;
	ArrayList<String> vetCidades = new ArrayList<String>();
	ArrayList<String> vetBairros = new ArrayList<String>();
	ArrayList<String> vetLogradouros = new ArrayList<String>();
	
	if(q.equals("Brasil") || flag == 1){
		flag = 1;
		NegocioCidade negocioCidade = new NegocioCidade();
		ArrayList<Cidade> cidades = negocioCidade.Consulta("SELECT * FROM cidade where codPais = 1");
		String str;
		if(cidades != null){
			for (int i = 0; i<cidades.size(); i++){
				Cidade cidade = (Cidade) cidades.get(i);
				str = "<option value='"+cidade.getNome().toString()+"'>"+cidade.getNome().toString();
				vetCidades.add(str);
			}
		}
	}
	if(q.equals("Sao Paulo") || flagBairro == 1){
		flagBairro = 1;
		NegocioBairro negocioBairro = new NegocioBairro();
		ArrayList<Bairro> bairros = negocioBairro.Consulta("SELECT * FROM bairro where codCidade = 1");
			for (int i = 0; i<bairros.size(); i++){
				Bairro bairro = (Bairro) bairros.get(i);
				vetBairros.add(bairro.getNome());
			}
	}
%>	
<%if (flag != 0) {%>
	<p>Cidades:
		<select name =Cidades id="cidade" onchange="showHint(this.value);">
			<option value="vazio"> Selecione </option>
			<%for(int j = 0; j < vetCidades.size(); j++) {
				out.println(vetCidades.get(j));
			}%>
		</select>

<%} %>

<% if (flagBairro != 0){ %>
<p>Bairros:
		<select name =Bairros id="bairro" onchange="showHint(this.value);">
			<option value="vazio"> Selecione </option>
			<%for(int j = 0; j < vetBairros.size(); j++) {
				out.println(vetBairros.get(j));
			}%>
		</select>
<%}%>

5 Respostas

A

Aonde que você está utilizando jquery ai? Isso daí é javascript apenas. Procure no google $.post e servlet q tu vai conseguir atingir o seu objetivo, existe vários exemplos.

F

o forum serve para tirar duvidas ou mandar agente pesquisar conteudo no google?

R

farelogost,

O andre.froes tem razão. Não tem nada de jQuery nesse código e apesar de não ter dado a solução pronto pra você a dica dele foi super válida… Mas enfim.

O $.post que ele citou é um método que simplifica o uso de ajax no jQuery, se algum dia já usou ajax verá o quanto é mais fácil.

Funciona da seguinte forma:

/*controller.jsp seria o arquivo que receberia a requisição e o parâmetros enviados, mas no caso seria o nome do seu arquivo que faz a busca no banco (ou xml,txt tanto faz)...
Esse "local: $(this).parent().attr('name')", estou usando para o seguinte, você vai passar o local se é Países, Estados, Cidades, Bairros..... 
Ele vai pegar esse valor através do elemento PAI do option que você clicou, por exemplo, se clicou no option SP, o nome desse select que contém o elemento SP será Estados, pois SP é um estado. E dessa forma fica uma função mais genérica pois servira tanto pra quando selecionar um País, Estado, Cidade, enfim.
Já esse "valor: $(this).attr('value')", vai passar o país, estado ou cidade que estará procurando, ou seja o valor do option que você selecionou.
Então já temos onde estamos clicando se é um pais, cidade ou estado, e também o valor dele.
*/
$(document).ready(function(){
$("#cidade, #bairro, #estados, #logradouro").change(function(){
$.post("controller.jsp", {local: $(this).parent().attr('name'), valor: $(this).attr('value') },  
function(data) { //'data' será oq seu script vai retornar, talvez um array com o valores que devem ser listados no próximo select
    //Aqui você pode criar ou exibir um select que talvez esteja escondido por CSS e depois setar os valores dos options
    switch($(this).parent().attr('name')){ //Esse switch nunca usei assim hehe mas acredito que funcione
          case 'Países':
                        $("select[name='Estados']").show();//ou .css('display','block') ou então cria o select...
                        novo = "select[name='Estados']";
                        break;
          case 'Estados':
                        $("select[name='Cidades']").show();
                        novo = "select[name='Cidades']";
                        break;
           //Enfim... e o restante de case que precisar

           //e aqui você vai criando os option's de acordo com o array retornado, pode usar foreach ou qq outro
           for(var i=0; i < data.length; i++){
                   $("<option value=data[i]>data[i]</option>").appendTo($(novo));//esse novo usei pra não precisar repetir o laço várias vezes e saber onde vai colocar os option's
           }
    }
});
});
});
/*Bom agora que já temos uma ideia de como o script em jquery vai funcionar precisamos ver o script que vai pesquisar no banco...
Lembrando que utilizando POST você poderá resgatar o 'local' que é onde está clicando e com 'valor' o valor do option selecionado, com isso já pode criar uma forma onde verifica oq tem na variavel local passada por post e oq deverá buscar no banco...*/

O script NÃO está pronto e muito menos funcionando… Coloquei assim e escrevi bastante pra tentar explicar a ideia e como pode ser feito.
Mas o código pode ficar MUITOOO melhor e simplificado, mas coloquei assim pra ajudar entender e na explicação…

Qualquer dúvida em implementar coloca ai que a gente tenta ajudar…

Abraço

A

Antes de tudo farelogost, o fórum serve para tirar dúvidas sim, não dar resposta pronta. Qualquer fórum tem como princípio incentivar o usuário a crescer passando dicas e auxiliando na criação de seus códigos, e dar um código pronto para você, com certeza não estaria dentro deste objetivo, e com certeza não seria a solução do seus problemas, seria apenas a solução para este de agora.

Mesmo você tendo sido extremamente desagradável neste seu comentário, ainda assim, voltando à minha resposta anterior da busca ao google, ao digitar “jquery post servlet” a primeira opção que aparecerá é a resposta para o seu problema, e o código está pronto lá com jquery, o que faltou foi a sua curiosidade de realizar a pesquisa quando não obteve a resposta pronta no post. Vou colá-la aqui para você vê-la:

Jquery realizando um post:

<script src="http://code.jquery.com/jquery-1.5.js"></script>
   <script>
    $(document).ready(function() {
   $("a").click(function() {
   //var orderId =  $("#orderId").val();
   $.post("test", { orderId : "John"}, //test é o nome do servlet, orderId é o nome do parâmetro passado para o servlet
   function(data) {//data é o que é retornado do servlet para você utilizar no código
     alert("Data Loaded: " + data);
   });
   });
 });
    </script>

Servlet capturando o dado

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        PrintWriter writer =  response.getWriter();
        try{
           String orderId = request.getParameter("orderId").toString();
           writer.write(orderId);
           writer.close();
           }
       catch(Exception ex)
      {
      ex.getStackTrace();
      }
    }

Em cada resposta, você realizará uma operação no teu sistema, que seria carregar o próximo select capturando o retorno do anterior, é só trabalhar com a lógica.
E aprenda a ser mais educado quando pedir ajuda.

Passar bem

F

andre.froes

certo… nao preciso de uma resposta pronta, mesmo por que estou aqui para aprender também, porem se fosse para apenas fazer pesquisas no google eu e creio que nao teria porque existir um forum como este, mas Obrigado pela a ajuda =)

Criado 1 de setembro de 2012
Ultima resposta 2 de set. de 2012
Respostas 5
Participantes 3