Как передать значение переменной в HTML с помощью Java и Thymeleaf

Я новичок как в Spring Boot, так и в Thymeleaf и хочу передать значение переменной, определенной в коде Java, на страницу HTML. Я искал в Интернете, но, вероятно, я проглядел что-то важное. Я пытаюсь сделать это с помощью следующего кода:

Favorite.java:

@Getter
@Setter
public class Favorite {

    private String id;
    private String target;

    public Favorite(final String id, final String target) {
        setId(id);
        setTarget(this.target);
    }
}

PortalController.java:

public class PortalController {

    private final List<Favorite> myFavorites = new ArrayList<>();

    @ModelAttribute("myFavorites")
    public List<Favorite> myFavorites() {

    if (myFavorites.size() == 0) {
        myFavorites.add(new Favorite("ZEMPLOYEE_WORKTIME_ZWD_ESS_ABW", "ABC"));
        myFavorites.add(new Favorite("ZEMPLOYEE_WORKTIME_CATS", "DEF"));
        myFavorites.add(new Favorite("ZEMPLOYEE_WORKTIME_PEP_WISH_PLAN", "XYZ"));
    }
    return myFavorites;
}

index.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" lang="de" xml:lang="de">
<head>
    […]
</head>
<body>
    […]
        <ul>
            <div th:switch="${not #lists.isEmpty(myFavorites)}">
                <div th:case="true">
                    <div th:each="myFavorite : ${myFavorites}">
                        <li>
                            <td th:text="${myFavorite.id}"></td>
                            <td th:text="${myFavorite.task}"></td>
                        </li>
                    </div>
                </div>
                <div th:case="*">
                        Nothing to show!
                </div>

            </div>
        </ul>
        […]

I get the "Nothing to show!" text, which means that myFavorites is empty. What do I miss or what did I misunderstood about this?

Изменить:

Я изменил PortalController после прочтения детали @ModelAttribute к этому:

public class PortalController {

private final List<Favorite> myFavorites = new ArrayList<>();
private final Map<String, List<Favorite>> favoritesMap = new HashMap<>();

@RequestMapping(value = "/getMyFavorites", method = RequestMethod.POST)
public String submit(@ModelAttribute("myFavorites") final List<Favorite> favorites,
        final BindingResult result, final ModelMap model) {

    if (result.hasErrors()) return "error";

    model.addAttribute("myFavorites", favorites);

    favoritesMap.put(favorites.toString(), favorites);

    return "favoritesView";
}

@ModelAttribute
public void getMyFavorites(final Model model) {

    if (myFavorites.size() == 0) {
        myFavorites.add(new Favorite("ZEMPLOYEE_WORKTIME_ZWD_ESS_ABW", "ABC"));
        […]
        }
        model.addAttribute("myFavorites", myFavorites);
}

К сожалению, мне все еще чего-то не хватает или я неправильно понял, так что веб-страница по-прежнему возвращает «Нечего показывать!».

Редактировать 2:

Это текущее состояние, которое у меня есть после прочтения запрошенной здесь документации:

PortalController.java:

public class PortalController {

private final List<Favorite> myFavorites = new ArrayList<>();

@RequestMapping(value = "/getMyFavorites", method = RequestMethod.GET)
public String submit(@ModelAttribute("myFavorite") final List<Favorite> favorites,
        final BindingResult result, final ModelMap model) {

    if (result.hasErrors()) return "error";

    model.addAttribute("myFavorites", favorites);

    return "favoritesView";
}

@ModelAttribute
public void getMyFavorites(final Model model) {

    if (myFavorites.size() == 0) {
        myFavorites.add(new Favorite("ZEMPLOYEE_WORKTIME_ZWD_ESS_ABW", "ABC"));
        […]
    }
    model.addAttribute("myFavorites", myFavorites);
}

index.html:

                        <ul>
                        <div th:switch="${not #lists.isEmpty(myFavorite)}">
                            <div th:case="true">
                                <div th:each="myFavorite : ${myFavorites}">
                                    <li>
                                        <td th:text="${myFavorite.id}"></td>
                                        <td th:text="${myFavorite.task}"></td>
                                    </li>
                                </div>
                            </div>
                            <div th:case="false">
                                Nothing to show!
                            </div>
                        </ul>

Но я все равно получаю "Нечего показывать!", так как ${myFavorites} пусто.


person Sae1962    schedule 21.11.2019    source источник
comment
Вы можете взглянуть на это руководство baeldung.com/spring-boot-crud- лист тимьяна   -  person Simon Martinelli    schedule 21.11.2019
comment
Не использовал Thymeleaf, но что произойдет, если вы удалите переключатель и просто напечатаете $ {myFavorites}?   -  person Kennet    schedule 21.11.2019
comment
Попробуйте, когда вы удалите файл th:utext. Когда я сделал это точно так же, как вы с th:utext, я получил массив со ссылками на объекты, которые были показаны.   -  person CodeMatrix    schedule 21.11.2019
comment
@Kennet, вы получаете именно то, что набрали: print ${myFavorites}. И @CodeMatrix, как я могу удалить th:utext? Он нигде не используется.   -  person Sae1962    schedule 21.11.2019


Ответы (1)


Согласно документации @ModelAttribute следует использовать с @RequestMapping. Вы можете найти более подробное описание того, как работает эта аннотация здесь.

Также для отображения таблицы вы можете изменить свой код тимелеафа на:

<table>
    <thead>
        <tr>
            <th> id</th>
            <th> target</th>
        </tr>
    </thead>
    <tbody>
    <tr th:if="${myFavorites.empty}">
            <td colspan="2"> No Info </td>
        </tr>
        <tr th:each="myFavorite: ${myFavorites}">
            <td><span th:text="${myFavorite.id}"> ID</span></td>
            <td><span th:text="${myFavorite.target}"> Target</span></td>
        </tr>
    </tbody>
</table>
person RK_DEV    schedule 21.11.2019
comment
Спасибо вам за эту информацию! Я внес некоторые изменения в код, но по-прежнему не могу передать значение в HTML. Возможно, что я делаю неправильно, так это передать класс (List<Favorite>) в HTML, а не только текст. - person Sae1962; 21.11.2019
comment
Посмотрите, в настоящее время вы используете POST с параметром избранного. Это означает, что когда вы будете делать запрос, тело запроса будет сопоставлено с параметром избранного. Если он будет пустым, он ничего не покажет при просмотре или выведет какую-то ошибку. Вы можете попробовать изменить метод запроса на GET или просто использовать @GetMapping(/getMyFavorites) и изменить строку: model.addAttribute(myFavorites, someCreateListMethod()); - person RK_DEV; 21.11.2019
comment
RK_DEV, а как насчет someCreateListMethod()? - person Sae1962; 21.11.2019
comment
@Sae1962 Sae1962 просто заполните список, который вы хотите отобразить для просмотра: public List<Favorite> someMethod() { return new ArrayList<>(Arrays.asList(new Favorite(), new Favorite))} или т. д. - person RK_DEV; 21.11.2019