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

JSTL(forEach) não funciona

Já vi que isso é uma dúvida recorrente mas não consegui encontrar solução, o forEach do meu código não gera uma lista de labels e inputs. Ao invés disso é criada somente uma div com label de nome: ${tipoPreco}.

Código jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Casa do Código</title>
</head>
<body>
    <form action="/casadocodigo/produtos" method="POST">
        <div>
            <label>Título</label> <input type="text" name="titulo" />
        </div>
        <div>
            <label>Descrição</label>
            <textarea rows="10" cols="20" name="descricao"></textarea>
        </div>
        <div>
            <label>Páginas</label> <input type="text" name="paginas" />
        </div>
        <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">
            <div>
                <label>${tipoPreco}</label> 
                <input type="text" name="precos[${status.index }].valor"/>
                <input type="hidden" name="precos[${status.index }].tipoDePreco"/>
            </div>

        </c:forEach>
        <button type="submit">Cadastrar</button>
    </form>
</body>
</html>

Código do Controller:

package br.com.casadocodigo.loja.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.casadocodigo.loja.daos.ProdutoDAO;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;

@Controller
public class ProdutosController {

    @Autowired
    private ProdutoDAO dao;

    @RequestMapping("/produtos/form")
    public ModelAndView form() {

        ModelAndView modelAndView = new ModelAndView("produtos/form");
        System.out.println(TipoPreco.values().length);
        modelAndView.addObject("tipos", TipoPreco.values());

        return modelAndView;
    }

    @RequestMapping("/produtos")
    public String grava(Produto produto) {
        System.out.println(produto);

        dao.gravaNoBanco(produto);

        return "/produtos/ok";
    }

    @RequestMapping("/produtos/lista")
    public String lista() {
        return "/produtos/lista";
    }
}

Classe Produto:

package br.com.casadocodigo.loja.models;

import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Produto {

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String titulo;
    private String descricao;
    private String paginas;

    @ElementCollection
    private List<Preco> precos;


    public List<Preco> getPrecos() {
        return precos;
    }

    public void setPrecos(List<Preco> precos) {
        this.precos = precos;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getPaginas() {
        return paginas;
    }

    public void setPaginas(String paginas) {
        this.paginas = paginas;
    }

    @Override
    public String toString() {
        return "Produto [titulo=" + titulo + ", descricao=" + descricao + 
                    ", paginas=" + paginas + "]";
    }

}

Enum:

package br.com.casadocodigo.loja.models;

public enum TipoPreco {

    EBOOK,IMPRESSO,COMBO;

}
4 respostas

Oi Gabriel, tudo bem?

Geralmente esse erro acontece quando o servidor não está habilitado para interpretar a expression language. Você pode postar aqui o código do seu web.xml? Caso exista um no projeto.

Se tiver um, confere se a tag de abertura está parecida com essa:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
</web-app>

Fico esperando sua resposta. Nas versões mais antigas de servidores, ou quando o web.xml é declarado sugerindo o uso de uma versão mais antiga, a expression language fica desabilitada por default.

Meu arquivo web-app estava da forma a seguir.

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

Porém, copiando o arquivo que você deu como exemplo, o problema persistiu.

Oi Gabriel, então acho que o problema é esse mesmo :). A versão apontada no seu web.xml é super antiga e aí faz com que o servidor se comporta de forma antiga também. Tenta trocar o conteúdo do seu web.xml pelo que eu te indiquei :).

solução!

Procurei em vários fóruns e achei uma incompatibilidade do plugin do tomcat no Eclipse com a tag " ". Achei estranho, mas quando tirei essa tag do meu JSP a Expression Language funcionou normalmente. Espero que ajude outras pessoas que passem pelo mesmo problema.