[jstl]Wyświetlanie Listy zawartej w obiekcie !

0

Witam Mam klasy (beany):

public class ShopCart {

 
    private String id = "";
    private ArrayList<Products> Produkty;
    private Date data;
    --------------------
Metody getter and setter
} 

Oraz
 public class Products {

    String productid = "";
    String product_name = "";
    float product_price = 0.0f;
    float product_cost = 0.0f;
    int product_quantity = 0;
    ---------------------
metody getter i setter
}

Przechowuję egzemplarz obiektu ShopCart jako atrubut sesji
session.setAttribute("CartItems", shopCart);
Jest w wszystko ok:Na stronie jsp Następujące wyrażenia działają:
${sessionScope.CartItems.id}
${sessionScope.CartItems.data}

Ale nie mogę wyświetlić listy obiektów (ArrayList<Products> Produkty) w pętli foreach:
moja pętla:

<c:forEach var="item" items="${sessionScope.CartItems[Produkty]}" >
${item.productid}
${item.product_name}
${item.product_price}
</c:forEach>

Teoretycznie powinno działać wg tego co mi wiadomo
Lista nie jest pusta (sprawdzone w trakcie działania servletu), Czyli mam problem jak wyświetlić poszczególne elementy list znajdujące się w obiekcie??????
Zadanie niby proste ale elementy się nie wyświetlają???

0

Dlaczego do daty i id sdostajesz sie uzywając "."
${sessionScope.CartItems.id}
${sessionScope.CartItems.data}

a do produktów poprzez nawiasy kwadratowe? szukałem takiej notacji i nie mogłem znaleźć.

<c:forEach var="item" items="${sessionScope.CartItems[Produkty]}" >

0
javauser napisał(a)

Dlaczego do daty i id sdostajesz sie uzywając "."
${sessionScope.CartItems.id}
${sessionScope.CartItems.data}

a do produktów poprzez nawiasy kwadratowe? szukałem takiej notacji i nie mogłem znaleźć.

<c:forEach var="item" items="${sessionScope.CartItems[Produkty]}" >

