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:
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).
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.
Nosso formulário exibirá as informações que vieram do Controller. Quando submetido, uma requisição será feita para efetivar a alteração.
O Controller será chamado mais uma vez, agora para receber os parâmetros do formulário e alterar a conta no BD.
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