Dúvida com vraptor e combobox

25 respostas
C

olá pessoal

estou com problemas em passar o valor de um combobox para o vraptor, eu tenho uma lista de estados, seleciono um estado e via json ele carrega as divisões pra mim, mas agora eu quero passar o valor selecionado na divisão para o método carrega do meu controller, mas quando eu executo aparece o link

http://localhost:8080/smcv/cidade/listapordivisao/?divisao.id=2

com esse ?divisao.id=, como eu tiro essa coisa

vlw

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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 getdivisao()
	{
		$('#estado').change(function()
		{
			var value = $('#estado').val();
            $.ajax({ url: '<c:url value="/cidade/carregadivisao/"/>'+value,
            dataType: 'json',success: function(json) 
			{
				var divisoes = json.list;
				$('#divisao option').remove();
			    for(var i in divisoes)
			    {
				     var option = $('<option value="' + divisoes[i].id + '">' + divisoes[i].nome + '</option>');
				     option.appendTo('#divisao');
			    }
			}
		});
	});
	});
</script>

</head>
<body>
	<fieldset>
		<legend>Listagem de Cidades</legend>
	</fieldset>
	
	<label>Estado</label>
	<select id="estado" name="sestado" onChange="getdivisao()">
			<c:forEach var="estado" items="${estadoList}">
				<option value="${estado.id}">${estado.nome}</option>
			</c:forEach>
	</select>
	
	
	<form action="<c:url value="/cidade/listapordivisao/${divisao}"/>" method="get">
		<label>Divisão</label>
		<select id="divisao" name="divisao.id">
	
		</select>	
		<button type="submit">Listar</button>
	</form>	
</body>
</html>

25 Respostas

juniorsatanas

ele ta carregando o Id 2…
:http://localhost:8080/smcv/cidade/listapordivisao/?divisao.id=2
na verdade vc queria o valor seleccionado e isso ?

C

o valor 2 está correto eu preciso tirar esse[color=red] ?divisao.id=[/color] que ele coloca sozinho

Lucas_Cavalcanti

vc quer fazer uma requisição pra /cidade/listapordivisao/2 ??

vc não vai conseguir fazer isso usando só html…

coloque isso no seu javascript (vc não precisa dar nome pra function se vc não quiser):

$('#divisao').change(function() {
        var form = $(this).parents('form'); //pega o form de fora
        var url = form.attr('action'); // pega a action do form
        var selected = $(this).children(':selected').val(); //pega a option selecionada (eu acho)
        form.attr('action', url + selected); //muda a action do form
        form.submit(); //submete o form
  });
juniorsatanas

O Lucas sabe mais de VRaptor que minha vizinha de Pica ! hehhe

C

Lucas obrigado pela ajuda, eu entendi o seu código, mas não consegui entender como utiliza-lo

eu tenho que remover meu Listar?

Lucas_Cavalcanti

sim… pode remover o botão… vc vai fazer a requisição via javascript…

a requisição vai ser feita assim que a pessoa escolher uma divisão… talvez seja bom vc incluir uma option em branco no select…

juniorsatanas

Lucas tu é da CAelum ?

Lucas_Cavalcanti

Sim… sou da Caelum, e sou desenvolvedor do VRaptor

C

não ta funcionando, q q eu to fazendo de errado?

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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 getdivisao()
	{
		$('#estado').change(function()
		{
			var value = $('#estado').val();
            $.ajax({ url: '<c:url value="/cidade/carregadivisao/"/>'+value,
            dataType: 'json',success: function(json) 
			{
				var divisoes = json.list;
				$('#divisao option').remove();
			    for(var i in divisoes)
			    {
				     var option = $('<option value="' + divisoes[i].id + '">' + divisoes[i].nome + '</option>');
				     option.appendTo('#divisao');
			    }
			}
		});
	});
	});		
</script>
<script type="text/javascript">
$('#divisao').change(function() {
    var form = $(this).parents('form'); //pega o form de fora
    var url = form.attr('action'); // pega a action do form
    var selected = $(this).children(':selected').val(); //pega a option selecionada (eu acho)
    form.attr('action', url + selected); //muda a action do form
    form.submit(); //submete o form
});

</script>
</head>
<body>
	<fieldset>
		<legend>Listagem de Cidades</legend>
	</fieldset>
	
	<label>Estado</label>
	<select id="estado" name="sestado" onChange="getdivisao()">
			<c:forEach var="estado" items="${estadoList}">
				<option value="${estado.id}">${estado.nome}</option>
			</c:forEach>
	</select>
	
	
	<form action="<c:url value="/cidade/listapordivisao/"/>" method="get">
		<label>Divisão</label>
		<select id="divisao" name="divisao.id">
	
		</select>	
	</form>	
</body>
</html>
juniorsatanas

Lucas Quem e responsável por por as frases nas apostilas ?

Lucas_Cavalcanti

@cvinicios
esse código é um binding de eventos no jquery… vc precisa executar isso depois de carregar toda a tela…

pra fazer isso é só colocar o código dentro de um :

$(function() {
   //codigo aqui
});

ou seja, no seu caso é só deixar dentro da function getdivisao (que não precisa ter nome… pode deixar só function() pq não vai ser vc que vai chamá-la)

@juniorsatanas
Muitas pessoas, depende da apostila, porque?

juniorsatanas

JSF / VRaptor — sempre tem uma referencia a Nietzsche, queria saber que tem tão bom gosto e ainda sabe java !

Lucas_Cavalcanti

várias pessoas da caelum lêem bastante :wink: mas enfim… não vamos desviar o assunto do tópico por favor

C

Lucas essa option em branco que vc falou é a primeira[0]?

eu percebi que o primeiro item não dá para ser selecionado na primeira tentativa, é isso?

vlw

Lucas_Cavalcanti

isso… adicione uma option em branco:

...
 var divisoes = json.list;  
 $('#divisao option').remove();  
 $('#divisao').append('<option value=""></option>');
 ...
pissurno

Retomando o assunto do topico em questão.
Estou começando agora com vraptor.
Fiz umas pesquisas no google e aqui mesmo no guj sobre melhor forma de se usar um combo box com vraptor e me deparei com <c:foreach> para iterar os itens!!!
Não existe alguma solução do tipo que usamos no jsf com rich faces? um SelectOneMenu da vida?

obrigado

juniorsatanas

hahahha essa foi boa, ou melhor foi otima !

EU SEMPRE QUIS PERGUNTAR ISSO !
Lucas_Cavalcanti

bom… os componentes visuais do JSF não funcionam normalmente com os frameworks baseados em servlet (como o VRaptor)…

mas de qqer forma, vc pode usar taglibs como o waffle (http://waffle.codehaus.org/taglib.html) para fazer isso que vc quer:
http://waffle.codehaus.org/select.html

<w:select name="product.id" items="${products}" value="id" var="product" >  
   ${product.name}  
</w:select>
pissurno

vou dar uma olhada em waffle depois vlw pela dica :slight_smile:

Agora so para fechar qual seria a melhor solução ou o que vcs usam em uma aplicação desenvolvida por vcs usando o vraptor?

vcs usam o waffle mesmo ou fazem de outra forma?

flw

juniorsatanas

Tenho uma dúvida 1:

Usando JSF eu faço ESTADOS -----------------------&gt; CIDADES, quando eu escolho estados dou RERENDER em Cidades:

1. &lt;h:outputLabel for="estado" value="#{msgs['estado.nome']}:" styleClass="labels"/&gt; 2. &lt;h:selectOneMenu id="estado" value="#{estadoBean.estado.objectID}" immediate="true" rendered="true" required="false"&gt; 3. &lt;f:selectItem itemLabel="Selecione" itemValue="0"/&gt; 4. &lt;f:selectItems value="#{estadoBean.listaEstados}"/&gt; 5. &lt;a4j:support event="onchange" ajaxSingle="true" action="#{estadoBean.getCidadesByEstado}" reRender="estado,cidade,bairro"/&gt; 6. &lt;/h:selectOneMenu&gt; 7. <br/><br/> 8. 9. &lt;h:outputLabel for="cidade" value="#{msgs['cidade.nome']}:" styleClass="labels"/&gt; 10. &lt;h:selectOneMenu id="cidade" value="#{cidadeBean.cidade.objectID}" immediate="true" rendered="true" required="false"&gt; 11. &lt;f:selectItem itemLabel="Selecione" itemValue="0"/&gt; 12. &lt;f:selectItems value="#{estadoBean.itensCidade}" /&gt; 13. &lt;a4j:support event="onchange" ajaxSingle="true" action="#{cidadeBean.getBairrosByCidades}" reRender="estado,cidade,bairro"/&gt; 14. &lt;/h:selectOneMenu&gt; 15. <br/><br/> 16. 17. &lt;h:outputLabel for="bairro" value="#{msgs['bairro.nome']}:" styleClass="labels"/&gt; 18. &lt;h:selectOneMenu id="bairro" value="#{bairroBean.bairro.objectID}" immediate="true" rendered="true" required="false"&gt; 19. &lt;f:selectItem itemLabel="Selecione" itemValue="0"/&gt; 20. &lt;f:selectItems value="#{cidadeBean.itensBairro}" /&gt; 21. &lt;/h:selectOneMenu&gt;

Como fazer isso usando JSF ?

Lucas_Cavalcanti

pissurno:
vou dar uma olhada em waffle depois vlw pela dica :slight_smile:

Agora so para fechar qual seria a melhor solução ou o que vcs usam em uma aplicação desenvolvida por vcs usando o vraptor?

vcs usam o waffle mesmo ou fazem de outra forma?

flw


eu prefiro usar HTML + JSP puro pra fazer isso mesmo, fica bem mais fácil controlar o que aparece,
e aplicar qualquer layout

@juniorsatanas
pra fazer isso no vraptor, vc pode carregar o segundo combobox(select) usando ajax mesmo…
vários plugins do jQuery fazem isso

juniorsatanas
Vixi, ai da maior prolema com os navegadores ! pega em 1 e não pega em 10 !
carrego o JQuery:

&lt;script type=&quot;text/javascript&quot; src=&quot;../../script/jquery-1.2.6.js&quot;&gt;&lt;/script&gt;



A funcao que chama as cidades:

function carregaCidades(estado)
{               

        $("#cidade").load("ajaxCarregaCidade?estado="+estado);
        $("#cidade").ajaxError(function(request, settings){
                $("#cidade").html("Falha ao recuperar as Cidades.");  
        });
        
}

Obrigado !

Lucas_Cavalcanti

na verdade, se vc fez direito, não deveria dar problema entre os navegadores, pq o jquery já cuida de deixar as coisas compatíveis

pissurno

vlw lucas pelas dicas agora é so implementar hehehehe

juniorsatanas

pissurno , teu projeto tem controle de usuário ?

Criado 11 de março de 2010
Ultima resposta 12 de ago. de 2010
Respostas 25
Participantes 4