2
respostas

De onde saiu a variável produtoList????

Minha dúvida não está relacionada ao JSTL, mas sim a maneira que o a página está acessando essa variável produtoList. Só para deixar claro, não tenho vivência com VRaptor. No controller está sendo passado para a página a variável lista, como no trecho de código a seguir:

package br.com.caelum.produtos.controller;
...
@Resource
public class ProdutoController {
    ...
    public List<Produto> lista() {
        //Se quiser mudar o nome do atributo é só includar no result com o nome diferente
        result.include("lista", dao.lista());
        return dao.lista();
    }
    ...
}

Mas na página o que está sendo utilizado é a variável produtoList:

        <c:forEach items="${produtoList}" var="p" varStatus="status">

            <tr id="produto${p.id}>">
                <td>${status.count}</td>
                <td>${p.nome}</td>
                <td>${p.preco}</td>
                <td>${p.descricao}</td>
                <td>${p.dataInicioVenda.time}</td>
                <td><a href="#" onclick="return removeProduto(${p.id})">Remover</a></td>
            </tr>
        </c:forEach>

Como o VRaptor faz essa mágica?

2 respostas

Oi Erick, tudo bem ?

Isso não devia estar funcionando.

Consegue mandar o código inteiro ?

É só baixar o jar do projeto conforme está no curso. Ja veio assim.

Baixe o projeto do curso, que está em http://s3.amazonaws.com/caelum-online-public/jstl/curso-jstl.zip.

A classe:

package br.com.caelum.produtos.controller;

import java.util.List;

import br.com.caelum.produtos.dao.ProdutoDao;
import br.com.caelum.produtos.modelo.Produto;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class ProdutoController {

    private Result result;
    private ProdutoDao dao;

    public ProdutoController(Result result, ProdutoDao produtoDao) {
        this.result = result;
        this.dao = produtoDao;
    }

    public List<Produto> lista() {
        //Se quiser mudar o nome do atributo é só includar no result com o nome diferente
        result.include("lista", dao.lista());
        return dao.lista();
    }

    public void adiciona(Produto produto) {
        dao.adiciona(produto);
        result.redirectTo(ProdutoController.class).lista();
    }

    public void formulario() {
    }

    public void remove(Produto produto) {
        dao.remove(produto);
        //removendo para utilizar AJAX na página
        //result.redirectTo(ProdutoController.class).lista();
    }

}

E o JPS:

<%@page import="br.com.caelum.produtos.modelo.Produto"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<head>
<script type="text/javascript" src="<c:url value="/js/jquery.js"/>"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <script type="text/javascript">
        function removeProduto(id){
            $("#mensagem").load('<c:url value="/produto/remove"/>' + '?produto.id=' + id);
            $("#produto" + id).remove();
        }
    </script>

    <h1>Produtos</h1>
    <div id="mensagem"></div>
    <table width="100%">
        <tr>
            <td width="20%">Nome</td>
            <td>Preco</td>
            <td>Descricao</td>
            <td>Data de Inicio da Venda</td>
            <td>Usado?</td>
            <td width="20%">Remover?</td>
        </tr>

        <%
            List<Produto> produtoList = (List<Produto>) request.getAttribute("produtoList");
            for(Produto p : produtoList) {
        %>

            <tr id="produto<%= p.getId() %>">
                <td><%= p.getNome().toUpperCase() %></td>
                <td><%= p.getPreco() %></td>
                <td><%= p.getDescricao() %></td>
                <td><%= p.getDataInicioVenda().getTime() %></td>
                <% if(p.isUsado()) { %>
                <td>Sim</td>
                <% } else { %>
                <td>Não</td>
                <% } %>
                <td><a href="#" onclick="return removeProduto(<%= p.getId() %>)">Remover</a></td>
            </tr>
        <%
            }
        %>
    </table>
    <a href="/produtos/produto/formulario">Adicionar um produto</a>
</body>
</html>

Ambos está assim no projeto, assim que baixamos. Não fiz nenhuma modificação no código. O mais engraçado é que funciona.