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