Metodo PUT não funciona

Boa tarde a todos…
Gostaria de uma ajuda… tenho um método de alteração de formolario, anotado como PUT, só que o programa não está conseguindo encontrá-lo…
Quando eu chamo o método clicando no meu botão “Alterar”, ele retorna um 404… ja olhei a documentação e vi em apostilas da Caelum, e não estou encontrando o erro, pelo menos parece que estou fazendo certo… será que alguém pode me ajudar?

Segue abaixo os códigos:

JSP:

<%@page contentType="text/html" pageEncoding="ISO-8859-1"%>
<%@page import="java.text.SimpleDateFormat,java.util.Date "%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<link href="<c:url value="/javascripts/jquery.autocomplete.css"/>"
	rel="stylesheet" type="text/css" media="screen" />
<script type="text/javascript"
	src="<c:url value="/javascripts/jquery-1.3.2.min.js"/>"></script>
<script type="text/javascript"
	src="<c:url value="/javascripts/jquery.validate.min.js"/>"></script>
<script type="text/javascript"
	src="<c:url value="/javascripts/jquery.autocomplete.min.js"/>"></script>
<script type="text/javascript"
	src="<c:url value="/javascripts/jquery.puts.js"/>"></script>
<fmt:setLocale value="pt_br" />


<form action="<c:url value="/temposDiarios/${temposDiarios.id}"/>" method="POST">

<table>
	<thead>
		<tr>
			<th>Dia</th>
			<th>Mes</th>
			<th>Ano</th>
		</tr>
	</thead>
	<tbody>
	<tr>
		<td>
			<label for="dia"></label>
			<input id="dia" name="tempoDiario.dia" value="${tempoDiario.dia}" maxlength="2" style=" width : 76px;"></input>
		</td>
		<td>
			<label for="mes"></label>
			<input id="mes" type="text" name="tempoDiario.mes" value="${tempoDiario.mes}" maxlength="2" style=" width : 76px;"></input>
		</td>
		<td>
			<label for="ano"></label>
			<input id="ano" type="text" name="tempoDiario.ano" value="${tempoDiario.ano}" maxlength="4" style=" width : 76px;"></input>
		</td>
	</tr>
	</tbody>
</table>
<table>
	<thead>
	 <tr>
		<th>Entrada</th>
		<th>Saida</th>
		
	 </tr>
    </thead>
	<tbody>
		<tr>
			<td>
			<label for="entrada1"></label>
			<input id="entrada1" type="text" name="tempoDiario.entrada1" value="${tempoDiario.entrada1}" maxlength="4" />
			</td>
			<td>
			<label for="saida1"></label>
			<input id="saida1" type="text" name="tempoDiario.saida1" value="${tempoDiario.saida1}" maxlength="4"/>
			</td>
			</tr>
			<tr>
			<td>
			<label for="entrada2"></label>
			<input id="entrada2" type="text" name="tempoDiario.entrada2" value="${tempoDiario.entrada2}" maxlength="4"/>
			</td>
			<td>
			<label for="saida2"></label>
			<input id="saida2" type="text" name="tempoDiario.saida2" value="${tempoDiario.saida2}" maxlength="4"/>
			</td>
			</tr>
			<tr>
			<td>
			<label for="entrada3"></label>
			<input id="entrada3" type="text" name="tempoDiario.entrada3" value="${tempoDiario.entrada3}" maxlength="4"/>
			</td>
			<td>
			<label for="saida3"></label>
			<input id="saida3" type="text" name="tempoDiario.saida3" value="${tempoDiario.saida3}"maxlength="4"/>
			</td>
		</tr>
	</tbody>	
		
</table>
		<table>
			<thead>
				<tr>Observações:</tr>
			</thead>
				<tbody>
					<tr>
					<td><label for="obs"></label>
					</tr>
				</tbody>
		</table>
		<table>
			<thead>
			<tr>
				<th></th>
				<th>Saldo:</th>
				
			</tr>
			</thead>
			<tbody>
				<tr>
					<td><label for="sinal" ></label>
					<input id="sinal"  border="none" readonly="readonly" type="text" name="tempoDiario.sinal" value="${tempoDiario.sinal }" maxlength="1" style=" width : 14px;"/>
					</td>
					<td><label for="saldo"></label>
					<input id="saldo" readonly="readonly" type="text" name="tempoDiario.saldo" value="${tempoDiario.saldo }" style=" width : 136px;"/>
					</td>
				</tr>
			</tbody>
			
		</table>

<button type="submit" name="_method" value="PUT">Alterar</button>


</form>

Controller:

import static br.com.caelum.vraptor.view.Results.page;

import java.util.GregorianCalendar;
import java.util.List;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;


import br.com.metha.registroDiario.dao.TempoDiarioDAO;
import br.com.metha.registroDiario.modelo.Colaborador;
import br.com.metha.registroDiario.modelo.TempoDiario;

@Resource
public class TemposDiariosController {

	private final TempoDiarioDAO dao;
	private final Result result;
	private final Validator validator;
	
	public TemposDiariosController(TempoDiarioDAO dao, Result result, Validator validator){
		this.dao = dao;
		this.result = result;
		this.validator = validator;
	}
	
