Metodo PUT não funciona

8 respostas
Lucas_Sorrentino

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);
}
}

8 Respostas

lscosta

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

Tente remover isso, ou mudar para PUT.

G

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

Tente remover isso, ou mudar para PUT.

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:

Lucas_Sorrentino

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…

Lucas_Sorrentino

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

Lucas_Cavalcanti

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_Sorrentino

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

Lucas_Cavalcanti

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?

Lucas_Sorrentino

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

Criado 14 de abril de 2010
Ultima resposta 14 de abr. de 2010
Respostas 8
Participantes 4