Wyświetlanie ostatniego wiersza poprzez Thymeleaf zamiast całej listy :(

0

Otóż mam problem, Thymeleaf na stronie wyświetla mi w tabeli tylko ostatni element mojej kolekcji, co w tym kodzie jest pomieszane?


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <link href="css/styles.css" rel="stylesheet"/>
    <title>WELCOME</title>
</head>
<body>
    <h1>WELCOME!</h1>
    <img th:src="@{/assets/someimg.png}"/>
    <p>To jest tekst który wam wyświetlę poniżej</p>
    <span th:text = "${firstprofile.name}">JAKIS TEKST</span>
    <div class="lista" th:unless = "${#lists.isEmpty(lista)}">
        <table class="table datatable">
            <tbody>
                <tr th:each ="lista : ${lista}">
                    <td th:text = "${lista.id}">ID</td>
                    <td th:text = "${lista.name}">NAME</td>
                </tr>
            </tbody>
        </table>
    </div>
   </br>
   <p>NO TO COS POSZLO NIE TAK :(((((</p>
</body>
</html>

0

<div class="lista" th:unless = "${#lists.isEmpty(lista)}">
To zamień na coś takiego:

<div th:if="not ${lista.isEmpty()}">

Pytanie tylko jakich obiektów jest to lista?

<tr th:each ="lista : ${lista}">
        <td th:text = "${lista.id}">ID</td>
        <td th:text = "${lista.name}">NAME</td>
</tr>

Tutaj obiekt, który jest gwoździem programu w każdej iteracji nazwałeś tak jak listę, po której iterujesz. To nie mogło się udać. Dodatkowo trzeba określić typ elementu listy. Podejrzewam, że to jakaś Twoja klasa. Zwróć uwagę na nazwy w poniższym listingu.

<tr th:each ="elementListy : ${lista}" th:object="${TypElementuListy}">
        <td th:text = "${elementListy.id}">ID</td>
        <td th:text = "${elementListy.name}">NAME</td>
</tr>
0

Zmieniłem obecnie na coś takiego, ale wciąż ten sam problem, chyba, że cię źle zrozumiałem.
Kolekcja jest zapełniona obiektami mojej klasy Profile.

    <div th:if="not ${lista.isEmpty()}">
        <table class="table datatable">
            <tbody>
                <tr th:each ="element : ${lista}" th:object="${Profile}">
                    <td th:text = "${element.id}">ID</td>
                    <td th:text = "${element.name}">NAME</td>
                </tr>
            </tbody>
        </table>
    </div>

0

Pokaż kod metody którą wypychasz tą listę do widoku, ewentualnie jakiś serwis z tym związany. Może problem leży gdzieś pod spodem.

0

Poniżej zmieniłem List<Profile> na Iterable<Profile>, liczyłem że rozwiąże problem.


    @RequestMapping(value = "/index")
    public String index(Model model) {
        Iterable<Profile> profiles = new ArrayList<>();

        Profile profile = new Profile();
        profile.setId(1);
        profile.setName("Krzysiu");

        Profile profile2 = new Profile();
        profile.setId(2);
        profile.setName("Marek");

        Profile profile3 = new Profile();
        profile.setId(3);
        profile.setName("Przemek");

        Profile profile4 = new Profile();
        profile.setId(4);
        profile.setName("Kacper");


        ((ArrayList<Profile>) profiles).add(profile);
        ((ArrayList<Profile>) profiles).add(profile2);
        ((ArrayList<Profile>) profiles).add(profile3);
        ((ArrayList<Profile>) profiles).add(profile4);

        model.addAttribute("firstprofile", profile);
        model.addAttribute("lista", profiles);


        return "index";
    }

0
Iterable<Profile> profiles = new ArrayList<>();

Zamień po prostu na

List<Profile> profiles = new ArrayList<>();

A tutaj dodawaj normalnie, bez jakiegoś rzutowania:

 profiles.add(profile);
 profiles.add(profile2);

Sprawdź teraz.
Poza tym zalecam naprawdę porządnie się wziąć za Javę SE, nawet kosztem odpuszczenia sobie Springa póki co. Naprawdę się przyda.

0

Niestety nie pomogło, tak jak wspominałem 2 posty wyżej, przez cały czas miałem ustawione na List i nie musiałem później rzutować, tylko po prostu robić profiles.add(xxx), ale tonący brzytwy się chwyta i spróbowałem Iterable.
Dziękuję za radę, ale z czego ona wynika, coś robię nie tak? Pytam bo przyda mi się zawsze jakaś wskazówka.

1

Spróbuj zmienić w tym index.html nagłówek na:

<html 
         xmlns="http://www.w3.org/1999/xhtml"
         xmlns:th="http://www.thymeleaf.org">
0

Dobra zmiana, bo w sumie taka jest konwencja, ale wciąż to samo, dostaję tylko 4 element listy "4.Kacper" :(
Ciekaw jestem, czy ten błąd jest po stronie Thymeleaf-a, czy siedzi gdzieś w kontrolerze.

0

Problem rozwiązany, z jakiegoś powodu obiekty które tworzyłem poza tym który był ostatni w kolejności, okazywały się nullami, po stworzeniu konstruktora dwu parametrowego(tylko dla testowych zmiennych które utworzyłem) i użyciu konstrukcji Arrays.asList()
problem się rozwiązał, ale wciąż jestem ciekaw przyczyny takiego stanu, jeżeli ktoś zna odpowiedź to prosiłbym o napisanie postu ;)


    @RequestMapping(value = "/index")
    public String index(Model model) {
        List<Profile> profiles = new ArrayList<>();
        profiles = Arrays.asList(new Profile(1L, "Krzysztof"), new Profile(2L, "Seba"), new Profile(3L, "Maciek"), new Profile(4L, "Marta"));
        profiles.stream().forEach(System.out::println);
        model.addAttribute("lista", profiles);

        return "index";
    }

1
        Profile profile = new Profile();
        profile.setId(1);
        profile.setName("Krzysiu");

        Profile profile2 = new Profile();
        profile.setId(2);
        profile.setName("Marek");

        Profile profile3 = new Profile();
        profile.setId(3);
        profile.setName("Przemek");

        Profile profile4 = new Profile();
        profile.setId(4);
        profile.setName("Kacper");

Cały czas używałeś setterów na obiekcie "profile", więc nic dziwnego, że pozostałe miały pola nullowe.

ps zanim zaczniesz bawić się webówką (już za późno), polecam polubić się z debuggerem.

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