Зачем мне использовать шаблонизатор? jsp include и jstl против тайлов, freemarker, скорость, sitemesh

Я собираюсь выбрать способ организации своего представления (с помощью spring -mvc, но это не должно иметь большого значения)

Насколько я понимаю, есть 6 вариантов (хотя они не исключают друг друга):

  • Плитки
  • Sitemesh
  • Freemarker
  • Скорость
  • <jsp:include>
  • <%@ include file="..">

Плитки и Sitemesh можно группировать; так же можно Freemarker и Velocity. Какой из них использовать в каждой группе, не обсуждается, по этому поводу достаточно вопросов и дискуссий.

Это интересное чтение, но можно Я вполне убедил меня использовать плитку.

У меня вопрос - что дают эти фреймворки, чего нельзя правильно сделать с <@ include file=".."> и JSTL. Основные моменты (некоторые взяты из статьи):

  1. Включая части страниц, такие как верхний и нижний колонтитулы - нет разницы между:

    <%@ include file="header.jsp" %>
    

    и

    <tiles:insert page="header.jsp" />
    
  2. Определение параметров в заголовке, таких как заголовок, метатеги и т. д. Это очень важно, особенно с точки зрения SEO. С помощью параметров шаблонов вы можете просто определить заполнитель, который должна определять каждая страница. Но вы можете использовать jsp с JSTL, используя <c:set> (на включенной странице) и <c:out> (на включенной странице)

  3. Реорганизация макета - если вы хотите переместить строку навигации над меню или поле входа над другой боковой панелью. Если включения страниц (с jsp) не организованы должным образом, вам может потребоваться изменить каждую страницу в таких случаях. Но если ваш макет не слишком сложен, и вы помещаете общие элементы в верхний / нижний колонтитулы, вам не о чем беспокоиться.

  4. Связь между общими компонентами и конкретным содержанием - я не вижу в этом проблемы. Если вы хотите повторно использовать какой-либо фрагмент, переместите его на страницу, на которой нет верхнего / нижнего колонтитула, и включите его везде, где это необходимо.

  5. Эффективность - <%@ include file="file.jsp" %> более эффективен, чем что-либо еще, потому что он компилируется один раз. Все остальные параметры анализируются / выполняются много раз.

  6. Сложность - для всех решений, отличных от jsp, требуются дополнительные XML-файлы, дополнительные включения, конфигурации препроцессора и т. д. Это как кривая обучения, так и введение большего количества потенциальных точек отказа. Кроме того, это делает поддержку и изменение более утомительными - вам нужно проверить несколько файлов / конфигураций, чтобы понять, что происходит.

  7. Заполнители - дают ли скорость / freemarker что-нибудь большее, чем JSTL? В JSTL вы помещаете заполнитель и используете модель (помещенную в область запроса или сеанса контроллерами) для заполнения этих заполнителей.

Итак, убедите меня, что я должен использовать любую из вышеперечисленных структур вместо / в дополнение к обычному JSP.


person Bozho    schedule 02.07.2010    source источник
comment
Я не совсем уверен, как бы сравнивать их, поскольку я уже некоторое время использую шаблоны компоновки Stripes и считаю, что это намного лучше, чем простой JSP. Я использую некоторые вызовы jsp: include, но это, как правило, особые случаи. Механизм шаблона макета - действительно удобный и мощный инструмент.   -  person Pointy    schedule 02.07.2010
comment
да, я слышал, что все это удобно и мощно, но не видел. Однако я увидел ненужную сложность и груды файлов конфигурации. (Я не про полосы конкретно говорю, а в целом)   -  person Bozho    schedule 02.07.2010
comment
См. Также stackoverflow.com/questions/610062/   -  person matt b    schedule 03.07.2010
comment
Я считаю, что jsp: include довольно эффективен - он скомпилирован до вызова метода из включающего сервлета в включаемый. Это приводит к меньшему количеству сгенерированного кода, чем @include, что может даже улучшить производительность из-за эффектов кеширования.   -  person Tom Anderson    schedule 31.01.2011
comment
Разработчик StringTemplate приводит лучший аргумент, который я видел, что очень похоже на правило наименьшей мощности   -  person Paul Sweatte    schedule 17.11.2012
comment
Еще один шаблонизатор, совместимый с Spring-MVC: Thymeleaf. (thymeleaf.org) Вам, вероятно, следует начать бросать кости, чтобы определить, какой TE вы собираетесь использовать.   -  person kiltek    schedule 17.04.2019