	public List<TempoDiario> lista(){
		//Colaborador colaborador = new Colaborador();
		//colaborador.setId(999);
		
				
		return dao.listaTudo();
	}
	@Post @Path("/temposDiarios")
	public void adiciona(final TempoDiario tempoDiario){

		tempoDiario.setUltimaAtualizacao(new GregorianCalendar().getTime());
		tempoDiario.setColaborador(999);
		
		Colaborador colaborador = new Colaborador();
		colaborador.setId(999);
		tempoDiario.setCodColaborador(colaborador);
		tempoDiario.setCodDia(1.0);
		tempoDiario.setDataInclusao(new GregorianCalendar().getTime());
		tempoDiario.setResponsavelInclusao(999);
		tempoDiario.setSaldo(tempoDiario.calcularSaldo());
		tempoDiario.setTotal(tempoDiario.getTempoTrabalhado());
		
		validator.checking(new Validations(){{
			that(tempoDiario.getEntrada1().length() == 4 || tempoDiario.getEntrada1().length() == 0,
			"Entrada 1","entrada1.obrigatorio");
			that(tempoDiario.getEntrada2().length() == 4 || tempoDiario.getEntrada2().length() == 0,
			"Entrada 2","entrada2.obrigatorio");
			that(tempoDiario.getEntrada3().length() == 4 || tempoDiario.getEntrada3().length() == 0,
			"Entrada 3","entrada3.obrigatorio");
			that(tempoDiario.getSaida1().length() == 4 || tempoDiario.getSaida1().length() == 0,
			"Saida 1","saida1.obrigatorio");
			that(tempoDiario.getSaida2().length() == 4 || tempoDiario.getSaida2().length() == 0, 
			"Saida 2","saida2.obrigatorio");
			that(tempoDiario.getSaida3().length() == 4 || tempoDiario.getSaida3().length() == 0,
			"Saida 3","saida3.obrigatorio");
			}});
		validator.onErrorUse(page()).of(TemposDiariosController.class).formulario(); 
				
		dao.salva(tempoDiario);
		result.redirectTo(TemposDiariosController.class).adicionado();
	}
	public void adicionado(){
		
	}
	
	public void formulario(){
		
	}
	public void buscador(){
		
	}
	
	@Get @Path("/temposDiarios/{id}")
	public TempoDiario visualiza(Integer id){
		return dao.carrega(id);
		
	}
	
	@Put @Path("/temposDiarios/{tempoDiario.id}")
	public void altera(TempoDiario tempoDiario){
		

		tempoDiario.setColaborador(999);
		dao.atualiza(tempoDiario);
		result.redirectTo(TemposDiariosController.class).lista();
	}
	
	@Get @Path("/temposDiarios/{id}/editar")
	public TempoDiario edita(Integer id){
		return dao.carrega(id);
	}
	
	@Delete @Path("/temposDiarios/{id}")
	public void remove(Integer id){
		TempoDiario tempoDiario = dao.carrega(id);
		dao.remove(tempoDiario);
		result.redirectTo(TemposDiariosController.class).lista();
		System.out.println(id);
	}
	@Get @Path("/temposDiarios/{id}/cadastraAtividade")
	public void cadastraAtividade(Integer id){
		TempoDiario tempoDiario = dao.carrega(id);
		result.redirectTo(AtividadesDiariasController.class).formulario(tempoDiario);
		System.out.println(id);
	}


	public List<TempoDiario> buscaRD(final Integer colaborador){
		
		return  dao.buscaRD(colaborador);
}
}

Você informou method=“POST” na tag do seu HTML…

Tente remover isso, ou mudar para PUT.

[quote=lscosta]Você informou method=“POST” na tag do seu HTML…

Tente remover isso, ou mudar para PUT.
[/quote]

Browsers só suportam POST e GET. Para isso o vraptor usa o artifício de colocar um parametro _method=XXX para usar os verbos http. O colega fez certo usando na linha 119 do JSP dele:

Na verdade, ali é POST mesmo, pq é ele que vai trazer as informações pra popular o form… o meu problema é quando eu saio do form, ele não encontra meu método altera no meu controller…

Pois é, Garcia… por isso não estou entendendo porque ele está me trazendo esse erro 404…

se vc está usando o Internet Explorer pra testar a sua aplicação, o:

<button type="submit" name="_method" value="PUT">Alterar</button>

não vai funcionar…
troque isso por:

<input type="hidden" name="_method" value="PUT" />
<input type="submit" value="Alterar" />

e mais uma coisa: em qual URI está dando o 404?

Lucas, tentei o outro método que vc passou e continuou dando o mesmo erro…
o 404 esta dana nessa URI aqui:
/registroDiario/temposDiarios/

então quer dizer que nessa linha:

<form action="<c:url value="/temposDiarios/${temposDiarios.id}"/>" method="POST">  

${temposDiarios.id} tá vindo vazio… não seria ${tempoDiario.id} o certo?

Realmente, Lucas… foi muita falta de atenção minha nessa linha mesmo… Obrigado mesmo!