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

AULA 4: Controlando o resultado

Tenho um formulário para produtos no qual eu gostaria de carregar uma lista de fornecedores ao ser aberto. No pacote de controladores estão o FornecedorController e um ProdutoController. Gostaria de incluir no resultado do formulário de produto a lista de todos os fornecedores. Pensei em chamar o método lista do FornecedorController a partir do formulário de produtos, mas ele retorna a lista para uma página lista.jsp de fornecedores. Outra alternativa que imaginei seria injetar o FornecedorDAO no controlador de produto para usá-lo diretamente, sem intermediação do FornecedorController. Por favor, o que me recomendariam para obter a lista de fornecedores a partir do controle de produtos?

5 respostas

Chamar o método do controlador sem redirecionar seria ruim:

package br.com.secretariasaude.controller;

import java.util.List;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.model.Fornecedor;

@Resource
public class ProdutoController {

    private Result result;
    private final FornecedorController fornecedorControlador;

    public ProdutoController(Result result, FornecedorController fornecedorControlador) {
        this.result = result;
        this.fornecedorControlador = fornecedorControlador;
    }

    @Get("produtos/novo")
    public List<Fornecedor> formulario(){
        return fornecedorControlador.lista();
    }
    //Outros métodos omitidos
}

Combo da página "WebContent/WEB-INF/jsp/produto/formulario.jsp":

<form action="<c:url value="/produtos"/>" method="POST">
    <fieldset>
        <legend>Novo Produto</legend>
        Nome: <input type="text" name="produto.nome" value="${produto.nome}">
        Descrição: <input type="text" name="produto.descricao" value="${produto.descricao}">
        Preço: <input type="text" name="produto.preco" value="${produto.preco}">
        Fornecedor:
        <select name="produto.fornecedor">
        <c:forEach items="${fornecedorList}" var="fornecedor">
            <option>${fornecedor.nome}</option>
        </c:forEach>
        </select>
        <button type="submit">Enviar</button>
    </fieldset>
</form>

Isso seria ruim?

solução!

Olá Camila

Nesse caso o mais usual seria injetar diretamente o FornecedorDAO dentro do ProdutoController:

public class ProdutoController{
  private FornecedorDAO fornecedorDAO;
  public ProdutoController(FornecedorDAO fornecedorDAO){
    this.fornecedorDAO = fornecedorDAO;
  }

  // resto do código
}

Isso é feito por que as classes controladoras de um framework mvc costumam ficar complexas e ter muitas dependências, enquanto as classes de negócio, como o DAO, costumam ser mais simples e por isso mais fáceis de serem gerenciadas diretamente pelo framework.

Lembre-se que o objetivo é sempre evitar a complexidade do código.

Olá Camila

A sua dúvida foi solucionada?

Foi solucionada sim, muito obrigada Vitor!

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