Ответы (7)


Несколько аргументов в пользу скорости (я не использовал Freemarker):

  • Возможность повторного использования шаблонов вне веб-контекста, например, при отправке электронных писем.
  • Синтаксис языка шаблонов Velocity намного проще, чем JSP EL или библиотеки тегов.
  • Строгое разделение логики представления от любой другой логики - невозможно перейти к использованию тегов скриптлетов и выполнению неприятных вещей в ваших шаблонах.

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

Да, ссылки действительно являются ядром VTL:

<b>Hello $username!</b>

or

#if($listFromModel.size() > 1)
    You have many entries!
#end

Эффективность - <%@ include file="file.jsp" %> эффективнее всего остального, потому что компилируется один раз. Все остальные параметры анализируются / выполняются много раз.

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

Реорганизация макета - если вы хотите переместить строку навигации над меню или поле входа над другой боковой панелью. Если включения страниц (с jsp) не организованы должным образом, вам может потребоваться изменить каждую страницу в таких случаях. Но если ваш макет не слишком сложен, и вы помещаете общие элементы в верхний / нижний колонтитулы, вам не о чем беспокоиться.

Разница в том, что с подходом JSP, разве вы не реорганизуете этот макет в каждом файле JSP, который использует один и тот же верхний / нижний колонтитул? Tiles и SiteMesh позволяют вам указать базовую страницу макета (JSP, шаблон скорости и т. Д. - оба являются фреймворками JSP по своей сути), где вы можете указать все, что хотите, а затем просто делегировать фрагмент / шаблон «содержимого» для основного содержимого. . Это означает, что будет только один файл, в который нужно переместить заголовок.

person matt b    schedule 02.07.2010
comment
приведенные вами примеры скорости можно легко выполнить с помощью JSTL. с точки зрения эффективности я имею в виду, что jsps компилируются в сервлеты, и ничего не анализируется. Но шаблоны кеширования - тоже хорошее решение, да. Что касается реорганизации - нет, я обычно формирую включения таким образом, что мне нужно изменять только включения, но не включающие. Возможно, в более сложных случаях это невозможно. - person Bozho; 03.07.2010
comment
Помимо повторного использования шаблонов вне веб-контекста, Velocity позволяет легко захватить отрисованную веб-страницу, прежде чем она будет отображена клиенту. Это полезно, если вы хотите, чтобы ваш сайт создавался в виде файлов HTML. С JSP - решение непростое. Это была основная причина, по которой мы перешли на Velocity с JSP. Что касается скорости - я провел несколько тестов, и Velocity рендерила страницы ровно в 2 раза быстрее, чем JSP. Так что скорость не проблема. Теперь, проведя с Velocity несколько лет, я больше никогда не вернусь к JSP. Это намного проще, легче и чище. - person serg; 03.07.2010
comment
@ serg555 у вас есть эти тесты где-нибудь? Я бы хотел увидеть больше данных об этом. Мне было бы интересно посмотреть, как вы выполнили тест. Я думаю, что это будет хорошей информацией для других, размышляющих над тем же вопросом Velocity vs JSP против других движков. - person matt b; 03.07.2010
comment
У меня нет опубликованных результатов. Просто я конвертировал несколько страниц с нашего сайта и замерил время рендеринга до и после. Ничего особенного :) - person serg; 03.07.2010
comment
@ serg555 какова была платформа / контейнер сервлета / версия jsp? - person Bozho; 03.07.2010
comment
@Bozho: winxp / tomcat 5.5 / jsp 2.0. Это было года 3 назад, может быть, с тех пор в мире JSP что-то изменилось. - person serg; 04.07.2010

Выбор между jsp:include и Tiles / Sitemesh / etc - это выбор между простотой и мощностью, с которым разработчики сталкиваются постоянно. Конечно, если у вас всего несколько файлов или вы не ожидаете, что ваш макет будет меняться очень часто, просто используйте jstl и jsp:include.

Но у приложений есть способ расти постепенно, и может быть трудно оправдать необходимость «остановить новую разработку и модифицировать плитки (или какое-либо другое решение), чтобы мы могли легче решать будущие проблемы». если вы не используете комплексное решение с самого начала.

