Pull to refresh

Lift: самый мощный и безопасный веб фреймворк из всех?

Reading time 4 min
Views 8.6K
Весьма амбициозное утверждение можно увидеть на официальном сайте проекта. Там же предлагается в этом убедиться на примерах. Лично мне судить сложно, я пользовался только Java веб фреймворками, и то далеко не всеми. Поэтому я попробую рассказать об этом подробнее, а выводы пусть каждый сделает сам.



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

Для начала — немного справочной информации


Основные факты:
  • Начало разработки — 2007 год, первая версия — 2009 год, текущая версия — 2.2.
  • Уже в 2009 году Foursquare полностью переписан с PHP на Scala/Lift, сейчас Foursquare — это более 6 млн. пользователей и несколько тысяч запросов в секунду
  • Написан на Scala, а значит совместим со всеми библиотеками на JVM, сервлет контейнерами и т.д. Можно просто подключать .jar-ы к существующему Java веб приложению, править web.xml и пользоваться.
  • Разрабатывая идею, авторы постарались взять всё лучшее из самых мощных фреймворков того времени — Rails, Django, Wicket и др.
  • Шаблоны Lift — валидный HTML, не могут содержать кода, но не являются необходимыми, можно генерировать HTML прямо из кода, тем более что в Scala есть встроенная поддержка XML.
  • Вся логика и настройки реализуются исключительно на Scala, без специальных XML-файлов или других инструментов.
  • При помощи SBT и JRebel цикл разработки (время между внесением изменений в код и обновлением в браузере) сокращается до нескольких секунд.
  • Автоматически гарантирует защиту от 6 из 10 наиболее опасных уязвимостей (по версии OWASP). В реальных системах это подтверждено, например, Расмусом Лердорфом для Foursquare.

Как уже было сказано, Lift активно использует функциональную сторону Scala. Это отражается во-первых, на том, что вам не надо думать о том, как посылать и получать информацию с клиента, как её преобразовывать, какие интерфейсы имплементировать и как их правильно связывать. Вместо этого вы просто пишете, что делать. Простейший классический пример: есть кнопка, которая при нажатии отправляет запрос на сервер, там должны выполниться какие-то действия, после которых на браузер должен быть прислан какой-то ответ. Смотрим на код.

Шаблон:
<button id="b">Push me</button>

Scala код:
"#b [onclick]" #> ajaxInvoke(() => {println("server"); Alert("client")})

Выводим в консоль сообщение и возвращаем javascript для выполнения на клиенте. Всё! Минимум кода, максимум результата. И этот подход прослеживается во всех частях фреймворка.

Семь вещей


из Lift, которые в других фреймворках делаются заметно сложнее или вообще не реализованы:
  • Отложенная загрузка: можно пометить части страницы, которые генерируются долго, Lift позаботится о том, чтобы остальные части загрузились сразу, а медленные — как только будут готовы.
  • Паралелльная генерация страницы: можно пометить несколько участков страницы для паралелльной генерации, для них автоматически будут выделены новые потоки.
  • Comet и Ajax: простейший Comet-чат реализуется в 20 строк кода, по тому же принципу, что и пример выше.
  • Связанные Ajax-компоненты (Wiring): моя любимая новая возможность — позволяет связать (даже в несколько ступеней) несколько Ajax компонентов на странице, и они будут заново отрисовываться при необходимости.
  • Дружественные дизайнерам шаблоны: в последней версии стали ещё красивее — инструкции для Lift передаются через второй атрибут class. В моём проекте, например, шаблоны можно открывать как обычный HTML и они выглядят в точности как страница приложения, только без динамики.
  • Многостраничные формы (Wizard): декларативным способом описанные формы, поддерживающие кнопку Back, которые можно запускать либо многостранично, либо через Ajax. Раньше эти формы были фишкой JBoss Seam, теперь в Lift это ещё удобнее.
  • Безопасность: благодаря грамотному использованию статической типизации и функционального программирования, Lift гарантирует защиту от большинства наиболее опасных для интерактивных веб приложений уязвимостей.


И всё остальное


Кроме перечисленных выше возможностей, есть весь необходимый набор:
  • меню, авторизация, свой ORM и простая интеграция с другими ORM (я, например, по привычке использую Hibernate);
  • готовое пустое приложение, с которого удобно начинать;
  • в последней версии появился очень классный Dependency Injection с возможностью менять зависимости на время сессии, запроса и т.д.;
  • локализация;
  • загрузка файлов;
  • набор инструментов для создания веб сервисов;

И т.д. и т.п. Ко всему этому важно добавить мощь самого языка Scala, который лично меня, после долгих лет работы с Java, не перестаёт радовать каждый день.

Как со всем этим быть?


Я пробовал основательно заняться Lift раза 3 за последний год. И как-то не мог ухватить сути, бросал. Даже стал делать прототип веб интерфейса по работе на Vaadin. Но в конце 2010 года, попробовав очередной раз, смог разобраться и теперь жутко рад. Я думаю, что причина неудачных попыток, в основном, в том, что надо привыкнуть к функциональному подходу. Привычки Java на самом деле глубоко сидят и мешают мыслить в другом разрезе.

Поэтому, прежде чем серьёзно браться за Lift, стоит, пожалуй, почувствовать уверенность в пользовании функциональными возможностями Scala.

Все достойные книжки по Scala и Lift либо бесплатные, либо не сложно достать. Для Scala лучшим вариантом будет Programming in Scala 2nd edition. Lift я изучал, в основном, по примерам из дистрибутива, Wiki и бесплатной книге от создателя — Simply Lift. На хорошо обдуманные вопросы быстро и качественно отвечают либо на StackOverflow, либо в гугл-группах по Scala и Lift.
Tags:
Hubs:
+55
Comments 67
Comments Comments 67

Articles