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.