#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 в нем.
Если это технически невозможно, есть ли лучший подход к этому варианту использования?