segunda-feira, 17 de dezembro de 2007

Combos dinâmicos no JSP

Depois de muito penar, descobri como fazer combobox dinâmicas para JSP.
No exemplo, eu quero que um combo, chamado 'cidade' exiba as cidades contidas no banco, de acordo com o estado que eu selecionar na combo 'uf'.

1º passo: Criar uma página jsp, que faça uma busca na tabela 'cidade', passando como parâmetro (preferencialmente via get) o código da uf:


try{
int codigoUf = Integer.parseInt(request.getParameter("codigo").toString());
List lista = Busca.listaCidades(codigoUf);
out.print("[");
for(int i = 0; i < lista.size(); i++){
if (i != 0) out.print(", ");
out.print("'" + lista.get(i).getNome() + "'");
}
out.print("]");
conexao.close();
} catch (NumberFormatException e){}


obs.: Se o java imprimisse a lista diretamente, ficaria no formato "[ item, item, item ]". Mas o javascript, pelo menos aqui, não reconheceu esse formato. Por isso, eu fiz essa mini gambiarra, para que a saída seja "[ 'item', 'item', 'item' ]", como no PHP.

2º passo: Agora, no HTML, basta colocar o seguinte atributo na tag select:

onchange="buscaCidade(this.options[this.selectedIndex].value)"

3º passo: Criar o javascript:


function buscaCidade(tuf){
try{
xmlhttp = new XMLHttpRequest();
} catch(e1) {
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e2){
try{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e3){
xmlhttp = false; //Viva a padronização dos browsers
}
}
}

//limpa a combobox
var c = document.getElementById("cidade")
while( c.options.length > 0) c.options[0] = null
c.options[0] = new Option(" -- Aguarde ... -- "," -- Aguarde ... -- ")

//Monta a url com a uf
xmlhttp.open("GET", "buscacidade.jsp?codigo=" + tuf, true);
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4){
var c = document.getElementById("cidade")
while(c.options.length > 0) c.options[0] = null
//Transforma a lista de cidades JSON em Javascript
var aCidades = eval((xmlhttp.responseText))
//popula o select com a lista de cidades obtida
for(var i = 0; i < aCidades.length; i++){
aCidades[i] = unescape(aCidades[i])
c.options[c.options.length] = new Option(aCidades[i], aCidades[i])
}
}
}
xmlhttp.send(null)
}


Segundo meus cálculos, agora deve funcionar... Para testar, crie dois combos (uf e cidade), e popule um banco =]

Observações:

1) De repente, você pode precisar utilizar o código da cidade juntamente com o nome, para efetuar cadastros e tals. No exemplo de cima, o jsp só busca o nome da cidade. Pra fazer ele buscar também o código, concatene ele com o nome da cidade, utilizando um caracter bem estranho para separá-los:

out.print("'" + lista.get(i).getCodigo() + "#" + lista.get(i).getNome() + "'");

Daí no .js você coloca:

var str = aCidades[i].split("#");
c.options[c.options.length] = new Option(str[1], str[0])

Onde str[0] (código) será o value do select, e str[1] (nome) será o valor exibido na combo.

2) De repente também, você precise utilizar este javascript em mais de uma combo. Para isso, é só passar o nome do combo que você quer carregar via parâmetro:

onchange="doBusca(this.options[this.selectedIndex].value, 'cidade')"

E alterar o javascript pra receber esse parâmetro.

3) Peguei esse código daqui, e adaptei um pouco =D.

É isso, té mais o/

10 comentários:

Anônimo disse...

Olá....vamos fechar uma parceria? Aguardo seu retorno. Valeu!

Parceiros do Grita disse...

Olá...valeu parceiro.

Seu banner está fixo e rotativo beleza???

Espero que goste.....

E quanto ao coringão. sem dúvida estaremos de volta em 2009 e 2010 seremos campeão da Libertadores...

Guarde essa mensagem e pode acreditar...

Desde quando perdemos a Libertadores em 99 para vocêis, falei que o corinthians só seria campeão da Libertadores no centenário...

Então pela lógica está dando certo...a segundona serve para arrumar a casa, 2009 se classificamos para Liber....

E 2010 a consagração...

Valeu e abraços...

E bom sonhar não é!

Anônimo disse...

Salve simpatia!

Seguinte, mudamos de domínio!
Agora é .com!!!!
Se puder atualizar nosso banner, o novo está aqui:
http://putanhaca.com/2008/?page_id=7

Valeu!!!
Abraços!!!

Dulce Miller disse...

Isso aí pra mim é tudo grego, mas eu entendo de outras coisas, que talvez você também não compreenda...quer ver? Tá, você vai dizer que não tem nada a ver...mas e daí? Isso é que é legal, a diversidade de idéias e opiniões... (tudo isso porque não entendo nada aqui nesse blog, por isso, na falta de um comentário relevante sobre o post...quem sabe agora o Preco visita o Norte???) Ou talvez nunca mais apareça, depois dessa! hehehehehehheeheheheheheheheheheh


