Что такое play framework
Задача
Свой небольшой эксперимент я решил провести со Scala и Play! версии 2.1, который идет в комплекте с IDE от JetBrains IntelliJ IDEA. Удобным является то, что запустить приложение можно прямо в IDEA.
Play! Framework
На самом деле, для простого приложения этого более чем достаточно. А делать ничего сильно серьезного и не планировали: просто перенесем предыдущее приложение в веб.
Представление
Представления в Play имеют расширение *.scala.html и, по сути, являются такими же функциями и могут вызываться одно из другого:
В представлении index.scala.html мы можем написать следующий код:
На деле всё это соберется во что-то похожее на следующий кусок:
Контроллеры
Контроллеры располагаются в модуле controllers. Каждый контроллер должен наследоваться от класса play.api.mvc.Controller .
Конфигурирование путей (routs) необходимо производить в файле /conf/routes . Например, строка
Модели
Приложение
Так как мы делаем веб-приложение, то возможностей у нас больше: будет отображаться не просто список заголовков вопросов. Заголовки будут являться ссылками на сами вопросы на StackOverflow. Так же добавим в список вопросов автора вопроса со ссылкой на его профиль.
Приложение будет включать три представления: index.scala.html (“главная” страница нашего сайта), search.scala.html (страница с поиском и результатами поиска) и мастер-представление main.scala.html . В приложении будет так же один контроллер Application.scala , который будет содержать всю логику и модель QuestionModel.scala , содержащая описание вопроса.
Данные классы написаны на основе ответа от API StackOverflow:
json4s позволяет просто распарсить ответ в виде JSON-строки к case -классу:
Представление search.scala.html ожидает на вход объект класса scala.collection.immutable.List[models.QuestionModel] (об этом чуть позже). Для этого преобразуем наш объект класса Questions к scala.collection.immutable.List[models.QuestionModel] и вернем его в представление search.scala.html :
Класс QuestionModel не содержит никакой логики:
На каждой странице приложения должна быть возможность поиска вопросов. Таким образом, форму поиска вопросов можно вынести в представление main.scala.html . Так же каждая страница должна иметь стандартную html разметку (теги <html> , <head> и т.п.). Следовательно, их тоже можно вынести в это представление:
В представлении index.scala.html означим заголовок страницы и значение тега title :
Строка @(message: String) значит, что в это представление можно передать строку, которой потом можно будет воспользоваться в представлении. Что и делаем в строке <h1>@message</h1> . Строка @main("Welcome to SO searcher") < >вызывает представление main.scala.html с первым параметром Welcome to SO searcher и пустым вторым параметром. Т.е. в итоге эти два представления сольются в одну страницу.
Представление search.scala.html имеет чуть более сложную структуру. В этом представлении требуется отображать резульататы поискового запроса. К счастью, как говорилось выше, представления в Play! являются Scala -функциями и позволяются использовать Scala -код (правда с некоторыми ограничиениями).
Нам достаточно базовой функциональсти предоставляемой шаблонизатором Play! : проход по циклу и формирование разметки маркированного списка с примененем соответствующего класса, если вопрос содержит ответ:
Заключение
Так получилось, что в мире Scala многие вещи очень быстро меняются. Поэтому, если вы хотите получить наиболее актуальную информацию по Play Framework, вам лучше обратиться к официальной документации от Typesafe. Тем не менее, большинство общих моментов остаются неизменными. Поэтому давайте попытаемся разобраться, как вообще выглядит проект на Play Framework.
На момент написания этих строк создание нового проекта на Play происходило при помощи утилиты Typesafe Activator как-то так:
Полученная при этом структура проекта:
.. activator
. activator.bat
. activator-launch-1.2.10.jar
. app
? . controllers
? ? . Application.scala
? . views
? . index.scala.html
? . main.scala.html
. build.sbt
. conf
? . application.conf
? . routes
. LICENSE
. project
? . build.properties
? . plugins.sbt
. public
? . images
? ? . favicon.jpg
? . javascripts
? ? . hello.js
? . stylesheets
? . main.css
. README
. test
. ApplicationSpec.scala
. IntegrationSpec.scala
Тут следует обратить внимание на следующее:
Для компиляции и запуска проекта говорим:
По умолчанию приложение слушает порт 9000. При изменении кода проекта перекомпиляция будет происходить автоматически.
Еще можно прогнать тесты:
А еще есть совершенно сумасшедшая штука:
Итак, допустим, мы хотим добавить в наше приложение новую страничку. Как это сделать? Для начала необходимо создать новый роут в файле conf/routes. Делается это примерно так:
GET /topic-$topicId<3+>/ controllers.AppController.topic(tid: Long)Добавляем метод в соответствующем контроллере:
Помимо Ok также можно вернуть, например:
Использовать созданную заранее вьюшку тоже не обязательно:
Наконец, вьюха, используемая в методе topic, должна быть определена в файле views/topics.html.scala примерно так:
@import org.joda.time.DateTime
@import commons.TextProcessor
@(topicId: Long, topicTitle: String, authorName: String,
topicText: String, topicCreated: DateTime,
commentsSeq: Seq[(Long, String, String, DateTime)])
@for(commentInfo <- commentsSeq) @* UNDER CONSTRUCTION (это - комментарий) *@
>
>
Как видите, формат шаблонов довольно незатейлив. Заметьте, что шаблоны по сути представляют собой функции с аргументами определенных типов. В данном случае функция возвращает тип Html. Шаблоны могут вызывать друг друга. В примере выше используется шаблон main.scala.html, определенный примерно таким образом:
@(title: String)(content: Html)
Файл favicon.ico, как несложно догадаться, должен лежать в public/images.
Что же касается моих впечатлений от работы с Play Framework, на момент написания этих строк я нахожу его лучшим из известных мне веб-фреймворков.
Это стабильная, обкатанная в бою технология с большим количеством людей, использующих ее. Писать сайты на Play не сложнее, чем, например, на Mojolicious. Но при этом мы также получаем строгую статическую типизацию, которая, например, не позволяет вам передать в шаблон параметры неправильного типа, или сослаться на URL, для которого нет контроллера.
Я уже не говорю о том, что Play работает на JVM, а значит (1) благодаря JIT все очень быстро превращается в машинный код, (2) проект можно запустить практически где угодно, (3) мир Java дает нам кучу библиотек практически на любой случай. О чем еще можно мечтать?
На самом деле, можно мечтать о том, чтобы Scala компилировалась чуточку быстрее. Впрочем, на нормальной машине (MacBook Pro и сравнимые железки) время компиляции получается вполне разумным.
А что вы думаете о Play Framework?
Дополнение: На случай, если у вас создалось впечатление, будто в Play Framework поддерживается только синхронная обработка запросов, отмечу, что это не так. Футуры тоже поддерживаются. Подробности можно найти в документации.
Play Framework - это среда веб-приложений с открытым исходным кодом, которая следует архитектурному шаблону модель – представление – контроллер (MVC) . Он написан на Scala и может использоваться из других языков программирования, скомпилированных в байт-код JVM , например Java . Он направлен на оптимизацию производительности разработчиков за счет использования соглашения по настройке , перезагрузки горячего кода и отображения ошибок в браузере. [2]
Поддержка языка программирования Scala доступна начиная с версии 1.1 фреймворка. [3] В версии 2.0 ядро фреймворка было переписано на Scala. Сборка и развертывание были перенесены на SBT , а шаблоны используют Scala [4] вместо Apache Groovy .
СОДЕРЖАНИЕ
Play был создан разработчиком программного обеспечения Гийомом Борт, когда он работал в Zengularity SA (ранее Zenexity). [5] Хотя ранние выпуски больше не доступны в Интернете, есть свидетельства существования Play еще в мае 2007 года. [6] В 2007 году предварительные версии проекта были доступны для загрузки с веб-сайта Zenexity. [7]
Play обеспечивает интеграцию со средами тестирования для модульного и функционального тестирования приложений Scala и Java. Для Scala интеграция со Scalatest и Specs2 предоставляется "из коробки", а для Java есть интеграция с JUnit 4. Для обоих языков также есть интеграция с Selenium (программное обеспечение) . SBT используется для запуска тестов, а также для создания отчетов. Также можно использовать инструменты покрытия кода, используя плагины sbt, такие как scoverage или jacoco4sbt .
По состоянию на октябрь 2013 [Обновить] года Play Framework является самым популярным проектом Scala на GitHub . [21] В июле 2015 года Play была 3-й по популярности библиотекой Scala в Github на основе 64 562 библиотек. 21,3% ведущих проектов Scala использовали Play в качестве фреймворка. [22]
В декабре 2010 года была выпущена первая электронная книга для платформы Play. [23] Впоследствии это было также опубликовано в бумажном виде . В августе 2011 года была выпущена вторая книга, охватывающая более сложные и современные функции. [24]
В августе 2011 года Heroku объявила о встроенной поддержке приложений Play на своей платформе облачных вычислений . [25] Это следует за модульной поддержкой Play 1.0 (но не Play 2.x) в Google App Engine и документированной поддержкой в Amazon Web Services . [26]
В июле 2013 года Jelastic опубликовал руководство, демонстрирующее поддержку Play 2 на своей платформе облачных вычислений . [27]
В этом курсе мы предоставляем среду и набор инструментов, чтобы вы могли разрабатывать современные приложения Scala. Мы охватываем широкий спектр тем: от сборки SBT и реактивных приложений до тестирования и доступа к базе данных. С нашими простыми учебными пособиями вы сможете запустить и запустить собственные проекты за минимальное время. Проверьте это здесь !
1. Введение
Прошло много времени с тех пор, как Интернет стал доминирующей, универсально и глобально доступной платформой для множества различных приложений: веб-сайтов, веб-порталов или веб-API. Начинаясь как простой набор статических HTML-страниц, веб-приложения стремительно догоняли своих настольных аналогов, превращаясь в новый класс того, что мы привыкли называть многофункциональными интернет-приложениями (или просто RIA ). Однако большинство таких достижений было бы невозможно без эволюции (а в некоторых случаях и революции) веб-браузеров.
В этом разделе руководства мы поговорим о разработке богатых веб-сайтов и порталов (или, проще говоря, современных веб-приложений) с использованием языка программирования и экосистемы Scala .
Содержание
2. MVC и сила паттернов
Существует множество способов приблизиться к проектированию и разработке веб-приложений. Тем не менее, пара шаблонов появилась из толпы и получила широкое распространение в сообществе разработчиков программного обеспечения.
Model-View-Controller (или MVC ) является одним из наиболее широко применяемых архитектурных шаблонов, используемых для разработки поддерживаемых приложений на основе пользовательского интерфейса. Это очень просто, но обеспечивает вполне достаточный уровень разделения интересов и обязанностей.
Шаблон MVC и его сотрудники
По сути, MVC очень хорошо описывает сотрудников и их роли. View использует Model для визуализации представления рабочего стола или веб-интерфейса для User . User взаимодействует с View , что может привести к обновлению (или поиску) модели посредством использования Controller . В свою очередь, действия Controller's над Model могут привести к обновлению представления. В некоторых случаях User может взаимодействовать с Controller напрямую, полностью обходя View .
Многие фреймворки, используемые в наши дни для разработки веб-приложений, разработаны на основе шаблона MVC или одного (или нескольких) его производных. В экосистеме Scala , Play Framework, несомненно, является наилучшим из доступных вариантов, и именно об этом мы и поговорим в этом разделе руководства.
3. Play Framework: приятный и продуктивный
Play Framework — это современный, готовый к работе, высокоскоростной, полнофункциональный веб-фреймворк, написанный на Scala (с доступным для Java API). Он спроектирован так, чтобы быть полностью асинхронным, легким и не сохраняющим состояние, и построен на основе Akka Toolkit , который мы подробно обсудили в предыдущем разделе учебника. Последняя выпущенная версия Play Framework на момент написания этой статьи — 2.5.9 .
Хотя Play Framework не ограничивается поддержкой только разработки веб-приложений, мы сосредоточимся в основном на этой стороне вещей, продолжая обсуждение веб-API в следующем разделе, посвященном именно этому.
4. Контроллеры, действия и маршруты
Play Framework полностью охватывает модель MVC и с самого начала представляет концепцию контроллеров . Следуя своим обязанностям, контроллеры могут генерировать некоторые действия , возвращая некоторые результаты, например:
Читайте также: