[Resolvido] JSON + Spring Mvc

pessoal estou tentando fazer um cadastro dinâmico pois o usuário provavelmente estará no meio de um formulário e eu ñ queria que ele perdesse os dados já preenchidos…

na pagina em que o usuário cadastra este novo campo do select… eu estou usando jquery…

o código é esse:

//indico a url que vai ser requisitada, e envio a variável nome via post  
$.getJSON('listarTipoLoja.json.html', {nome:name.val()}, function(data) {  
    var items = [];  
    $.each(data, function(key, val) {  
        items.push('<option value="' + key + '">' + val + '</option>');  
        });  
        //atualizo o select tipo loja  
    $("select[name=tipoloja]").html(items);  
                                              
});  

O usuário envia a variável nome para ser cadastrada no banco e depois o campo select é atualizado.

O meu codigo controller é esse:

import java.util.List;  
  
import javax.servlet.http.HttpServletRequest;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
  
import br.com.corretora.model.TipoLoja;  
import br.com.corretora.service.TipoLojaService;  
  
@Controller  
public class TipoLojaController {  
      
    @Autowired  
    private TipoLojaService tipoLojaService;  
      
      
      
    public void setEstadoService(TipoLojaService tipoLojaService) {       
        this.tipoLojaService = tipoLojaService;  
    }  
      
      
  
    @RequestMapping("/listarTipoLoja.json.html")  
    public List<TipoLoja> listjson(HttpServletRequest req) {  
        String nome = req.getParameter("nome");  
          
        TipoLoja tipoLoja = new TipoLoja();  
        tipoLoja.setNome(nome);  
        //aki eu cadastro o meu tipo loja  
        tipoLojaService.criar(tipoLoja);  
          
        //depois que tem o cadastro eu retorno uma lista de todos os tipos lojas cadastrados  
        return tipoLojaService.listarTipoLoja();  
    }  
}  

onde eu to errando ja tentei de tudo!!! :evil:

eu consigo cadastrar mais o select ñ atualiza!!!

como vcs utilizam o Json no spring mvc?

Carlão, você está utilizando Spring 3?

Vou te mostrar como fiz um select dinâmico (aquele que você seleciona o estado e ele te devolve as cidades):

Página html + Jquery[code]<spring:url var=“urlCidades” value="/user/cidades" />
function loadCidades(estado){

	if($('#cboEstados option:selected').index() > 0){
		$.ajax({
			type: "GET", 
			url: "${urlCidades}/" + estado,
			success: function(data){
				$.each(data, function(val, text){
					$('#cboCidades').append($('<option></option>').val(text).html(text));
				});
			}
		});
	}
}

[/code]E no meu Controller[code]

@Controller
@RequestMapping(value = “/user”)
public class UserController {

@Autowired
private UserService userService;
(...)

@ResponseBody
@RequestMapping(value = "/cidades/{estado}", method = RequestMethod.GET)
public List<String> retornaCidades(@PathVariable String estado, ModelMap map) {
	return userService.getCidadesPorEstado(estado);
}

[/code]
Pra funcionar aquele @ResponseBody, você tem que ter o jackson referenciado no seu projeto. No meu pom.xml (maven), eu adicionei a seguinte dependência:

<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.5</version> </dependency>

muito bom jaboot…

mas porque você coloca este "value = " no RequestMapping?

Tanto faz colocar ou não, pelo que estou vendo no seu código. Mas eu gosto de separar as coisas, de dar nomes e valores.

Esse value recebe um array de Strings, que são as chamadas REST. Cada valor, cada link (99% das vezes é só um mesmo) é o que você vai ter que bater no browser para acessar. E o method é como a requisição vai chegar nesse método. Imagine que eu posso ter dois métodos com links (value) iguais, mas são acessados diferentemente, um por GET e outro por POST.

Vamos imaginar, que por exemplo, eu tenho uma página que é um formulário de cadastro de clientes. Mas, por uma lógica bisonha, também é o mesmo de cadastro de funcionários da empresa. Eu poderia passar dois links REST para acesso ao mesmo lugar:

@RequestMapping(value = {"/cadastroClientes", "/cadastroFuncionarios"}, method = GET) public String formAddUser(ModelMap map, Model model) { (...)E o que te falei, posso ter dois métodos com a mesma chamada REST, mas com method diferentes:

@RequestMapping(value = "/addUser", method = RequestMethod.GET) public String formAddUser(ModelMap map, Model model) { // geralmente essa funciona para mostrar o form para um possível cadastro@RequestMapping(value = "/addUser", method = RequestMethod.POST) public String addUser(@ModelAttribute("User") User user, BindingResult result, ModelMap map, Model model) { // essa daqui é quando você envia o formulário com os dados do usuário. O /addUser fica na action do seu form.
PS: se quiser colocar só o GET ou POST ou DELETE (…) no seu method, sem escrever o RequestMethod, [color=darkred]import static [/color]!

import static org.springframework.web.bind.annotation.RequestMethod.GET;

Se quiser, me manda uma mensagem privada que eu posso te enviar um projeto modelo, que é importado pelo Maven.

Jaboot!!! você me chamou a atenção pra uma coisa q eu ñ tinha nem percebido cara!!!

as dependências!!! kkkkkk (eu achava q o spring ja fazia isso! :evil: )

como eu ñ to usando o maven eu fui la no jackson.codehaus.org e fiz o download das bibliotecas (jackson-mapper-asl-1.9.5 e jackson-core-asl-1.9.5.jar) e adicionei ao projeto, também adicionei a anotação @ResponseBody no controle:

[code]
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import br.com.corretora.model.TipoLoja;
import br.com.corretora.service.TipoLojaService;

@Controller
public class TipoLojaController {

@Autowired
private TipoLojaService tipoLojaService;



public void setEstadoService(TipoLojaService tipoLojaService) {		
	this.tipoLojaService = tipoLojaService;
}


@ResponseBody
@RequestMapping("/listarTipoLoja.json.html")
public List<TipoLoja> listjson(HttpServletRequest req) {
	String nome = req.getParameter("nome");
	
	TipoLoja tipoLoja = new TipoLoja();
	tipoLoja.setNome(nome);
	//aki eu cadastro o meu tipo loja
	tipoLojaService.criar(tipoLoja);
	
	//depois que tem o cadastro eu retorno uma lista de todos os tipos lojas cadastrados
    return tipoLojaService.listarTipoLoja();
}

}[/code]

e fiz umas modificações no .getJSON do jquery…

$.getJSON('listarTipoLoja.json.html', {nome:name.val()}, function(data){
	var items = "";
	$.each(data, function(key) {
		items += '<option value="' + data[key].id + '">' + data[key].nome + '</option>';
	});
	$("select[name=tipoloja]").html(items);
});

Valeu jaboot!!! agora ta rodando blz!!! :smiley:

Olá Jaboot, eu sei que esse post é antigo já, mas sou iniciante e gostaria que vc me mandasse o projeto de estado e cidade que vc fez, me auxiliaria muito. Agradeço desde já.