Должен сказать, что я категорически не согласен с ответом Дэна Ларока.
Лифт не монолитный. Он состоит из отдельных элементов. Он не игнорирует элементы J / EE, он поддерживает JNDI, JTA, JPA и т. Д. Тот факт, что вы не обязаны использовать эти элементы J / EE, является ярким свидетельством модульной конструкции Lift.
- Философия взгляда Lift - «пусть разработчик решит». Lift предлагает шаблонный механизм, который не допускает никакого логического кода в представлении, механизм представления, основанный на выполнении кода Scala и литералов XML Scala, и механизм представления, основанный на Scalate . Если вы выбираете механизм шаблонов XML, то вы выбираете, насколько разметка, если таковая имеется, принадлежит вашей бизнес-логике. Разделение представлений Lift сильнее, чем все, что может предложить Spring, потому что вы не можете выразить бизнес-логику в XML-шаблонах Lift.
- Философия Lift's Object ↔ Persistence - «пусть разработчик решит». Lift имеет Mapper, который является реляционным картографом объекта стиля ActiveRecord. Это делает работу для небольших проектов. Поднимите поддержку JPA. Lift имеет абстракцию Record, которая поддерживает перемещение объектов в реляционные базы данных и из них, в хранилища NoSQL и из них (Lift включает встроенную поддержку CouchDB и MongoDB, но уровни адаптера составляют несколько сотен строк кода, так что если вы хотите Cassandra или что-то еще, это не так много работы, чтобы получить его.) По сути, Lift Web Framework не зависит от того, как объекты материализуются в сеанс. Кроме того, циклы сеанса и запроса открыты, так что вставка хуков транзакций в цикл запрос / ответ является простой.
- Философия Lift заключается в том, что «команда сервера должна знать один, а не несколько языков». Это означает, что настройка выполняется через Scala. Это означает, что нам не пришлось реализовывать 40% языковых конструкций Java в синтаксисе XML для создания гибких опций конфигурации. Это означает, что синтаксис компилятора и тип проверяет данные конфигурации, чтобы вы не получили никакого странного анализа XML или неверных данных во время выполнения. Это означает, что вам не нужно иметь IDE, которые понимают особенности используемых вами аннотаций на основе используемой вами библиотеки.
- Да, документация Лифта не является его сильной стороной.
С учетом вышесказанного позвольте мне немного рассказать о философии дизайна Lift.
Я написал Манифест Web Framework до того, как начал писать Lift. В значительной степени и в большей степени, чем это справедливо для любой другой знакомой мне веб-среды, Lift отвечает этим целям.
Lift в своей основе стремится абстрагироваться от цикла HTTP-запроса / ответа, а не помещать объектные оболочки вокруг HTTP-запроса. На практическом уровне это означает, что большинство любых действий, которые пользователь может предпринять (отправка элементов формы, выполнение Ajax и т. Д.), Представлены GUID в браузере и функцией на сервере. Когда GUID представлен как часть HTTP-запроса, функция применяется (вызывается) с предоставленными параметрами. Поскольку идентификаторы GUID трудно прогнозировать и они зависят от конкретного сеанса, атаки с повторным воспроизведением и многие атаки с изменением параметров намного сложнее с Lift, чем с большинством других веб-сред, включая Spring. Это также означает, что разработчики более продуктивны, потому что они сосредоточены на действиях пользователя и бизнес-логике, связанной с действиями пользователя, а не на том, как упаковать и распаковать HTTP-запрос.
ajaxButton("Accept", () => {request.accept.save;
SetHtml("acceptrejectspan", <span/>}) ++
ajaxButton("Reject", () => {request.reject.save;
SetHtml("acceptrejectspan", <span/>})
Это так просто. Поскольку friendRequest находится в области действия при создании функции, функция закрывается в области действия ... нет необходимости открывать первичный ключ запроса на добавление в друзья или делать что-либо еще ... просто определите текст кнопки (ее может быть локализован или извлечен из шаблона XHTML или извлечен из локализованного шаблона) и функции, выполняемой при нажатии кнопки. Lift заботится о назначении GUID, настройке вызова Ajax (через jQuery или YUI и, да, вы можете добавить свою любимую библиотеку JavaScript), выполнении автоматических повторных попыток с откатами, предотвращении голодания соединения путем постановки запросов Ajax и т. Д.
Итак, одно большое различие между Lift и Spring заключается в том, что философия Lift, связанная с GUID, связанной с функцией, имеет двойное преимущество: гораздо лучшую безопасность и гораздо большую производительность разработчиков. GUID -> Ассоциация функций оказалась очень надежной ... та же конструкция работает для обычных форм, ajax, комет, многостраничных мастеров и т. Д.
Следующей основной частью Lift является поддержание абстракций высокого уровня как можно дольше. На стороне генерации страницы это означает создание страницы в виде элементов XHTML и сохранение страницы в виде XHTML до начала передачи ответа. Преимущества - устойчивость к ошибкам межсайтового скриптинга, возможность перемещать теги CSS в заголовок и скрипты внизу страницы после ее создания, а также возможность перезаписи страницы на основе целевого браузера. Со стороны ввода, URL-адреса могут быть переписаны для извлечения параметров (как параметров запроса, так и параметров пути) безопасным для типов образом, данные высокого уровня, проверенные на безопасность, доступны для обработки на самом раннем этапе цикла запроса. Например, вот как определить обслуживание запроса REST:
serve {
case "api" :: "user" :: AsUser(user) :: _ XmlGet _ => <b>{user.name}</b>
case "api" :: "user" :: AsUser(user) :: _ JsonGet _ => JStr(user.name)
}
Используя встроенное в Scala сопоставление с образцом, мы сопоставляем входящий запрос, извлекаем третью часть пути и получаем пользователя, который соответствует этому значению, и даже применяем проверки контроля доступа (имеет ли текущий сеанс или запрос разрешения на доступ к заданному Запись пользователя). Таким образом, к тому времени, когда экземпляр User попадает в логику приложения, он проверяется.
Благодаря этим двум основным элементам Lift обладает огромным преимуществом с точки зрения безопасности. Чтобы дать вам представление о величине безопасности Lift, которая не мешает функционированию , Расмус Лердорг, который занимался безопасностью для Yahoo! было что сказать о FourSquare (один из сайтов-потомков Lift):
Четыре звезды на @foursquare - 1-й сайт за то время, что я внимательно посмотрел, у которого не было ни одной проблемы безопасности (которую я мог бы найти) - http://twitter.com/rasmus/status/5929904263
В то время в FourSquare был один инженер, работавший над кодом (не то, чтобы @harryh не был супер-гением), и его основным направлением было переписывание PHP-версии FourSquare, одновременно справляясь с удвоением трафика за неделю.
Последняя часть центра безопасности Lift - SiteMap. Это унифицированный контроль доступа, навигация по сайту и система меню. Разработчик определяет правила контроля доступа для каждой страницы, используя код Scala (например, If(User.loggedIn _)
или If(User.superUser _)
), и эти правила контроля доступа применяются перед началом любого рендеринга страницы. Это очень похоже на Spring Security, за исключением того, что он запекается с самого начала проекта, а правила контроля доступа унифицированы с остальной частью приложения, поэтому вам не нужно иметь процесс для обновления правил безопасности в XML, когда URL-адреса изменить или методы, которые рассчитывают изменение контроля доступа.
Подводя итог, можно сказать, что философия дизайна Lift дает вам преимущества, связанные с управлением доступом, устойчивостью к 10 уязвимостям безопасности OWASP, гораздо лучшей поддержкой Ajax и гораздо более высокой производительностью разработчиков, чем Spring.
Но Lift также дает вам лучшую поддержку Comet из всех веб-фреймворков. Вот почему Novell выбрала Lift для питания своего продукта Pulse, и вот что Novell говорит о Lift:
Lift - это вид веб-фреймворка, который позволяет вам, как разработчику, сосредоточиться на общей картине. Сильная, выразительная печать и высокоуровневые функции, такие как встроенная поддержка Comet, позволяют вам сосредоточиться на инновациях, а не на сантехнике. Создание полноценного веб-приложения реального времени, такого как Novell Pulse, требует каркаса с возможностями Lift под прикрытием.
Таким образом, Lift - это не просто еще один MVC-фреймворк. Это фреймворк, в котором заложены некоторые основные принципы проектирования, которые очень хорошо созрели. Это структура, которая дает двойные преимущества безопасности и производительности разработчика. Lift - это фреймворк, который встроен в слои и предоставляет разработчику правильный выбор в зависимости от его потребностей ... выбор для создания представления, выбор для сохранения и т. Д.
Scala и Lift дают разработчикам гораздо лучший опыт, чем смешение XML, аннотаций и других идиом, составляющих Spring.