web-dev-qa-db-fra.com

Spring, Thymeleaf et listes de chaînes

Ok, je viens de Spring and Thymleaf, nouveau venu mouillé derrière les oreilles. J'essaie de faire quelque chose d'aussi simple, ça devrait être une évidence. Mais je ne peux pas le faire fonctionner. La question simple est de savoir comment afficher une liste de chaînes dans une page Web.

J'ai le modèle suivant

import Java.util.List;
public class TestModel {

    private List<String> list = null;
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public List<String> getList() { return list; }

    public void setList(final List<String> list) {
        this.list = list;
    }
}

Ma page Web contient les éléments suivants:

<div th:if="${greeting.list != null}">
    <h1>Result</h1>
    <ul>
    <th:block th:object="${greeting}" th:each="item : ${list}">
     <li th:text="${item.name}">Item description here...</li>
    </th:block>
    </ul>
</div>

J'ai ajouté le ".name" à "item" uniquement parce que j'ai trouvé quelques exemples où ils avaient une liste de chaînes et faisaient quelque chose de similaire. Mais ils avaient le ".name" sur l'objet.

Mais ça ne marche toujours pas. La liste non ordonnée finit par être vide. C'est à dire. Il n'y a aucun élément de liste dans les balises non ordonnées.

Qu'est-ce que am je fais mal? Pointeurs volontiers acceptés.

13
Lori Cook

Puisqu'il n'y a pas d'exemple de modèle de remplissage, je suppose que vous avez mis certaines chaînes dans l'instance du champ de liste de TestModel comme ceci.

TestModel greeting= new TestModel();
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
model.addAttribute("greeting", greeting);

Il y a ensuite plus d’erreurs dans votre exemple de modèle Thymeleaf. 

  1. Si vous utilisez la sélection d'objet via th:object, vous devez d'abord utiliser astérisque * pour accéder aux propriétés de l'objet. La syntaxe Asterisk évalue les expressions sur les objets sélectionnés au lieu de mapper les variables de contexte.
  2. La sélection d'objet n'affecte que les nœuds enfants du DOM.
  3. Dans votre exemple, vous souhaitez parcourir la liste de chaînes (List<String>), mais vous souhaitez accéder à la propriété name qui, en fait, n'existe pas sur l'objet Java String.

Vous devez corriger votre modèle Thymeleaf d’une manière - voir exemples.

Pas de sélection d'objet du tout

<div th:if="${greeting.list != null}">
    <h1>Result</h1>
    <ul>
       <li th:each="item : ${greeting.list}" th:text="${item}">Item description here...</li>
    </ul>
</div>

Sélection d'objet appropriée

<div th:if="${greeting.list != null}">
    <h1>Result</h1>
    <ul>
    <th:block th:object="${greeting}">
       <li th:each="item : *{list}" th:text="${item}">Item description here...</li>
    </th:block>
    </ul>
</div>
22
michal.kreuzman
<table th:object="${userList}" id="userTable" border="1">
    <tr th:each="user :${userList}">
        <td  th:text="${user.getName()}"></td>
        <td  th:text="${user.getEmail()}"></td>
    </tr>
</table>

Un autre exemple utilisant table et Object. Pourrait être utile à quelqu'un d'autre.

1
Rakesh Goswami