Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Uso correto do verbo @PUT

Olá, pelo que foi ensinado aqui no Alura e pelo que andei lendo, devemos utilizar o verbo @Put quando queremos atualizar um recurso. Navegando pela internet encontrei um exemplo que um cara utiliza o verbo @Put com Vraptor de uma forma diferente da qual eu já tinha visto até agora. Então a pergunta, esta forma de utilizar o @Put é correta?

@Resource
public class UsuarioController {

    private Result result;
    private UsuarioDao usuarioDao;

    public UsuarioController(Result result, UsuarioDao usuarioDao) {
        this.result = result;
        this.usuarioDao = usuarioDao;
    }

    @Get
    @Path("/usuario/novo")
    public void novo(Usuario usuario) {
        result.include("usuario", usuario);
    }

    @Post
    @Path("/usuario")
    public void salvar(Usuario usuario) {
        usuarioDao.salvar(usuario);

        result
            .include("usuarioList", usuarioDao.loadAll())
            .forwardTo("WEB-INF/jsp/usuario/listagem.jsp");

        // Poderia ser usado: result.redirectTo(this).listagem();
    }

    @Get
    @Path("/usuario")
    public List<Usuario> listagem() {
        return usuarioDao.loadAll();
    }

    @Put
    @Path("/usuario")
    public void editar(Usuario usuario) {
        Usuario entity = usuarioDao.loadById(usuario);
        result.redirectTo(this).novo(entity);
    }

    @Delete
    @Path("/usuario")
    public void remover(Usuario usuario) {
        usuarioDao.remover(usuario);
        result.redirectTo(this).listagem();
    }

}

e no jsp:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>http://wbotelhos.com.br</title>
    </head>
    <body>
        <a href="<c:url value='/usuario/novo'/>">Adicionar</a><br/>

        <table>
            <thead>
                <tr>
                    <th>Nome</th>
                    <th>Senha</th>
                    <th>E-mail</th>
                </tr>
            </thead>
            <tbody>
                <c:forEach items="${usuarioList}" var="item">
                    <tr>
                        <td>${item.nome}</td>
                        <td>${item.senha}</td>
                        <td>${item.email}</td>
                        <td>
                            <form action="<c:url value='/usuario'/>" method="post">
                                <input type='hidden' name='_method' value='put'/>
                                <input type='hidden' name='usuario.id' value='${item.id}'/>
                                <input type="submit" value="Editar"/>
                            </form>
                        </td>
                        <td>
                            <form action="<c:url value='/usuario'/>" method="post">
                                <input type='hidden' name='_method' value='delete'/>
                                <input type='hidden' name='usuario.id' value='${item.id}'/>
                                <input type="submit" value="Excluir"/>
                            </form>
                        </td>
                    </tr>
                </c:forEach>
            </tbody>
        </table>
    </body>
</html>
4 respostas

Opa, ele usou para editar um recurso, pq vc achou que foi diferente?

Olá Alberto, é que até hoje eu só tinha utilizado o método Put para efetivamente alterar o recurso no banco de dados.

<form action="/meuObjeto/alterar" method="post">
<input type="hidden" name="_method" value="put"/>
<input  type="submit" value="Alterar">
</form>
@Put("/meuObjeto/alterar")
public void alterar(MeuObjeto objeto){
meuRepositorio.atualizar(objeto);
}

No exemplo dele, ele usou o Put para fazer a navegação da página de listagem para a página de edição, por isso achei diferente

Posso ter interpretado mal "modificar um recurso" quando se fala em rest, como meu pensamento é muito voltado para o banco de dados, eu interpretei "modificar um recurso" como sendo um update do registro no banco

solução!

Eu tinha visto errado.. não fez sentido mesmo, vc tem razão :).