Słuszna uwaga ale to jest język wyrażeń el i możemy "." zastąpić []
Do uzyskiwania dostępów do komponentów JavaBean i map możesz używać zarówno operatora [] jak i pomocniczego operatora "." . Wystarczy, że będziesz traktował klucze mapy w taki sam sposób jak nazwy właściwości należących do komponentu. Jeśli wewnątrz nawiasów kwadratowych nie ma cudzysłowów, kontener wyznacza wartość umieszczonego tam wyrażenia przez znalezienie atrybutu powiązanego z użytą nazwą i wstawia w jej miejsce odpowiednią wartość.(Jeśli istnieje obiekt domyślny oznaczony taką samą nazwą, zawsze zostanie użyty właśnie ten obiekt, a nie atrybut.

jeśli zrobie tak jak mówisz na chlopski rozum jest dobrze :

<c:forEach var="item" items="${sessionScope.CartItems.Produkty}
${item.productid}
</c:forEach>

Ale mam wyjątek i nie wyświetla mi sie nic:</span>

[java] WARNING: Nested in javax.servlet.ServletException: javax.servlet.jsp.JspException: ServletException in '/CartController.do': Unable to find a value for "Produkty" in object of class "shop.utilities.cart.ShopCart" using operator ".":
     [java] javax.servlet.ServletException: javax.servlet.jsp.el.ELException: Unable to find a value for "Produkty" in object of class "shop.utilities.cart.ShopCart" using operator "."

Niby takie proste ale nie mogę nigdzie znaleźć gdzie jest błąd ???

0

Masz getter i setter dla tego pola? Publiczny ? Może chodzi o widoczność funkcji.

0
public class Products {

    Private String productid = "a";
    Private  String product_name = "";
     Private float product_price = 0.0f;
    Private float product_cost = 0.0f;
    Private int product_quantity = 0;

    public Products(String productid, String product_name, float price, int quanity){

        float temp_price = price + (price*0.22f);
        this.productid = productid;
        this.product_name = product_name;
        this.product_price = temp_price;
        this.product_quantity = quanity;
        this.product_cost = quanity * temp_price;

    }


    public String getProduct_name() {
        return product_name;
    }

    public void setProduct_name(String product_name) {
        this.product_name = product_name;
    }

    public float getProduct_price() {
        return product_price;
    }

    public void setProduct_price(float product_price) {
        this.product_price = product_price;
    }

    public int getProduct_quantity() {
        return product_quantity;
    }

    public void setProduct_quantity(int product_quantity) {
        this.product_quantity = product_quantity;
    }

    public String getProductid() {
        return productid;
    }

    public void setProductid(String productid) {
        this.productid = productid;
    }

    public float getProduct_cost() {
        return product_cost;
    }

    public void setProduct_cost(float product_cost) {
        this.product_cost = product_cost;
    }

   
}

Oraz moja klasa ShopCart:

public class ShopCart {

 
    private String id = "";
    private ArrayList<Products> Produkty ;
    private Date data;

    
      
   public ShopCart() {
        this.id = "Id Z" + new Date();
        this.data = new Date();
        this.Produkty = new ArrayList();
    }
    

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public String getId() {
        return id;
    }

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

    public ArrayList<Products> getProdukty() {
        return Produkty;
    }

    public void setProdukty(ArrayList<Products> Produkty) {
        this.Produkty = Produkty;
    }

   
   
}
0

Widzę ze porwałem sie z motyka na słońce :D

Spróbuj dwie rzeczy może otwiorzą sie jakies synapsy

  1. Ustaw public na zmiennej zobacz co się stanie
  2. Wywal typowanie ArrayList.

Na tym kończ sie moje pomysły.

0

Zrobiłem jak napisałeś post wyżej i nic
Upewniłem się czy mam wszystko dobrze z bibliotekami i wszystko w porządku mam JSTL 1.1 standard.jar i jstl.jar

Po prostu ręce opadają niby powinno grac i być w porządku ale nie mam pojęcia co jest nie tak, aż jestem ciekawy gdzie leży kruczek [diabel]

0

TO może konfiguracja kontenera JSP ? o ile pamiętam to chyba plik Web.ini ? tam się referencje ustawia czy coś takiego :).

0

JSTL działa dobrze testowałem przykład ze strony:

http://www.java2s.com/Tutorial/Java/0380__JSTL/UseForEachtoLoopThroughArrayList.htm

Więc najprawdopodobniej jest źle skonstruowane zapytanie ale nie mam pojęcia co jest źle [glowa]
<font size="2">Doszedłem do tego

foreach nie mógł pobrać wartości public ArrayList Produkty ;

ponieważ Produkty napisałem dużą literą

zamieniłem
private ArrayList Produkty; na
private ArrayList produkty;

I działa </span>

0

To jakiś dramat jest!!

Jeśli ktoś chce to może wyciąć ten komentarz :)

0
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@page import="test.bean.Category"%>
<%@page import="test.bean.Product" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<% 
	Category c = new Category("category");
	c.addProduct(new Product("product1", 54.f));
	c.addProduct(new Product("product2", 22.f));
	request.getSession().setAttribute("category", c);
%>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Bean tester</title>
</head>
<body>
<c:forEach var="item" items="${sessionScope.category.products}">
	<p>${item["name"]}, ${item.price}</p>
</c:forEach>
</body>
</html>

Ew. petle forEach mozna zainicjowac notacja [], np.:

items="${sessionScope['category']['products']}"

(tutaj uwaga na apostrofy i cudzyslowy). Natomiast nieprawidlowe bedzie wywoalnie:

items="${sessionScope['category'][products]}"

(products na koncu bez apostrofow), poniewaz, jesli products nie znajduje sie w w widoku (page/request/session/application), EL przerobi to na null i cale wyrazenie zwroci null.

BTW: rozwaz usystematyzowanie nazewnictwa w Swoim kodzie, najlepiej zgodnie z konwencja Java.
HTH.

0
javauser napisał(a)

To jakiś dramat jest!!

Jeśli ktoś chce to może wyciąć ten komentarz :)

Nie dramat tylko niedopatrzenie :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1