Чому я повинен використовувати шаблонний механізм? jsp включають і jstl проти плиток, безкоштовний маркер, швидкість, sitemesh


95

Я збираюся вибрати спосіб упорядкування свого перегляду (з spring-mvc, але це не має великого значення)

Наскільки я бачу, існує 6 варіантів (хоча вони не взаємовиключні):

  • Плитка
  • Сітемеш
  • Фрімаркер
  • Швидкість
  • <jsp:include>
  • <%@ include file="..">

Плитки та Сітемеш можна згрупувати; так само як 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. Заповнювачі - чи швидкість / безкоштовний маркер дають щось більше, ніж JSTL? У JSTL ви вставляєте заповнювач і використовуєте модель (розміщену контролерами в запиті або сеансі) для заповнення цих заповнювачів.

Отже, переконайте мене, що я повинен використовувати будь-який із зазначених вище фреймворків замість / на додаток до простого JSP.


Я не впевнений, як саме я б їх порівняв, оскільки я вже давно використовую шаблони макета Stripes, і я вважаю, що це набагато приємніше, ніж звичайний JSP. Я використовую деякі jsp: включати дзвінки, але це, як правило, досить особливі випадки. Механізм шаблону верстки - це справді зручний та потужний інструмент.
Пойнті

2
так, я чув, що все це «зручно та потужно», але я цього не бачив. Проте я бачив непотрібну складність та купу файлів конфігурації. (Я не говорю про смуги конкретно, але загалом)
Божо

1
Дивіться також stackoverflow.com/questions/610062/…
matt b

Я вважаю, що jsp: include досить ефективний - він компілюється до виклику методу з включеного сервлету до включеного. Це призводить до менш сформованого коду, ніж @include, що навіть може покращити продуктивність завдяки ефектам кешу.
Том Андерсон,

Розробник StringTemplate наводить найкращий аргумент, який я бачив, дуже схожий на правило найменшої сили
Пол Світт,

Відповіді:


17

Кілька аргументів щодо швидкості (я не використовував Freemarker):

  • Можливість повторного використання шаблонів поза веб-контекстом, наприклад, під час надсилання електронних листів
  • Синтаксис мови шаблону Velocity набагато простіший, ніж JSP EL або бібліотеки тегів
  • Суворе відокремлення логіки подання від будь-якої іншої логіки - неможливий варіант скористатися тегами скриплетів і робити неприємні речі у ваших шаблонах.

Заповнювачі - чи швидкість / freemaker дають щось більше, ніж JSTL? У JSTL ви вставляєте заповнювач і використовуєте модель (розміщену контролерами в запиті або сеансі) для заповнення цих заповнювачів.

Так, посилання насправді є ядром VTL:

<b>Hello $username!</b>

або

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

Ефективність - <%@ include file="file.jsp" %>це більш ефективно , ніж що - небудь ще, тому що він компілюється один раз. Усі інші параметри аналізуються / виконуються багато разів.

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

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

Різниця полягає в тому, що при підході JSP, чи не переорганізуєте ви цей макет у кожному файлі JSP, який використовує однаковий верхній / нижній колонтитул? Tiles і SiteMesh дозволяють вказати базову сторінку макета (JSP, шаблон Velocity тощо - обидва вони є основою JSP), де ви можете вказати все, що завгодно, а потім просто делегувати фрагменту / шаблону "вміст" для основного вмісту . Це означає, що буде лише один файл, в який можна перемістити заголовок.


3
наведені вами приклади швидкості можна легко зробити за допомогою JSTL. з точки зору ефективності я маю на увазі, що jsps компілюється в сервлети, і нічого не аналізується. Але шаблони кешування - це теж хороше рішення, так. що стосується реорганізації - ні, я зазвичай у формі включую таким чином, що мені потрібно лише модифікувати включення, а не "включення". Можливо, у більш складних випадках це неможливо.
Божо

2
Окрім повторного використання шаблонів поза веб-контекстом, Velocity дозволяє легко захопити відтворену веб-сторінку, перш ніж вона відображатиметься клієнту. Це корисно, коли ви хочете, щоб ваш сайт створювався як файли HTML. З JSP - непросте рішення. Це була основна причина, чому ми перейшли на швидкість з JSP. Щодо швидкості - я зробив порівняльний аналіз, і Velocity відображав сторінки рівно в 2 рази швидше, ніж JSP. Тож швидкість не є проблемою. Тепер, провівши кілька років із Velocity, я більше ніколи не повернусь до JSP. Це набагато простіше, легше і чистіше.
serg

