Я использую thymeleaf в качестве движка шаблонов в веб-приложении Java - Spring, которое уже является законченным веб-сайтом, и сейчас я работаю над тем, чтобы ввести в заголовок несколько тегов оптимизировать взаимодействие с платформами социальных сетей.
Моя цель - как можно меньше изменить код шаблонов и обеспечить некоторую гибкость в отношении значений, которые входят в содержимое тегов.
Прямо сейчас шаблоны структурированы следующим образом:
Layout.html , который содержит пару фрагментов для головы и тела.
<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 и передать ему теги так же, как я делаю с заголовком,сценарии и т. д., но я думал о другом подходе, который приведет к меньшему количеству повторений кода для вставки значений в заголовок.
В макете 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" , и его значение станет content тега в голове.
Это действительно хорошо работает для тегов og_title и og_description , но проблема возникает с og:image метатег, в который мне нужно вставить значение атрибута src тега
, помеченного th: ref = "og_image" .
Я не смог найти способ прочитать значение атрибута из фрагмента, Есть ли способ сделать это? .
Я вижу, что выбранный фрагментна самом деле это экземпляр org.thymeleaf.standard.expression.Fragment , но я не вижу ни одного метода, который можно использовать для доступа к атрибутам html в нем.
Если это технически невозможно, есть ли лучший подход к этому варианту использования?