Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Duvidas sobre assinatura do método salvar

Na assinatura do método salvar são declarados os seguintes parâmetros:

@RequestParam("nome") String nome, @RequestParam("email") String email, @RequestParam("telefone") String telefone.

Minha dúvida seria se não existe uma forma mais simples de passar os valores, pois imagino que se tivesse dezenas de campos não seria viável passar um a um.

Obrigado

6 respostas

Oi Bruno,

Se você tiver uma classe Java que representa essas informações, poderá utilizá-la como parametro.

Exemplo:

public class Pessoa {
    private String nome;
    private String email;
    private String telefone;

    //getters e setters...
}
public void salvar(Pessoa pessoa) {
    //codigo para salvar...
}

Nesse caso, quando o método salvar for chamado, o Spring vai instanciar o objeto Pessoa e preencher os atributos conforme os parametros que estiverem vindo na requisição.

Portanto, é importante que os inputs tenham os names iguais aos dos atributos da classe:

<input type="text" name="nome">
<input type="text" name="email">
<input type="text" name="telefone">

Bons estudos!

Boa tarde no exemplo do curso eu não poderia utilizar a classe convidado? Ou teria que criar outra classe?

solução!

Oi Bruno,

Pode sim, é exatamente essa classe que você vai utilizar.

É que eu não olhei que no curso tinha a classe Convidado, e mostrei essa chamada Pessoa só de exemplo mesmo.

Deixei dessa forma esta correto? Fiquei na dúvida se o correto não era eu ter uma classe que representa a view listaConvidados, pois estou utilizando uma classe do meu modelo.

@RequestMapping(value = "salvar", method = RequestMethod.POST )
    public String salvar(@Valid @ModelAttribute Convidado novoConvidado , Model model){        

        service.salvar(novoConvidado);

        new EmailService().enviar(novoConvidado.getNome(), novoConvidado.getEmail());

        Iterable<Convidado> convidados = service.obterTodos();


        model.addAttribute("convidados", convidados);

        return "listaconvidados";

    }

Oi Bruno,

Desse jeito está correto.

Esse é o jeito mais comum que o pessoal utiliza nos projetos, mas realmente essa questão da classe de modelo ir para a tela leva a algumas discussões...

O problema é que a View fica acoplada com o Model, e isso pode levar a problemas de manutenção no código. O ideal seria ter 2 classes a mais, uma que representa os dados que chegam do formulário e outra que representa as informações que vão para a tela. Algo como:

public class CadastroConvidadoForm {
    private String nome;
    private String email;
    private String telefone;

    //metodos setters

    public Convidado toConvidado() {
        return new Convidado(this.nome, this.email, this.telefone);
    }
}
public class ListaConvidadosView {

    private List<Convidado> convidados;

    public ListaConvidadosView(List<Convidado> convidados) {
        this.convidados = convidados;
    }

    //getters e outros metodos que a tela precise...
}
@RequestMapping(value = "salvar", method = RequestMethod.POST )
public String salvar(@Valid @ModelAttribute CadastroConvidadoForm form , Model model) {
    Convidado novo = form.toConvidado();
    service.salvar(novo);
    new EmailService().enviar(novo.getNome(), novo.getEmail());

    Iterable<Convidado> convidados = service.obterTodos();
    model.addAttribute("convidados", new ListaConvidadosView(convidados));
    return "listaconvidados";
}

O problema é que você precisa escrever mais código, porém essa abordagem favorece bastante a manutenção e desacoplamento de código.

Recentemente o Alberto Souza, um dos instrutores aqui na Alura, escreveu um post no blog dele discutindo sobre o assunto. Dá uma lida: https://domineospring.wordpress.com/2018/04/23/sera-que-o-struts-1-estava-certo

Muito obrigado pela atenção e dicas :)