@ serg555 чи є у вас десь опубліковані тести? Я хотів би побачити більше даних про це. Мені було б цікаво побачити, як ви також виконали еталон. Я думаю, що це було б гарною інформацією для інших, хто міркує над тим самим питанням "Швидкість проти JSP проти інших двигунів".
matt b

У мене немає результатів. Просто я перетворив кілька сторінок з нашого сайту і виміряв час візуалізації до і після. Нічого надто наукового :)
serg

@ serg555 якою була платформа / контейнер сервлетів / версія jsp?
Божо

12

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

Але програми можуть зростати поступово, і може бути важко виправдати "зупинити нову розробку та модернізувати плитки (або інше рішення), щоб ми могли легше вирішити майбутні проблеми" , що потрібно, якщо ви не використовуєте комплексне рішення на початку.

Якщо ви впевнені, що ваша програма завжди залишатиметься простою, або ви можете встановити певний орієнтир складності програми, після чого ви інтегруєте одне з більш складних рішень, то я б рекомендував не використовувати плитки / тощо. В іншому випадку використовуйте його з самого початку.


5

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

Я працюю в основному з Spring MVC, і я вважаю, що JSP 2+ у поєднанні з SiteMesh ідеально підходить.

SiteMesh 2/3

Надайте декоратори, які застосовуватимуться до подань, здебільшого як роботи з успадкування в інших механізмах шаблонування. В даний час така функція немислима для роботи.

JSP 2+

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

За допомогою тегів JSTL ваш код все одно буде виглядати як HTML, тому він менш незручний. Spring надає велику підтримку JSP через тагліби, що є дуже потужним.

Тагліби також легко розширити, тому налаштування власного середовища - це легкий вітер.


Я не бачу користі від SiteMesh. Теги Jsp пропонують таку ж функцію декорування, як і SiteMesh, але з більшою гнучкістю, менш крихким налаштуванням, і я б також припустив більшу ефективність, оскільки не проводиться синтаксичний аналіз після обробки.
Магнус

2

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


Так, для JSF facelets - це рішення лише завдяки тісній інтеграції з перекладачем. Але тут це не так :)
Bozho

Я просто згадав це на випадок, якщо хтось із них мав ту саму особливість - це буде для мене вирішальною особливістю.
Thorbjørn Ravn Andersen

2

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


1

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

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

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

JSP вимагає компіляції, і якщо цільова система не має компілятора Java, будь-яке незначне налаштування потребуватиме використання іншої системи, а потім перерозподілу

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

Механізм шаблонів може генерувати різні типи вмісту однієї і тієї ж моделі, скажімо, корисне навантаження JSON, веб-сторінка, тіло електронної пошти, CSV тощо.

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

Я давно задавав те саме питання і закінчив написанням мого фреймворку (безсумнівно на основі механізму шаблонів), який був позбавлений усіх недоліків, які я бачив в інших рішеннях. Само собою зрозуміло, що це близько 100 тис. Байт-кодів.


0

Я розумію, що це виходить як розумна відповідь, але правда в тому, що якщо ви не бачите жодної переваги у використанні шаблонів над кодом у вашому поточному проекті, це, мабуть, тому, що у вашому поточному проекті немає жодного .

Частина - про масштаб. Можна подумати, що включення настільки ж потужне, як, скажімо, ситемеш, і це, безумовно, правда, принаймні для невеликої кількості сторінок (я б сказав, мабуть, близько 100), але якщо у вас є кілька тисяч, це починає некерованим. (Отже, для eBay це не обов’язково, для Salesforce це можливо)

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

Нарешті, ваш пункт 5 справедливий лише частково. Він компілюється кожного разу, коли до нього звертаються, якщо це ще не було. Це означає, що кожного разу, коли ви щось змінюєте, вам потрібно пам’ятати про видалення «робочого» каталогу контейнерів сервлетів, щоб він перекомпілював JSP. Це непотрібно для шаблонізатора.

TL; DR. Шаблонні механізми написані для усунення деяких (сприйманих або реальних) недоліків JSP + JSTL. Чи варто їм користуватися чи ні, повністю залежить від ваших вимог та масштабу вашого проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.