Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

15
respostas

erro 500

http://localhost:8080/produtos/produto/lista

type Exception report

message org.apache.jasper.JasperException: /WEB-INF/jsp/produto/lista.jsp (line: 34, column: 1) Attribute varstatus invalid for tag forEach according to TLD

description The server encountered an internal error that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.view.ResultException: org.apache.jasper.JasperException: /WEB-INF/jsp/produto/lista.jsp (line: 34, column: 1) Attribute varstatus invalid for tag forEach according to TLD
    br.com.caelum.vraptor.view.DefaultPageResult.forward(DefaultPageResult.java:69)
    br.com.caelum.vraptor.extra.ForwardToDefaultViewInterceptor.intercept(ForwardToDefaultViewInterceptor.java:59)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.OutjectResult.intercept(OutjectResult.java:65)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:75)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
    br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.produtos.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:34)
    br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
    br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
    br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
    br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
15 respostas

Fala ai Thiago, tudo bem ?

Consegue mostrar sua página ? Parece teve algum probleminha lá.

Então deve haver, eu estou aprendendo agora, mas acho, ACHO...:) que segui certinho, só que como ele está fazendo agora tem vários warnings:

    <%@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>

        <c:forEach var="p" items="${produtoList}" varstatus="st">
                <tr id="produto${p.id}">
                <td>${st.count}</td>
                <td>${p.nome}</td>
                <td>${p.preco}</td>
                <td>${p.descricao}</td>
                <td>${p.dataInicioVenda.time}</td>
                <c:choose>
                </c:choose>
                <td><a href="#" onclick="return removeProduto(${p.remove})">Remover</a></td>
                </tr>
        </c:forEach>
        </table>
        <a href="/produtos/produto/formulario">Adicionar um produto</a>
    </body>
    </html>

Olá Thiago,

td bom? Pelo que percebi você usou um atributo inexistente. Foi esse o erro mostrado na sua stacktrace.

Acontece que na verdade o atributo tem o S maiúsculo: varStatus e não varstatus.

Testa aí e nos fale se deu certo.

Abraços

Complementando o que disse... Você pode dar uma olhada na documentação da tag ForEach da JSTL aqui:

https://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/c/forEach.html

Abraços

depois que eu enviei , eu achei esse erro e corrigi, mas o erro persiste, ele abre a tela : http://localhost:8080/produtos/ e a http://localhost:8080/produtos/login/formulario mas nesta segunda quando eu faço a inserção do login e senha "teste" e "teste" ele entra no mesmo erro 500.

Eu só tenho 2 warnings no projeto: na classe HibernateUtil:

package br.com.caelum.produtos.dao;

import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.tool.hbm2ddl.SchemaExport;

import br.com.caelum.produtos.modelo.Produto; import br.com.caelum.produtos.modelo.Usuario;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {

AnnotationConfiguration configuration = new AnnotationConfiguration(); configuration.addAnnotatedClass(Produto.class); configuration.addAnnotatedClass(Usuario.class); sessionFactory = configuration.buildSessionFactory();

}

public Session openSession() { return sessionFactory.openSession(); } }


e no xml "log4.xml

Pode postar a JSP que você usa para inserir e o controlador?

ainda não alteramos nada neles:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="caelum"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="<c:url value="/js/jquery.js"/>"></script>
<script type="text/javascript" src="<c:url value="/js/jquery-ui.js"/>"></script>
<link type="text/css" href="<c:url value="/css/jquery.css"/>" rel="stylesheet" />
<title>Insert title here</title>
</head>
<body>
    <form action="<c:url value="/produto/adiciona"/>">
        Nome: <input name="produto.nome" /><br /> 
        Descricao: <input name="produto.descricao" /><br />
        Preço: <input name="produto.preco" /><br />
        Data de início da venda: <caelum:campoData id="dataInicioVenda" name="produto.dataInicioVenda" /><br />
        <input type="submit" />
    </form>
</body>
</html>

package br.com.caelum.produtos.controller;

import java.util.Calendar;

import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

import br.com.caelum.produtos.component.UsuarioLogado;
import br.com.caelum.produtos.dao.HibernateUtil;
import br.com.caelum.produtos.dao.UsuarioDao;
import br.com.caelum.produtos.modelo.Produto;
import br.com.caelum.produtos.modelo.Usuario;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class LoginController {
    private UsuarioDao dao;
    private UsuarioLogado usuarioLogado;
    private Result result;

    public LoginController(UsuarioDao dao, UsuarioLogado usuarioLogado,    Result result) {
        this.dao = dao;
        this.usuarioLogado = usuarioLogado;
        this.result = result;
    }

    public void autentica(Usuario usuario){
        Usuario autenticado = dao.buscaUsuarioPorLoginESenha(usuario);
        if (autenticado != null){
            usuarioLogado.efetuaLogin(autenticado);
            result.redirectTo(ProdutoController.class).lista();
            return;
        }
        result.redirectTo(LoginController.class).formulario();
    }

    private static void criaUsuarioEProduto() {
        Usuario usuario = new Usuario();
        usuario.setLogin("teste");
        usuario.setSenha("teste");
        Session session = new HibernateUtil().openSession();
        session.beginTransaction();
        session.save(usuario);
        session.save(produto("Geladeira", "Geladeira linda", 500.0, true));
        session.save(produto("Fogão", "Brastemp", 250.4, false));
        session.save(produto("XBOX", "Videogame da Microsoft", 150.0, true));
        session.save(produto("Celular Samsung", "S3 Novo em folha", 1500.0, false));

        session.getTransaction().commit();
        session.close();

    }

    private static Produto produto(String nome, String descricao, double preco, boolean usado) {
        Produto produto = new Produto();
        produto.setDataInicioVenda(Calendar.getInstance());
        produto.setDescricao(descricao);
        produto.setNome(nome);
        produto.setPreco(preco);
        produto.setUsado(usado);
        return produto;
    }

    public void formulario() {
        AnnotationConfiguration cfg = new AnnotationConfiguration();
        cfg.addAnnotatedClass(Produto.class);
        cfg.addAnnotatedClass(Usuario.class);
        new SchemaExport(cfg).create(true, true);
        criaUsuarioEProduto();
    }

}

Posta o seu ProdutoController... Outra coisa como dica é sempre formatar com o código entre: ```

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

}

//Não entendi, onde formatar entre "?

Oi THiago,

a formatação é para ajudar aqui no fórum. Estou editando suas mensagens para o seu código ficar em formato de código msm. Isso é feito com:

``` seu código vai entre eles ```

Voltando ao seu erro, percebi que você injeta no result uma "lista":

 public List<Produto> lista() {
        //AQUI
        result.include("lista", dao.lista());
        return dao.lista();
    }

Mas na JSP acessa como produtoList:

<c:forEach var="p" items="${produtoList}" varstatus="st">

Modifica um dos dois e testa aí... Não esquece de subir seu projeto. Para garantir também...dê um clean no projeto antes de subir.

Abraços

Fiz a alteração no jsp, mas persiste o problema, mesmo comportamento.


    <%@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>

        <c:forEach var="p" items="${lista}" varStatus="st">
                <tr id="produto${p.id}">
                <td>${st.count}</td>
                <td>${p.nome}</td>
                <td>${p.preco}</td>
                <td>${p.descricao}</td>
                <td>
                <fmt:formatDate value="${p.dataInicioVenda.Time }" pattern="dd/mm/yyyy"/>
                </td>
                <c:choose>

                <c:when test="${p.usado}">
                <td>Sim</td>
                </c:when>
                <c:otherwise>
                <td>Nao</td>
                </c:otherwise>
                </c:choose>
                <td><a href="#" onclick="return removeProduto(${p.remove})">Remover</a></td>
                </tr>
        </c:forEach>
        </table>
        <c:url value="/produto/formulario" var="linkNovoProduto"/>
        <a href="${linkNovoProduto}">Adicionar um produto</a>
    </body>
    </html>

Oi Thiago,

tenta colocar o import da taglib como primeira instrução da sua JSP:

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

não rolou. :( Muitas coisa nos cursos, exigem configurações, versões e outras questões que não são apresentadas, isso seria legal que tivesse na plataforma, nem que fosse em um documento separado... "IDE versão x, | y", "configuração x|y". Já tive três casos que tive que ficar caçando, onde estava. O aluno perde um tempo precioso nisso. Sei que a Alura não tem como prever as configurações de software do que está instalado na máquina do aluno, mas pra quem está iniciando em desenvolvimento é difícil. M as obrigado pelo seu auxílio Fabio. Depois eu vou voltar no curso reinstalar todos os pacotes, tentar com outra máquina, o curso de Mysql também não estou conseguindo prosseguir por erro, ontem aconteceu no de Servlet... Paciência, depois eu tento com mais calma ver se é alguma config.

Depois Thiago, coloca seu projeto em algum lugar(drive, dropbox) e passa o link aqui. O erro não pode ser o mesmo lá de trás :(

Abraços e não desanima não é assim mesmo que a gente aprende... quebrando a cabeça.