[Resolvido] JSON + Spring Mvc

6 respostas
C

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

6 Respostas

C

como vcs utilizam o Json no spring mvc?

J

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
<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));
					});
				}
			});
		}
	}
E no meu Controller
@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);
	}
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>
C

muito bom jaboot…

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

J

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.

C

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:

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();
	}
}

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

G

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á.

Criado 22 de março de 2012
Ultima resposta 23 de jul. de 2014
Respostas 6
Participantes 3