Механизм шаблонов Java с открытым исходным кодом с наследованием

Я разрабатываю проект на основе Java-сервлета, и я новичок в этой платформе. Я обычно использую Django, у которого есть отличный механизм шаблонов по умолчанию. Есть ли что-то подобное для Java?

PS: наследование шаблонов является обязательным (во избежание повторения). Есть несколько библиотек, таких как усы, которые не предоставляют эту функцию.

Что вы подразумеваете под «наследованием шаблонов»?
Допустим, у вас есть некоторая часть вашего HTML, которая часто повторяется, например, панель навигации в сочетании с нижним колонтитулом/боковой панелью и т. д. Теперь вы помещаете свою повторяющуюся часть в файл, скажем, в то место, где содержимое не является одинаковым для всех base.html. файлы, говорите вы {{block body}}. Затем в другом файле, скажем login.html, если вы используете наследование шаблонов, вам нужно только сказать, {extends base.html}а затем {{start bodyblock}} Your new content {{end bodyblock}}. Это отобразит как статический, так и динамический контент. Вы можете вызвать любой файл из другого файла.
Чем это на практике отличается от возможности свободно импортировать фрагменты страниц, как это можно сделать в шаблонах Freemarker или во фреймворке Play?
Я мало знаю о ресурсах, которые вы упомянули выше. Допускают ли они иерархическую структуру?
Я не вижу смысла в иерархии, если вы можете включать произвольные конструкции. Наследование не всегда лучший путь. Я предлагаю вам рассмотреть композицию, которая расширит доступные вам ресурсы шаблонов.

Ответы (3)

Rythm Template Engine должен быть именно тем, что вам нужно. Не уверен, почему вы сказали, что документ не на должном уровне.

Посетите http://rythmengine.org/doc/template_guide.md#inheritance и поэкспериментируйте с функцией наследования на http://fiddle.rythmengine.org/#/editor/886606b3a7034088b991855bef8f89da .

Отказ от ответственности : я автор Rythm

Тогда я фактически остановился на Rythm, потому что не мог найти другого шаблонизатора, столь же простого в использовании и универсального, как он. Снимаю шляпу за его разработку! Что касается документации, то возникла проблема с моим-провайдером-вашим-сервером, из-за которой я не мог просмотреть всю страницу. Извините, что не отредактировал вопрос раньше
Рада узнать об этом :-)

Сначала вы можете прочитать статью This SO , в которой рассказывается о существующих шаблонизаторах и о том, почему какой из них использовать, это должно помочь вам начать работу.

Я лично использовал фреймворк плитки и остался очень доволен. Вы пишете свои фрагменты и у вас есть шаблон для объединения частей (верхний и нижний колонтитулы, навигация и т. д.) всегда одинаковым образом.

Различные плитки представляют собой обычные файлы JSP, и поэтому интеграция проста, если вы привыкли к JSP (которой вы скоро станете, если будете работать с Java, сервлетами и JSP).

Я должен заметить, что мой опыт с этим немного запылился :) Я не писал код для Интернета годами.

Chunk Templates обеспечивает поддержку такого типа вещей {% exec %}следующим образом:

base_template.chtml

<html>
  <head>
  </head>
  <body>
    {$body}
  </body>
</html>

widget_detail.chtml

{% exec base_template %}
  {$body=}
    ...
  {=}
{% endexec %}

Вот более интересный пример, в котором базовый шаблон предоставляет некоторые значения по умолчанию, которые вы можете переопределить из сервлета или в exec:

base_template2.chtml

<html>
  <head>
    <title>{$page_title:Widget Emporium}</title>
  </head>
  <body>
    {$top_nav:.include top_nav}
    {$left_nav:.include left_nav}
    {$body}
    {$footer:.include footer}
  </body>
</html>

top_nav.chtml

<div class="top_nav">
  ...
</div>

left_nav.chtml

<div class="left_nav">
  ...
<div>

нижний колонтитул.chtml

<div class="footer">
  ...
<div>

special_page.chtml — отключить всю навигацию и использовать альтернативный нижний колонтитул

{% exec base_template2 %}
  {$body=}
    ...
  {=}
  {$page_title = Special Page}
  {$top_nav=}{=}
  {$left_nav=}{=}
  {$footer=}{% include special_footer %}{=}
{% endexec %}

exec также поддерживает json и xml для назначения значений тегов .

Для более простых вещей синтаксис Chunk очень похож на Django/jinja2. Аналогично применяются фильтры с трубами: {$tag|filter}и тэги Chunk пишутся как {$tag}или {% $tag %}скорее чем, {{ tag }}но к этому довольно быстро привыкаешь.

В частности, ветвление if-else должно выглядеть очень знакомым для всех, кто работает с Django:

{% if (...) %}
  true-case
{% else %}
  false-case
{% endif %}

Отказ от ответственности: я являюсь автором/мейнтейнером Chunk. Проект с открытым исходным кодом и на GitHub.