вторник, 16 сентября 2008 г.

Почему я не люблю JSTL

Вступление

В далекое время в далекой Галактике мы занимались разработкой веб приложения на java, другими словами добавляли новую функциональность и рефакторили код. Когда продукт поступил на аутсорсинг в Украину, он состоял из сотен JSP, в которых HTML был смешан с логикой в виде скриплетов. Иногда встречались JSP размером в тысячи строк. Постепенно мы переводили это безобразие на Spring MVC . Мы выделяли логику из скриплетов в контроллеры. Также было принято решение отказаться от скриплетов и перейти на чистый JSTL.

Недостатки JSTL
  • Плохая читабельность
И вот в один прекрасный день я открываю страницу которая была отрефакторена со скриплетов на JSTL, и вдруг понимаю что ничего не понимаю. JSTL оказался абсолютно не читабельным. На странице были вложенные ветвления и и объявления переменных . Несмотря на то, что уровень вложенности конструкций ветвления был не больше двух, когда я смотрел на страницу то не мог понять как она работает.
Это случилось потому что теги XML не могут сравниться в наглядности с языком программирования для описания алгоритма. XML создан для автоматического обмена данными между компьютерными системами, а не для чтения людьми. Конечно, для кода на любом языке можно построить эквивалентное описание в XML. Создатели JSTL создали XML теги для операторов ветвления для объявления переменных, но при этом читабельность кода стала хуже.
  • Слабая типизация
После замены скриплетов на JSTL появились баги вызванные ошибками в EL выражениях JSP страниц. При написании этой статьи я использовал NetBeans. Оказалось что даже когда опция"Test compile JSP page during builds" включена, то все равно не отлавливаются обращения к несуществующим property бинов в EL выражениях.
Отказавшись от скриплетов на java с их строгой типизацией в пользу cвязки EL+JSTL мы утратили проверку типов на этапе компиляции на на уровне view.

Пример

Рассмотрим страницу которая отображает информацию о пользователе и его правах доступа. Данные о пользователе инкапсулирует класс web.User. Страница отображает имя пользователя и список его прав. Права доступа разделяются запятой.





Вот как это реализуется на скриплетах:


А это то же самое на JSTL:


У меня на написание варианта со скриплетами ушло 10 минут, на JSTL я потратил в два раза больше. Я считаю что код на JSTL выглядит как будто оригинальный пример на скриплетах прогнали через обфускатор. Делает то же самое, но менее читабельный.

Поэтому я считаю что если мы используем JSP, то вместо тегов JSTL и EL лучше использовать скриплеты. Код будет более читабельным и больше ошибок выявим на этапе компиляции при условии что мы не злоупотребляем наворачиванием логики в скриплетах. Если сильно не нравятся скриплеты, то вместо JSTL лучше использовать Velocity или FreeMarker.

8 comments:

Неруш Евгений комментирует...

Скриптлеты это зло!
Не верите?
Проведите инвестигейшин в сторону негативных моментов скриптлетов, и вы поймёте, зачем кому-то в голову пришла идея разработать JSTL.

kolyadenko комментирует...

А по мне jstl читабельнее. Вообще на мой взгляд это дело привычки, вы вот привыкли к скриптлетам.

Sergey Grigoriev комментирует...

Я вижу один негативный момент в скриплетах - это возможность наворачивать хитрый код. Если всю логику реализовать в MVC контроллерах то этот недостаток можно устранить.
Мне как программисту ближе синтаксис java. В книге по JSTL я прочитал что JSTL может использоваться веб дизайнерами,так как его синтаксис им более понятен. Но я еще не встречал веб дизайнера который смог осилить JSTL.

Sergey Grigoriev комментирует...

Если мы посмотрим на ASP.NET - технологию которая является аналогом JSP на платформе Microsoft Windows, то увидим там те же скриплеты. Еще там есть возможность вообще отделить код от шаблона. Я думаю что если создатели ASP.NET не стали изобретать специальный язык-аналог JSTL+EL и считают что существующие языки программирования такие как C# или VB.NET могут использоваться на уровне представления, то и в JSP можно успешно работать без JSTL.

Неруш Евгений комментирует...

>>Еще там есть возможность вообще отделить код от шаблона.
Правильно, это и есть чистой воды MVC. В таком случае view должен содержать как можно МЕНЬШЕ логики, в нем не нужны скриптлеты.

Sergey Grigoriev комментирует...

Я согласен что на уровне view не должно быть сложной логики. Мне не нравится использование XML как языка программирования.

Vlad Yatsenko комментирует...

Сергей, в Вашем примере логику с forEach и переменной isTheLastItemOnTheList можно/нужно вынести в метод-утилиту, которая возвращает строковое представление списка. Тогда код на JSTL выглядит намного красивее и не рябит в глазах от <% %>. Т.е. пример, на мой взгляд, неудачный. Не спорю, что написать сложную страницу (по логике представления) на JSTL сложнее, чем с помощью скриптлетов, но у нас есть возможность писать свои тэги (или использовать уже существующие таглибы), которые помогают вынести логику из JSP, а код сделать действительно читабельным.

Sergey Grigoriev комментирует...

Судя по комментариям я признаю что читабельность или нечитабельность JSTL - субьективный критерий и зависит от конкретного человека.Я лично согласен принести в жертву проверку типов на этапе компиляции (тоесть скриплеты) только в обмен на FreeMarker или Velocity.