Если вы уверены, что ваше приложение всегда будет оставаться простым, или вы можете установить некоторый тест сложности приложения, после которого вы интегрируете одно из более сложных решений, то я бы рекомендовал не использовать плитки / и т. Д. В противном случае используйте его с самого начала.

person mooreds    schedule 12.05.2011

Я не собираюсь убеждать вас использовать другие технологии. Насколько я знаю, всем следует просто придерживаться JSP, если он им подходит.

Я работаю в основном с Spring MVC и считаю, что JSP 2+ в сочетании с SiteMesh идеально подходят.

SiteMesh 2/3

Предоставьте декораторы, которые будут применяться к представлениям в основном так же, как наследование работает в других механизмах создания шаблонов. Без такой возможности сейчас немыслимо работать.

JSP 2+

Люди, утверждающие, что JSP затруднит уклонение от кода Java в шаблонах, являются подделкой. Вы просто не должны этого делать, а с этой версией в этом нет необходимости. Версия 2 поддерживает методы вызова с использованием EL, что является большим преимуществом по сравнению с предыдущими версиями.

С тегами JSTL ваш код по-прежнему будет выглядеть как HTML, поэтому он будет менее неудобным. Spring предоставляет большую поддержку JSP через taglibs, что очень эффективно.

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

person Bart    schedule 08.04.2014
comment
Я не вижу пользы от SiteMesh. Теги Jsp предлагают те же функции декорирования, что и SiteMesh, но с большей гибкостью, менее хрупкой настройкой, и я бы предположил более высокую эффективность, поскольку не требуется пост-обработки. - person Magnus; 22.12.2016

Один из лучших аргументов в пользу фейслетов (не в вашем списке, но я просто упомяну) против использования JSP заключается в том, что компиляция интегрирована с интерпретатором, а не делегируется компилятору JSP. Это означает, что одна из самых неприятных вещей, которые у меня были с JSF 1.1 - необходимость изменить атрибут id в окружающем JSF-теге при сохранении изменения, чтобы механизм выполнения обнаружил изменение, - исчезла, дав сохранение - в редакторе, перезагрузите цикл обратно в браузере, а также улучшите сообщения об ошибках.

person Thorbjørn Ravn Andersen    schedule 02.07.2010
comment
Да, для JSF-фасетов это решение только из-за тесной интеграции с интерпретатором. Но здесь это не так :) - person Bozho; 03.07.2010
comment
Я просто упомянул об этом на тот случай, если у любого из них будет такая же функция - это будет для меня решающей особенностью. - person Thorbjørn Ravn Andersen; 03.07.2010

Хорошая технология просмотра устраняет большинство и наиболее надоедливых операторов if / switch / condition, а простое включение - нет. Использование «сложной» технологии просмотра приводит к «простому» приложению.

person Ibrahim    schedule 16.08.2011

Вы не предоставили информацию о конкретных ваших приложениях. Например, я не использую JSP по нескольким причинам:

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

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

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

Минимальный движок JSP составляет около 500 КБ байт-кода плюс JSTL, поэтому он может не подходить для встраиваемых систем.

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

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

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

person Singagirl    schedule 13.02.2014

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

Отчасти дело в масштабе. Вы можете подумать, что include не менее мощны, чем, скажем, sitemesh, и это, безусловно, верно, по крайней мере, для небольшого количества страниц (я бы сказал, вероятно, около 100), но если у вас их несколько тысяч, он начинает становиться неуправляемым. (Так что для eBay это не обязательно, для Salesforce, вероятно, есть)

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

Наконец, ваш пункт 5 верен лишь частично. Он компилируется каждый раз, когда к нему обращаются, если это еще не было сделано. Это означает, что всякий раз, когда вы что-то меняете, вам нужно не забыть удалить "рабочий" каталог контейнеров сервлетов, чтобы он перекомпилировал JSP. Это не требуется для движка шаблонов.

TL; DR Механизмы создания шаблонов были написаны для устранения некоторых (предполагаемых или реальных) недостатков JSP + JSTL. Следует ли вам их использовать или нет, полностью зависит от ваших требований и масштаба вашего проекта.

person Mikkel Løkke    schedule 13.02.2014