Dúvida fj-21 - Capítulo 11.14 - Objeto na requisição com Spring MVC

4 respostas
ERVER

Boa noite pessoal, vou tentar explicar junto com o código:

Esta é a minha view:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<html>
	<head>
		<script type="text/javascript" src="resources/js/jquery.js"></script>
	</head>
	<body>
	<script type="text/javascript">
		function finalizaAgora(id) {
		$.post("finalizaTarefa", {'id' : id}, function() {
		// selecionando o elemento html através da ID e alterando o HTML dele
		$("#tarefa_"+id).html("Finalizado");
		
		var data = new Date();
    	var dia = data.getDate();
    	var mes = data.getMonth() + 1;
    	var ano = data.getFullYear();

    	if (dia < 10) {
      		dia = "0" + dia;     
    	}

    	if (mes < 10) {
      		mes = "0" + mes;
    	}
  
    	var dataFormatada = dia + "/" + mes + "/" + ano;
			
			$("#data_tarefa_"+id).html(dataFormatada);
		
		});
		}
	</script>
	
		<table>
			<tr>
				<th>Id</th>
				<th>Descrição</th>
				<th>Finalizado?</th>
				<th>Data de finalização</th>
			</tr>
			<c:forEach items="${tarefas}" var="tarefa">
			<tr>
				<td>${tarefa.id}</td>
				<td>${tarefa.descricao}</td>
					<c:if test="${tarefa.finalizado eq false}">
						<td id="tarefa_${tarefa.id}">
							<a href="#" onClick="finalizaAgora(${tarefa.id})"> Finaliza agora!</a>
						</td>
					</c:if>
		<c:if test="${tarefa.finalizado eq true}">
			<td>Finalizado</td>
		</c:if>
				<td id="data_tarefa_${tarefa.id}">
					<fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern="dd/MM/yyyy"/>
				</td>
					<td> <a href="mostraTarefa?id=${tarefa.id}"> Alterar </a>  </td>
					<td> <a href="removeTarefa?id=${tarefa.id}"> Remover </a> </td>
				</tr>
			</c:forEach>
		</table>
		<br /> <br />
		<a href="novaTarefa">Criar nova tarefa </a>	
	</body>
</html>

Como podem ver a essa jsp tem o link para remoção de tarefas: Remover

E esse é o meu controller (Spring MVC)
package br.com.caelum.tarefas.controller;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;

import br.com.caelum.jdbc.dao.TarefaDAO;
import br.com.caelum.tarefas.model.Tarefa;

@Controller
public class TarefasController {
	
	@RequestMapping("listaTarefas")
	public String lista(Model model){
		TarefaDAO dao = new TarefaDAO();
		model.addAttribute("tarefas", dao.lista());
		return "tarefa/lista";
	}
	
	@RequestMapping("removeTarefa")
	public String remove(Tarefa tarefa) {
		TarefaDAO dao = new TarefaDAO();
		System.out.println("Algo da tarefa: " + tarefa.toString());
		dao.remove(tarefa);
		return "redirect:listaTarefas";
	}
	
}

Como podem ver nesse controller, no método que mapeia a requisição removeTarefa recebe como parametro um objeto Tarefa, que é usado para realizar o delete no banco a partir do atributo id da Tarefa (tarefa.getId()). Ele funciona certinho.

Ai está a minha grande dúvida: como e onde esse objeto é populado (recebendo o id correto)?
Preciso entender isso pra poder tocar o estudo pra frente.

Se não fui muito claro, é só falar que tento explicar melhor.

Muito obrigado desde já, abraços.

4 Respostas

ERVER

Acho que entendi: o spring passa o valor do id (através do link) para o objeto Tarefa (por reflexão).

Se não for isso, por favor, me corrijam.

Abraços.

L

Realmente é por reflexão. O que o framework faz é pegar os campos da requisição, ou seja, o que vem da jsp e comparar com as variáveis, se o nome for igual, ele sabe que o atributo da requisição corresponde a variável do bean.

ERVER

Muito obrigado, lincolnti.

Abraço.

juninhodg

Ressucitando o tópico kk. Estava com essa mesma dúvida. Vocês sabem na documentação do Spring onde tem explicando esse processo com mais detalhes? Ainda estou meio confuso com ele :s

Criado 6 de agosto de 2012
Ultima resposta 22 de nov. de 2012
Respostas 4
Participantes 3