Как динамически заменить фрагмент в Thymeleaf?

В следующем примере я хочу создать только простой макет main.html и home.html, about.html.

Подстраницы должны содержать только свое собственное содержимое, а не включения верхнего или нижнего колонтитула.

Это то, что у меня есть до сих пор, но как теперь я могу динамически заменить контент container страницей, на которую нажали?

<html>
  <body>
      <div class = "navbar navbar-inverse navbar-fixed-top">
        <div class = "container">
          <div class = "navbar-header">
            <a class = "navbar-brand" href = "/home">Home</a>
          </div>
          <div class = "navbar-collapse collapse">
            <ul class = "nav navbar-nav">
              <li class = "active"><a href = "/about">About</a></li>
            </ul>
          </div>
        </div>
      </div>

    <div class = "container">
       <p>This should always get replaced when a link is clicked</p>
       <!--<div th:replace = "fragments/pagename :: pagename">-->
    </div>
  </body>
</html>

Если бы у меня была только одна страница, я мог бы заменить содержимое на <div th:replace = "fragments/about :: about">, но как я мог бы сделать это динамически?

Мне не совсем понятно, о чем вы спрашиваете ... вы проверили диалект раскладки тимелеафа? Thymeleaf — это серверный язык, поэтому вы не можете заменить фрагменты тимелеафа без полного обновления страницы.

Metroids 29.05.2019 19:05

Полное обновление не помешало бы. Моя главная проблема заключается в том, что я не знаю, как я могу просто создать один единственный макет main.html, а затем динамически заменить фрагмент container выше при нажатии ссылки на панели навигации. Поэтому, если щелкнуть «Домой», содержимое home.html должно быть введено в позицию фрагмента контейнера.

membersound 30.05.2019 00:15

Вы проверили диалект макета? github.com/ultraq/thymeleaf-layout-dialect - я думаю, что это имеет больше смысла для такого рода вещей, чем замена тимелеафу.

Metroids 30.05.2019 01:14

Хорошо, это работает, но если я использую, например, журналы <section layout:fragment = "content"> Thymeleaf, поддержка этого выражения будет прекращена в будущих выпусках. Так что я бы больше смотрел на собственный подход тимелеафа. Но если я правильно понял, тимелеафу изначально не хватает этой функции? Я с трудом мог в это поверить, потому что в настоящее время большинство веб-страниц используют общий макет и просто хотят заменить панель содержимого как часть веб-страницы. Как это решают другие? Просто скопировать заголовок, панель навигации и фрагмент нижнего колонтитула на каждую страницу контента? Это противоречило бы любому принципу программиста DRY...

membersound 30.05.2019 09:08

Правильно, тимелеаф из коробки не поддерживает ту инверсию, которую вы хотите (именно для этого и нужен layout-dialect). Я лично использую его во всех своих проектах тимелеафа (это даже упоминается в веб-сайт тимелеафа), поскольку встроенная замена/вставка просто недостаточно хороша. Что касается сообщения, которое вы получаете о том, что оно устарело... Я не уверен (я не вижу его в своих проектах). Вы уверены, что речь не идет об использовании фрагментарных выражений?

Metroids 30.05.2019 16:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
1 059
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сообщение об устаревании пришло от <html layout:decorate = "layout">. Переписав его в <html layout:decorate = "~{layout}">, исправил сообщение.

В любом случае, thymeleaf, кажется, не имеет этой важной функции, поэтому использование диалекта макета thymeleaf-layout-dialect — единственный выход.

Другие вопросы по теме