Olá a todos, mais uma dúvida boba de quem tá vindo de 10 anos de frameworks baseados em componentes.
Eu tenho no meu controlador, o método que redireciona para a página de listagem de estabelecimentos, neste método eu recebo por injeção um Objeto chamado Pageable, que guarda alguns dados sobre a requisição e também uma string que é uma busca, pois na página de listagem o usuário pode pesquisar por nome de estabelecimento, se o valor de filtro estiver nulo, ele traz todos, na verdade traz todos paginados de 10 em 10.
@Get("/estabelecimentos")
public void lista(Pageable pageable, String filtro){
Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,filtro);
result.include("page",pagina);
}
<form method="GET" action="<c:url value="/estabelecimentos"/>">
<div class="row">
<div class="form-group col-sm-12">
<label class="control-label" for="nome">Nome:</label>
<input type="text" class="form-control" id="nome" name="nome" autofocus="autofocus" value="${nome}"/>
</div>
</div>
<button type="submit" class="btn btn-primary">Pesquisar</button>
</form>
Logo vi que este meu código era um pouco problemático, pois logo após salvar ou atualizar um estabelecimento eu redireciono para a página de listagem, para fazer isso eu teria que fazer:
result.redirectTo(EstabelecimentoController.class).lista(null,null);
oque não faz muito sentido pois o objeto pageable carrega dados sobre o request e não deve ser nulo. Então fiz o seguinte:
@Inject private Pageable pageable;
@Inject private HttpRequest request;
@Get("/estabelecimentos")
public void lista(){
String filtro= request.getParameter("nome");
Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,filtro);
result.include("page",pagina);
}
A solução acima funciona, mas dessa forma perco uma das grandes vantagens do framework que é popular automaticamente os objetos sem que eu precise ficar pegando eles do request, esse filto é apenas uma String, mas poderia ser um objeto complexo.
Pra contarnar isso, pensei o seguinte: então vou criar uma outra url, para que quando o usuário pesquise, eu receba o filtro e redirecione para a página de listagem
@Inject private Pageable pageable;
@Get("/estabelecimentos")
public void lista(){
Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,null);
result.include("page",pagina);
}
@Get("/estabelecimentos/{filtro}")
public void pesquisar(String filtro){
Page<Estabelecimento> pagina = estabelecimentos.pesquisar(pageable,fitro);
result.include("page",pagina);
//gostaria de utilizar a página de listagem
}
empaquei bem aqui, pois se eu chamar a página de listagem no método pesquisar, ele vai fazer novamente a busca sem o filtro e vai sobrescrever a busca do usuário, estou sem idéia de como fazer isso. Alguém tem alguma sugestão?