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

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

Esta é a minha view:

[code]<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<%@taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt” %>

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>
[/code]

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

E esse é o meu controller (Spring MVC)

[code]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";
}

}
[/code]

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.

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.

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.

Muito obrigado, lincolnti.

Abraço.

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