[Resolvido] forEach de JSTL

4 respostas
Edu_Valente

Boa noite. Estou tendo problemas em imprimir uma tabela com o forEach. O desse aplicativo é um Servlet já que eu preciso iniciar a aplicação com as propriedades do produto configuradas. A idéia da app é imprimir os dados do ArrayList products através do forEach (sem precisar escrever cada propriedade individualmente). Já tentei fazer com <c:out> mas também não deu certo. Products.txt é um arquivo que contém os dados do produto divididos por um ‘|’ e estes são pegos através de um StringTokenizer na classe ProductIO.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>CartServlet</servlet-name>
        <servlet-class>cart.CartServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ProductsServlet</servlet-name>
        <servlet-class>cart.ProductsServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CartServlet</servlet-name>
        <url-pattern>/cart</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ProductsServlet</servlet-name>
        <url-pattern>/products</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>products</welcome-file>
        </welcome-file-list>
</web-app>

ProductsServlet.java

package cart;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.ArrayList;

import data.ProductIO;
import business.Product;

public class ProductsServlet extends HttpServlet
{
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        HttpSession session = request.getSession();

        ArrayList<Product> products = 
                ProductIO.getProducts(
                session.getServletContext().getRealPath("WEB-INF/products.txt")); 
        session.setAttribute("products", products);
        
        String url = "/index.jsp";
        RequestDispatcher dispatcher =
                getServletContext().getRequestDispatcher(url);
        dispatcher.forward(request, response);        
    }
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        processRequest(request, response);
    }
    
    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        processRequest(request, response);
    }
    
    /**
     * Returns a short description of the servlet.
     */
    public String getServletInfo()
    {
        return "Short description";
    }
    // </editor-fold>
}

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Edu's Java Servlets and JSP</title>
</head>
<body>

<h1>CD list</h1>

<table cellpadding="5" border=1>

  <tr valign="bottom">
    <td align="left"><b>Description</b></td>
    <td align="left"><b>Price</b></td>
    <td align="left"></td>
  </tr>
   
  <c:forEach var = "product" items="${products}">
    <tr valign="top">
     <td>product.description</td>
    </tr>
  </c:forEach>
  
  <!-- o bloco acima deverá fazer o que está abaixo. -->
  <!--  
  <tr valign="top">
    <td>86 (the band) - True Life Songs and Pictures</td>
    <td>$14.95</td>
    <td><a href="<c:url value='/cart?productCode=8601' />">Add To Cart</a></td>
  </tr>

  <tr valign="top">
    <td>Paddlefoot - The first CD</td>
    <td>$12.95</td>
    <td><a href="<c:url value='/cart?productCode=pf01' />">Add To Cart</a></td>
  </tr>

  <tr valign="top">
    <td>Paddlefoot - The second CD</td>
    <td>$14.95</td>
    <td><a href="<c:url value='/cart?productCode=pf02' />">Add To Cart</a></td>
  </tr>

  <tr valign="top">
    <td>Joe Rut - Genuine Wood Grained Finish</td>
    <td>$14.95</td>
    <td><a href="<c:url value='/cart?productCode=jr01' />">Add To Cart</a></td>
  </tr>
  -->
</table>
 
 </body>
</html>

4 Respostas

F

&lt;c:forEach var = "product" items="${products}"&gt; &lt;tr valign="top"&gt; &lt;td&gt;product.description&lt;/td&gt; &lt;/tr&gt; &lt;/c:forEach&gt;

Ali não deveria ser ${product.description} ?

Edu_Valente

Sim. Desculpa ontem eu tava com um pouco de pressa e tava fazendo algumas alterações. Quando postei aqui, até esqueci de postar da forma correta. Eu não tô conseguindo fazer o forEach funcionar no Eclipse mas curiosamente o código funcionou no Netbeans. Agora eu estou mais intrigado ainda. E inclui a diretiva com taglib : \ Obrigado pela ajuda.

F

O Netbeans já inclui as bibliotecas pra você, mas o Eclipse não. Você incluiu a biblioteca standard.jar e jstl.jar?

Edu_Valente

sim caso contrário:

&lt;%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %&gt; daria erro : \

edit

Em outro JSP da mesma app, o seguinte trecho funciona:

&lt;table border="1" cellpadding="5"&gt;
  &lt;tr&gt;
    &lt;th&gt;Quantity&lt;/th&gt;
    &lt;th&gt;Description&lt;/th&gt;
    &lt;th&gt;Price&lt;/th&gt;
    &lt;th&gt;Amount&lt;/th&gt;
  &lt;/tr&gt;

&lt;c:forEach var="item" items="${cart.items}"&gt;
  &lt;tr valign="top"&gt;
    &lt;td&gt;${item.quantity}&lt;/td&gt;
    &lt;td&gt;${item.product.description}&lt;/td&gt;
    &lt;td&gt;${item.product.priceCurrencyFormat}&lt;/td&gt;
    &lt;td&gt;${item.totalCurrencyFormat}&lt;/td&gt;
  &lt;/tr&gt;
&lt;/c:forEach&gt;
&lt;/table&gt;

então achei que era problema com aquele product no <welcome-file> só que product está referenciando o <url-pattern>/products</url-pattern> que mapeia este para o servlet-name … e se tu olhares no ProductsServlet, o ArrayList configurado no session é “products” :shock: e como eu disse, no NB eu só precisei escrever aquele primeiro forEach que funcionou numa boa (lógico, depois que eu adicionei o JSTL na biblioteca)

edit 2

descobri qual era o problema. Eu estava executando o index.jsp e não o projeto :stuck_out_tongue: . Eu não sabia que era necessário fazer isso quando se chama um Servlet ao invés de um index.jsp. :mrgreen:

Criado 1 de setembro de 2011
Ultima resposta 2 de set. de 2011
Respostas 4
Participantes 2