Vraptor - CRUD Básico

8 respostas
bacofrb

É o seguinte: Quando eu estou editando o “montador” e quero atualizar, ele simplesmente regarrega a página (na verdade está executando o método editar, que carrega os dados do montador.

Segue abaixo o código fonte:

package br.com.indados.mvmontagem.controller;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

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.indados.inguard.domain.SessaoUsuario;
import br.com.indados.mvmontagem.entity.Funcionario;
import br.com.indados.mvmontagem.entity.Montador;
import br.com.indados.mvmontagem.entity.Montadora;
import br.com.indados.mvmontagem.entity.StatusMontador;
import br.com.indados.mvmontagem.entity.StatusMontadora;
import br.com.indados.mvmontagem.repository.MontadorRepository;
import br.com.indados.mvmontagem.repository.MontadoraRepository;
import br.com.indados.mvmontagem.util.MvmontagemUtil;
import br.com.indados.mvmontagem.web.DisplayTag;
import br.com.indados.mvmontagem.web.DisplayTagComponent;

@Resource
public class MontadorController {
	
	private Result result;
	private SessaoUsuario sessaoUsuario;
	private MontadorRepository montadorRepository;
	private DisplayTagComponent displayTag;
	private MontadoraRepository montadoraRepository;

	public MontadorController(
			Result result, 
			SessaoUsuario sessaoUsuario,
			MontadorRepository montadorRepository,
			DisplayTagComponent displayTagComponent,
			MontadoraRepository montadoraRepository) {
		this.result = result;
		this.sessaoUsuario = sessaoUsuario;
		this.montadorRepository = montadorRepository;
		this.displayTag = displayTagComponent;
		this.montadoraRepository = montadoraRepository;
	}
	
	@PostConstruct
	public void init() {
		this.result.include("statusMontadorList",StatusMontador.values());
		this.result.include("montadoraList", montadoraRepository.obter(new Montadora(StatusMontadora.ATIVO)));
		Map<String, Object> map = this.result.included();
		Montador montador = (Montador) map.get("montador");
		if (montador == null) {
			montador = new Montador();
		}
		boolean admin = MvmontagemUtil.hasPapelAdmin(this.sessaoUsuario.getUsuarioLogado());
		if (!admin) {
			montador.setMontadora(new Montadora(102L));
		}
		
		this.result.include("montador", montador);
		this.result.include("disabledMontadoraCombo", admin ? "": "disabled" );
	}
	

	@Get
	@Path("/montador/")
	public void form() {
		
	}

	@Get
	@Path("/montador/pesquisa/")
	@DisplayTag("montadorTable")
	public void pesquisar(Montador montador, Integer page) {
		List<Montador> montadorList = this.montadorRepository.obter(montador, this.displayTag.begin(page), this.displayTag.end(page));
		Integer montadorListSize = this.montadorRepository.obterCount(montador);
		this.result.include("montadorList", montadorList);
		this.result.include("montadorListSize", montadorListSize);
		this.result.include("statusMontadorList",StatusMontador.values());
		this.result.include("montadoraList", montadoraRepository.obter(new Montadora(StatusMontadora.ATIVO)));
		this.result.forwardTo(MontadorController.class).form();
	}

	@Get
	@Path(value="/montador/novo/")
	public void editar() {
		this.result.include("disabledCodigo", "disabled" );
		this.result.include("method", "POST");
	}
	
	@Get
	@Path(value="/montador/{id}/")
	public void editar(Long id) {
		System.out.println("editar");
		Montador montador = this.montadorRepository.obterUnico(new Montador(id));
		this.result.include("montador", montador);
		this.result.include("method", "PUT");
	}
	
	@Post
	@Path(value="/montador/")
	public void inserir(Montador montador) {
		montador.setFuncionarioCadastro(new Funcionario(this.sessaoUsuario.getUsuarioLogado().getCodigo()));
		montador.setDtCadastro(new Date());
		this.montadorRepository.inserir(montador);
		this.result.forwardTo(MontadorController.class).form();
	}
	
	@Put
	@Path(value="/montador/{montador.id}/")
	public void atualizar(Montador montador) {
		System.out.println("atualizar");
		montador.setFuncionarioAtualizacao(new Funcionario(this.sessaoUsuario.getUsuarioLogado().getCodigo()));
		montador.setDtAtualizacao(new Date());
		this.montadorRepository.atualizar(montador);
		this.result.forwardTo(MontadorController.class).form();
	}
	
	@Delete
	@Path(value="/montador/{montador.id}/")
	public void excluir(Montador montador) {
		System.out.println("excluir");
		this.montadorRepository.excluir(montador);
		this.result.forwardTo(MontadorController.class).form();
	}
}

editar.jsp

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://displaytag.sf.net" prefix="display"%>
<body>
<form id="pesquisaForm" action="<c:url value="/montador/${montador.id}" />" method="POST">
  <table>
    <c:if test="${method eq 'PUT'}">
      <tr>
        <td><label for="montador.id">Código:</label></td>
        <td><input type="text" name="montador.id" id="montador.id" value="${montador.id}" readonly="readonly"/></td>
      </tr>
    </c:if>
    <tr>
      <td><label for="montador.cpf">Cpf:</label></td>
      <td><input type="text" name="montador.cpf" id="montador.cpf" value="${montador.cpf}" /></td>
    </tr>
    <tr>
      <td><label for="montador.nome">Nome:</label></td>
      <td><input type="text" name="montador.nome" id="montador.nome" value="${montador.nome}" /></td>
    </tr>
    <tr>
      <td><label for="montador.status">Status:</label></td>
      <td>
        <select name="montador.status" id="montador.status">
          <option label="Selecione" value=""/>
          <c:forEach items="${statusMontadorList}" var="status">
             <option label="${status.descricao}" value="${status.id}" ${status.id eq montador.status.id ? 'selected':''}/>
          </c:forEach>
        </select>
      </td>
    </tr>
    <tr>
      <td><label for="montador.montadora.combo">Montadora:</label></td>
      <td>
        <select id="montador.montadora.combo" 
          onchange="javascript: document.getElementById('montador.montadora.id').value = this.value;" ${disabledMontadoraCombo}>
          <option label="Selecione" value=""/>
          <c:forEach items="${montadoraList}" var="montadora">
             <option label="${montadora.descricao}" value="${montadora.id}" ${montadora.id eq montador.montadora.id ? 'selected':''}/>
          </c:forEach>
        </select>
        <input type="hidden" id="montador.montadora.id" name="montador.montadora.id" value="${montador.montadora.id}" />
        </td>
      </tr>
    </table>
  <input type="hidden" id="_method" name="_method" value="${method}" />
  <input type="submit" value="Salvar" />
</form>
</body>

Aparentemente esse lance dos method não está funfando. Já testei no IE, Chrome e FF e nada. Alguem pode me ajudar!?

8 Respostas

Lucas_Cavalcanti

a variável ${method} está preenchida? quem preenche ela?

bacofrb

Está sendo preenchida sim. Quem preenche é o método editar(Long id).

@Get @Path(value="/montador/{id}/") public void editar(Long id) { System.out.println("editar"); Montador montador = this.montadorRepository.obterUnico(new Montador(id)); this.result.include("montador", montador); this.result.include("method", "PUT"); }

Lucas_Cavalcanti

no html gerado aparece o metodo PUT direitinho?

(abra a edição, e veja o código fonte da página)

tenta tirar o espaço do id do input hidden tb

bacofrb

Sim, no html aparece o PUT direitinho.

E já removi o atributo id do hidden e nada…

Lucas_Cavalcanti

habilita o log de debug do vraptor e posta aqui (ou no pastebin.org) o resultado da requisição problemática

bacofrb

14:24:49,767 INFO [STDOUT] 14:24:49,767 DEBUG [VRaptor ] VRaptor received a new request 14:24:49,771 INFO [STDOUT] 14:24:49,771 DEBUG [DefaultRequestExecution] executing stack DefaultRequestExecution 14:24:49,787 INFO [STDOUT] 14:24:49,787 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 14:24:49,787 INFO [STDOUT] 14:24:49,787 DEBUG [DefaultResourceTranslator] trying to access /montador/8743 14:24:49,787 INFO [STDOUT] 14:24:49,787 DEBUG [VRaptorRequest ] Setting montador.id with [8743] 14:24:49,792 INFO [STDOUT] 14:24:49,792 DEBUG [VRaptor ] VRaptor ended the request 14:24:49,796 INFO [STDOUT] 14:24:49,796 DEBUG [VRaptor ] VRaptor received a new request 14:24:49,801 INFO [STDOUT] 14:24:49,801 DEBUG [DefaultRequestExecution] executing stack DefaultRequestExecution 14:24:49,815 INFO [STDOUT] 14:24:49,815 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor 14:24:49,815 INFO [STDOUT] 14:24:49,815 DEBUG [DefaultResourceTranslator] trying to access /montador/8743/ 14:24:49,815 INFO [STDOUT] 14:24:49,815 DEBUG [VRaptorRequest ] Setting id with [8743] 14:24:49,815 INFO [STDOUT] 14:24:49,815 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: MontadorController.editarMontadorController.editar(Long)] 14:24:49,817 INFO [STDOUT] 14:24:49,817 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor 14:24:49,819 INFO [STDOUT] 14:24:49,819 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor 14:24:49,823 INFO [STDOUT] 14:24:49,823 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor NoCacheInterceptor 14:24:49,823 INFO [STDOUT] 14:24:49,823 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor ControleAcessoInterceptor 14:24:49,830 INFO [STDOUT] 14:24:49,830 DEBUG [InstantiatedInterceptorHandler] Invoking interceptor InstantiateInterceptor 14:24:49,983 INFO [STDOUT] 14:24:49,983 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor 14:24:49,983 INFO [STDOUT] 14:24:49,983 DEBUG [OgnlParametersProvider] Applying id with [8743] 14:24:49,984 INFO [STDOUT] 14:24:49,984 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for MontadorController.editar(Long) as [id] 14:24:49,985 INFO [STDOUT] 14:24:49,985 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: MontadorController.editarMontadorController.editar(Long)] are [8743] 14:24:49,992 INFO [STDOUT] 14:24:49,992 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor 14:24:49,992 INFO [STDOUT] 14:24:49,992 DEBUG [ExecuteMethodInterceptor] Invoking MontadorController.editar(Long) 14:24:49,992 INFO [STDOUT] editar 14:24:50,001 INFO [STDOUT] 14:24:50,001 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor OutjectResult 14:24:50,004 INFO [STDOUT] 14:24:50,004 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor 14:24:50,004 INFO [STDOUT] 14:24:50,004 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic 14:24:50,011 INFO [STDOUT] 14:24:50,011 DEBUG [DefaultPageResult ] forwarding to /WEB-INF/jsp/montador/editar.jsp 14:24:50,012 INFO [STDOUT] 14:24:50,012 DEBUG [DefaultStaticContentHandler] Deferring request to container: /mvmontagem/WEB-INF/jsp/montador/editar.jsp 14:24:50,021 INFO [STDOUT] 14:24:50,021 DEBUG [VRaptor ] VRaptor ended the request

Ele imprime exatamente isto ao clicar no botão “Salvar”

Lucas_Cavalcanti

faltou uma / no final da action do seu form:

action="<c:url value="/montador/${montador.id}/" />"

o problema é q se vc deixa sem a barra ele faz um redirect pra com a barra, só que o redirect é sempre GET.

bacofrb

foi exatamente isso!! resolvido! muito obrigado !!

Criado 6 de dezembro de 2010
Ultima resposta 7 de dez. de 2010
Respostas 8
Participantes 2