2
respostas

Duvida bind campos da tela

A dúvida é a seguinte

Imagine que tenho uma tela com 2 combos de filtro e embaixo uma grid de resultado.

Quando inicio a tela, busco os dados para popular a combo e tenho a opção de fazer isso:

public String init(Model model){
    model.addAttribute("lista1",  recuperaLista1());
    model.addAttribute("lista2",  recuperaLista2());
    return "filtro";
}

Neste casso, no meu html (com freemaker, thymeleaf etc..) eu pegaria e montaria a lista pelo "lista1" e "lista2". Após seleciona um item na combo posso clicar em um botão que faça a pesquisa, então teria um método do meu controller para pesquisar. Neste método, após a pesquisa, para que as duas combos voltem preenchidas para a view eu preciso novamente adicionar os itens a um Model ou ModelAndView e retorna-lo certo?

Com alguns testes, percebi o seguinte, trabalho com o freemarker no caso.

Imaginando que tenho a mesma tela, e para ela eu criei um objeto DTO que represente seu campos na tela, e para esta tela eu faço o binding deste objeto. Então eu tenho na minha classe este DTO injetado pelo Spring e ao invés de eu adicionar em um model eu faço o seguinte:

    @Autowired
    private DTO dto;

    @ModelAttribute("dto")
    public dto getDTO(){
        return this.dto;
    }

    @GetMapping
    public String init() {
        dto.setLista1(recuperaLista1());
        dto.setLista2(recuperaLista2());
        return VIEW;
    }

E quando eu submeter a minha pesquisa eu teria

@PostMapping
    public String pesquisa(@ModelAttribute("dto") DTO dto, BindingResult bindingResult){

            dto.setListaResultado(recuperaResultado());        
        return VIEW;

    }

Desta forma, quando submeto meus filtros não perco nenhum dado , inclusive a lista que já havia carregado.

Meu conhecimento é um pouco maior em JSF, para quem entende de Spring as dúvidas resumidamente são:

1- Existe outra forma de fazer isso sem eu perder as informações? 2- Qual das duas formas é mais indicada 3- Quais são os problemas de cada uma

Agradeço desde já!

2 respostas

Oi, eu prefiro a forma que você declaradamente recupera as listas após o filtro. Não vejo problema sério na forma que você fez, apenas acho que foi uma volta meio grande.. minha sugestão:

public String filtro(...,Model model){
   model.addAtribute("lista",resultadoPesquisa);
   return metodoQueLevaParaAPagina(model);
}

Se você simplesmente chamar o método que leva para a página, as listas vão ser carregadas e tudo vai funcionar, acho :).

Boa noite Alberto

Blz ?

Obrigado pela resposta!

Vou aproveitar para outra duvida :)

Nestes dois exemplos quando selecionado uma opção da combo, volto para meu controller, qual é a forma correta para que a combo fique preenchida com a opção selecionada ?

Tenho que controlar isso no meu html ?

Não existe uma forma de eu enviar os dado a novamente ele atualizar o resultado e manter a combo selecionada sem que eu tenha uma lógica no meu html

Desde já agradeço

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software