Redirecionamento do Objeto List (retornado pelo DAO)

7 respostas
T
@Resource
public class ClienteController {

    private final Result result;

    public ClienteController(Result result) {
        this.result = result;
    }

    // esse método executa normalmente e redireciona para WEB-INF/jsp/cliente/busca.jsp, nesse arquivo tenho um <c:foreach> que imprime a lista, é aqui que desejo alterar
    public List<Cliente> busca(String regra) {
        return new ClienteDAO().busca(regra);
    }

    // esse método executa normalmente e redireciona para WEB-INF/jsp/cliente/lista.jsp, nesse arquivo tenho um <c:foreach> que imprime a lista
    public List<Cliente> lista() {
        return new ClienteDAO().lista();
    }
}

Tanto o método lista() quanto o método busca() retornam para a view um objeto clienteList, o que eu quero fazer é eliminar a página busca.jsp e fazer esse objeto clienteList ser exibido na página lista.jsp.

Tentei da seguinte forma:

public List<Cliente> busca(String regra) {
        result.redirectTo(ClienteController.class).lista();
        return new ClienteDAO().busca(regra);
    }

Dessa forma ele reexibe a listagem completa de cliente, o meu filtro não serviu de nada e isso fica claro já que o result invoca a ação lista().
Tentei então redirecionar para o lista.jsp:

public List<Cliente> busca(String regra) {
        result.forwardTo("/WEB-INF/jsp/cliente/lista.jsp");
        return new ClienteDAO().busca(regra);
    }

Aqui é exibido apenas a página com o cabeçalho da tabela, ou seja, o clienteList deve estar vazio. Embora se eu redirecionar para a página padrão do método (busca.jsp) seja exibido os itens do clienteList.

O que fazer?

Obrigado.

7 Respostas

Guevara

Olá TomWH!
Não entendi direito o que vc deseja, mas se quiser retornar dois métodos para a mesma view, poderia fazer algo assim:

public void lista(String regra) {
 result.include("regras", clienteDAO.busca(regra));
 result.include("clientes", clienteDAO.lista());
}

Lá na JSP lista.jsp vc captura com EL normalmente.
Ou então revisar a tática abordada, do jeito que está vc teria que enviar a regra por parâmetro como postei, e o método busca() captura essa regra para que a DAO faça a busca.
Não sei se te ajudei mas tentei. =)

T

tentei a solução mas não obtive sucesso…

O método busca() e o método lista() retornam uma lista de cliente para busca.jsp e lista.jsp respectivamente, acesso a lista retornada por EL ${clienteList}.

Eu quero retornar o clienteList do método busca() para a página lista.jsp exibir os dados, quando faço isso a lista.jsp é exibida e aparece apenas o cabeçalho da tabela onde deveriam estar os dados.

Consegui me expressar melhor agora? Ou compliquei ainda mais?

Obrigado

T

Inspirado em sua ajuda resolvi…ficou assim:

public void busca(String regra) {
        result.include("clienteList", new ClienteDAO().busca(regra));
        result.forwardTo("/WEB-INF/jsp/cliente/lista.jsp");
    }

Muito Obrigado!!! []s

Lucas_Cavalcanti

@TomWH
não faça forwards pra jsps diretamente…
esse código é melhor:

public void  busca(String regra) {  
     result.include("clienteList", new ClienteDAO().busca(regra));  
     result.of(this).lista();  
 }
T

blz Lucas

funcionou aqui…mas qual é o problema que pode ocorrer ao redirecionar diretamente para o .jsp?

[]s

Lucas_Cavalcanti

vai funcionar do mesmo jeito…

mas usando o jeito que eu falei vc ganha algumas funcionalidades do vraptor… além de ficar mais fácil qdo vc tiver que renomear o método, e de ficar mais legível…

G

Nem sempre, pois se no JSP você tem algum você precisará entrar naquele método poder carregar a lista de objetos.

Essa é uma das parte mais legais do vraptor, fica muito mais prático do que usar strings do tipo forwardTo("/users/list"). Além de, como você falou, o refactoring.

Criado 20 de maio de 2010
Ultima resposta 21 de mai. de 2010
Respostas 7
Participantes 4