"Desejo primeiro que você ame,
E que amando, também seja amado.
E que se não for, seja breve em esquecer.
E que esquecendo, não guarde mágoa.
Desejo, pois, que não seja assim,
Mas se for, saiba ser sem desesperar.

Desejo também que tenha amigos,
Que mesmo maus e inconseqüentes,
Sejam corajosos e fiéis,
E que pelo menos num deles
Você possa confiar sem duvidar.
E porque a vida é assim,
Desejo ainda que você tenha inimigos.
Nem muitos, nem poucos,
Mas na medida exata para que, algumas vezes,
Você se interpele a respeito
De suas próprias certezas.
E que entre eles, haja pelo menos um que seja justo,
Para que você não se sinta demasiado seguro.

Desejo depois que você seja útil,
Mas não insubstituível.
E que nos maus momentos,
Quando não restar mais nada,
Essa utilidade seja suficiente para manter você de pé.

Desejo ainda que você seja tolerante,
Não com os que erram pouco, porque isso é fácil,
Mas com os que erram muito e irremediavelmente,
E que fazendo bom uso dessa tolerância,
Você sirva de exemplo aos outros.

Desejo que você, sendo jovem,
Não amadureça depressa demais,
E que sendo maduro, não insista em rejuvenescer
E que sendo velho, não se dedique ao desespero.
Porque cada idade tem o seu prazer e a sua dor e
É preciso deixar que eles escorram por entre nós.

Desejo por sinal que você seja triste,
Não o ano todo, mas apenas um dia.
Mas que nesse dia descubra
Que o riso diário é bom,
O riso habitual é insosso e o riso constante é insano.

Desejo que você descubra,
Com o máximo de urgência,
Acima e a respeito de tudo, que existem oprimidos,
Injustiçados e infelizes, e que estão à sua volta.

Desejo ainda que você afague um gato,
Alimente um cuco e ouça o joão-de-barro
Erguer triunfante o seu canto matinal
Porque, assim, você se sentirá bem por nada.

Desejo também que você plante uma semente,
Por mais minúscula que seja,
E acompanhe o seu crescimento,
Para que você saiba de quantas
Muitas vidas é feita uma árvore.

Desejo, outrossim, que você tenha dinheiro,
Porque é preciso ser prático.
E que pelo menos uma vez por ano
Coloque um pouco dele
Na sua frente e diga "Isso é meu",
Só para que fique bem claro quem é o dono de quem.

Desejo também que nenhum de seus afetos morra,
Por ele e por você,
Mas que se morrer, você possa chorar
Sem se lamentar e sofrer sem se culpar.

Desejo por fim que você sendo homem,
Tenha uma boa mulher,
E que sendo mulher,
Tenha um bom homem
E que se amem hoje, amanhã e nos dias seguintes,
E quando estiverem exaustos e sorridentes,
Ainda haja amor para recomeçar.
E se tudo isso acontecer,
Não tenho mais nada a te desejar".

(Poema de Victor Hugo)

Lelo disse...

Humm.. uma vez eu consegui fazer um combo dinâmico também, acho que foi com o Yory contra o Robert.

Dulce Miller disse...

Credo, toda vez que tento ler um post seu, fico tonta! Bah...
Já que falamos sobre poesia ontem, leia o meu poema de hoje no Norte!
;)...Quem sabe você também tonteia!!! auhauhauhauhauahauahau

Osc@r Luiz disse...
Este comentário foi removido pelo autor.
Osc@r Luiz disse...

Alô Zero Dois!
Eu vi seus comentários lá no Paralelo e gostei. Também gostei da imagem do seu perfil (se visitar meu blog principal vai descobrir porque).
Mas aqui, eu juro: não entendi patavina nenhuma! Pelo menos sou sincero!
Mas gostei de você e "sejo" seu parceiro se quiser. Vou colocar links pra cá lá no "By Osc@r Luiz" e no "Flainando na Web".
Quem sabe é útil a algum dos meus leitores (é, acredite! Tem gente inteligente que frequenta os meus mundos! Por mais incrível que possa parecer!) por que pra mim é chinês mandarim.
Não me apresentei. Sou Oscar, e amigo da Du é amigo meu! Não precisa de credenciais.
Um abraço!

Dulce Miller disse...

Preco meu filho, eu volto aqui e esse tal de combo tá aqui ainda???

Olha só, deixei 5 selos de uma vez só pra você lá no Norte.Se não gostar dessa coisa de receber selinhos tudo bem, sem problemas (abafaaaaaaaaaaaaaaa)!

Beijos

DTM Admin disse...

amigo, vc poderia disponibilizar os arquivos completos do exemplo acima para download? preciso muito entender, pois tenho que implementar no meu serviço. agradeço!