Считывание значения атрибута html из фрагмента Thymeleaf

#java #templates #thymeleaf

#java #шаблоны #thymeleaf

Вопрос:

я использую thymeleaf в качестве движка шаблонов в веб-приложении Java -Spring, которое уже является завершенным веб-сайтом. Сейчас я работаю над тем, чтобы ввести некоторые теги <meta> в заголовок, чтобы оптимизировать взаимодействие с платформами социальных сетей.

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

Прямо сейчас шаблоны структурированы следующим образом:

Layout.html который содержит пару фрагментов для head и body.

 <head th:fragment="common_head(title, links, scripts)" th:assert="${!#strings.isEmpty(title)}">
...
</head>

<body th:fragment="common_body(content, body_end)">
...
</body>
  

И шаблоны для реальных страниц примерно такие.

 <head th:replace="common/layout :: common_head(~{:: head/title}, ~{}, ~{:: head/script})">
    <title>My page title</title>
    <script>
        console.log('some page specific JS code');
    </script>
    ...
</head>
<body th:replace="common/layout :: common_body(~{ :: body/content }, ~{ :: body/bottom })">
    <div class="wrapper" th:fragment="content">
        some content here
    </div>
    <th:block th:fragment="bottom">
        more content here
    </div>
</body>
  

Я знаю, что могу просто добавить другой параметр во фрагмент common_head и передать ему теги <meta> так же, как я делаю с заголовком, сценариями и т.д. но я думал о другом подходе, который приведет к меньшему повторению кода для ввода значений в заголовок.

Во фрагменте layout common_head у меня есть это:

 <meta property="og:title"       th:with="og_value = ~{this :: %og_title/text()}"       th:content="${og_value ne null ? og_value : 'Lorem ipsum'}">
<meta property="og:description" th:with="og_value = ~{this :: %og_description/text()}" th:content="${og_value ne null ? og_value : 'Lorem ipsum'}">
<meta property="og:image"       th:with="og_value = ~{this :: %og_image}"              th:content="${og_value ne null ? og_value : 'path-to-default-img'}">
  

Идея состоит в том, чтобы использовать селекторы фрагментов для выбора правильного содержимого для вставки из шаблона страницы, таким образом, на странице я могу просто пометить тег (возможно, div, абзац, что-то, относящееся к этому шаблону) с помощью th:ref=»og_description», и его значение станет содержимым тега <meta> в заголовке.

Это действительно хорошо работает для тегов og_title и og_description, но проблема возникает с метатегом og: image, в который мне нужно ввести значение атрибута src тега <img>, помеченного th:ref=»og_image».

Я не смог найти никакого способа прочитать значение атрибутов из фрагмента, есть ли способ сделать это?.

Я вижу, что выбранный фрагмент на самом деле является экземпляром org.thymeleaf.standard.expression.Фрагмент но я не вижу никакого метода, который я мог бы использовать для доступа к атрибутам html в нем.

Если это технически невозможно, есть ли лучший подход к этому варианту использования?