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

Passando Valores para alterar

Senhores,

Fizemos um método para deletar uma conta, até aí tudo certo. Mas eu queria um método para alterar uma conta, reaproveitei o método de deletar, porém empaquei na parte que eu passaria os os valores corrente ao formulario para o usuário escolher o que ele quer alterar se é descricao, valor ou tipo e depois salvar. Não estou sabendo passar valores pra outra página.

Obrigado

2 respostas
solução!

Fala aí, Lorran! Tudo certo?

Não sei se entendi corretamente sua dúvida... Você quer fazer um formulário de alteração de conta, mas não sabe como passar os valores de uma página à outra, correto?

Caso seja isso, podemos fazer algo parecido com o seguinte:

  1. Na página de listagem, adicionar um link para alteração que, quando clicado, levará o usuário para a página de alteração (formulário).

  2. O link fará uma requisição, portanto devemos ter um Controller mapeado... Ele deverá pegar o ID da conta, buscar no banco de dados e enviar para a View.

  3. Nosso formulário exibirá as informações que vieram do Controller. Quando submetido, uma requisição será feita para efetivar a alteração.

  4. O Controller será chamado mais uma vez, agora para receber os parâmetros do formulário e alterar a conta no BD.

  5. Ao término da operação, o usuário deverá ser redirecionado para a listagem, por exemplo...

Então, vamos por partes. A primeira coisa a se fazer, é adicionar o link na página de listagem:

<c:forEach items="${contas}" var="conta">
  <...>
  <td>
    <a href="mostraConta&id=${conta.id}">Alterar</a>
  </td>
</c:forEach>

Feito isso, devemos fazer o mapeado no Controller:

@Controller
public class ContaController {
  // ...

  @RequestMapping("/mostraConta")
  public String mostra(Long id, Model model) {
    ContaDao dao = new ContaDao();
    Conta conta = dao.buscaPorId(id);

    model.addAttribute("conta", conta);

    return "conta/mostra";
  }
}

O que fizemos até aqui? Repare que acabamos de criar um método que recebe um Long, que representa o ID da conta... Usamos ele como parâmetro do método buscaPorId, do DAO, para fazer uma busca no BD baseado no ID... Feito isso, teremos uma conta, que só precisaremos enviar para a View, através do Model. =)

Agora podemos partir para a criação da nossa página, mostra.jsp, que deve estar dentro do diretório conta:

<...>
<form action="alteraTarefa" method="post">
  <label for="descricao">Descrição</label>
  <textarea name="descricao" id="descricao">${conta.descricao}</textarea>

  <label for="valor">Valor</label>
  <input type="text" name="valor" id="valor" value="${conta.valor}">

  <label for="tipo">Tipo</label>
  <select name="tipo" id="tipo">
    <option value="ENTRADA" ${conta.tipo == "ENTRADA" ? "selected" : ""}>Entrada</option>
    <option value="SAIDA" ${conta.tipo == "SAIDA" ? "selected" : ""}>Saída</option>
  </select>

  <label for="paga">Pago?</label>
  <input type="checkbox" name="paga" id="paga" ${conta.paga ? "checked" : ""}>

  <label for="dataPagamento">Data de pagamento</label>
  <input type="text" name="dataPagamento" id="dataPagamento" value="<fmt:formatDate pattern='dd/MM/yyyy' value='${conta.dataPagamento.time}' />">

  <input type="hidden" name="id" value="${conta.id}">

  <input type="submit" value="Alterar">
</form>
<...>

Se entendi corretamente, sua principal dúvida está nessa parte, correto? =)

Repare que nosso Controller foi o responsável por enviar o objeto Conta para a nossa View, ou seja, mostra.jsp... Isso foi feito na linha model.addAttribute("conta", conta);. =)

Depois que fizemos isso, foi possível pegar esses valores e exibí-los na página! Repare que todos os <input> possuem o atributo value declarado, e todos possuem algo como ${conta.atributo}. Como enviamos o objeto Conta para a página, usamos a Expression Language para chamar os getters e preencher o formulário, sacou? =)

Feito isso, basta fazer o mapeamento no Controller, para receber a requisição do formulário, que será /alteraTarefa:

@Controller
public class ContaController {
  // ...

  @RequestMapping("/alteraConta")
  public String altera(Conta conta) {
    ContaDao dao = new ContaDao();
    dao.altera(conta);

    return "redirect:listaContas";
  }
}

A ideia é essa... Talvez algumas classes e métodos estejam diferentes do curso, pois não vi o curso! =X

Espero ter ajudado! Mas qualquer dúvida que possa ter restado, não deixe de postar por aqui, no fórum, para que possamos ajudá-lo, ok? =)

Abraço e bons estudos,

Fábio

Perfeito Fábio,

Era exatamente o que você postou!!!

Muito Obrigado.