Play framework Scala

Отже, давайте подивимося, що з себе являє play.

Прошу пробачити мені користувачів windows, але так як у мене debian, я надаватиму рішення для користувачів unix. Сподіваюся, ви розберетеся.

У нас все готово, можна приступати до створення програми. У цьому уроці ми з вами створимо простенький todo-додаток.

index

scala

Введення в Play і Scala (частково)

Настав час подивитися, що було згенеровано командою «play new todolist» Якщо ви використовуєте idea, то зупините сервер (Ctrl + D), і введіть

Тепер, коли всі потрібні модулі для idea створено, ми можемо відкрити наш проект у IDE (цей крок лише для користувачів Intellij Idea). Ми бачимо структуру проекту:

scala

Найважливіші для нас папки, це app (де лежать всі компоненти MVC), і conf (з конфігом програми та routes). Якщо ви вже знайомі з MVC, то можете трохи поекспериментувати. Але спочатку розберемося, чому, коли ми заходимо на localhost:9000, то бачимо не порожню сторінку. Зайдемо в conf/routes, бачимо там:

Виходячи з цього, йдемо в app/controllers/Application.scala:

Що ж це за магічний рядок у def index, який дозволяє нам побачити сторінку, повну інформації. Давайте розбиратися. Але для початку хочу пояснити (для тих, хто не знайомий із Scala). Запис типу

означає, що функція повертає Action (це частина фреймворку, не поглиблюватимемося; просто скажу, що Action обробляє запит, і відправляє відповідь у браузер). Так, і ще. Як ви вже встигли помітити, у Scala точки з комою необов'язкові (тільки якщо ви записуєте кілька виразів в один рядок, наприклад:

). Тепер розберемося з рядком

Перше: кожен вираз ускелі має значення. Так функція index повертає значення цього єдиного рядка. Друге: розберемо сам рядок. Функція "Ok" створює "200 OK" відповідь, заповнена html контентом, з view`а під назвою index.scala.html (дефолтні views у play на Scala template language; якщо ви хочете - можете використовувати haml, або ще щось) . Давайте відкриємо app/views/index.scala.html:

Перший рядок тут - сигнатура функції. А далі можна писати html код, із вставками scala (які починаються із символу @). Тепер ви можете знову запустити сервер у режимі розробки і трохи поексперементувати, але перед тим як продовжити скасуйте всі зміни.

Розвиток подій

А тепер ми почнемо створювати todo додаток.

Крок перший: Routes & Controller

Для початку налаштуємо файл conf/routes:

Крім стандартних, ми додали ще 4 rout'a. Вони дозволять нам переглядати завдання (перший), створювати завдання (другий), видаляти завдання (третій) і робити завдання завершеним (четвертий).

Тепер для кожного шляху треба створити дії в app/controllers/Application.scala:

Давайте тепер спробуємо запустити сервер і подивимося, що сталося.

Заходимо на localhost:9000/tasks, і бачимо:

index

Маленький відступ: ми не хочемо, щоб користувачі нашої програми бачили сторінку, яка генерується функцією index контролера Action, тому внесемо до контролера (app/controllers/Application.scala) маленькі зміни:

Функція Redirect перенаправить нас на

Крок другий: Model

Як ви вже помітили, папки controllers і views згенерувалися, а папку models нам доведеться створити вручну. У корені програми з консолі:

Тепер створимо файл Task.scala. Він і стане нашоюмодель. Отже, app/models/Task.scala:

Зверніть увагу, запис

рівноцінна такому запису на java:

А тепер давайте трохи відвернемося до моделі, і перейдемо до

Третій крок: Views

Змінимо вміст файлу app/views/index.scala.html на:

Зверніть увагу на:

У першому рядку ми додали в сигнатуру два параметри: список завдань, і «якийсь дивний» taskForm. Про нього ми поговоримо трохи згодом. Далі йде імпорт. Слід зазначити, що запис у scala «import helper._» аналогічний запису на java «import helper.*». Цей імпорт надає нам функцію form, яка створює тег з атрибутами action і method, а також функцію inputText, що створює кілька полів: input для введення, label пояснює, що вводити, і ще label`и, які повідомляють про помилки. Всі інші записи після @, мій погляд, інтуїтивно зрозумілі.

Перейдемо до "невідомої" taskForm. Внесемо деякі модифікації у файл app/controllers/Application.scala:

    Додамо пару імпортів для роботи з формами:

Виготовимо саму taskForm:

Четвертий крок: усі разом

Настав час продовжити роботу над головною сторінкою (де виводиться список усіх справ, а також форма додавання справ).

Шаблон для неї вже виготовлений (app/views/index.scala.html). Тепер треба доопрацювати контролер та модель. Почнемо ми з контролера:

  • додамо імпорт моделі в контролер
  • закінчимо роботу з def tasks

Те, що ми передаємо в views.html.index() - ми передаємо у функцію, сигнатура якої знаходиться на першому рядку файлу index.scala.html. Наразі Ви можете перевірити результати нашої незакінченої роботи. Відкрийте в браузері localhost:9000/tasks, і, якщо ви все робили правильно, ви побачите:

scala

Ви можете спробувати натиснути кнопку Create, але ми ще не написали def newTask, та й бази даних для зберігання інформації у нас ще немає. Для початку закінчимо def newTask, яка оброблятиме дані з форми taskForm:

    Для початку додамо пару імпортів (для дати)

а тепер напишемо саму функцію NewTaks

Для людини, не знайомої зі Scala, синтаксис цього коду буде зрозуміло важко, тому я просто поясню, що він робить. З запиту ми отримуємо дані форми, які обробляємо (функцією bindFromRequest.fold()). Якщо є помилки у запиті, то виконується функція BadRequest, яка зупиняє процес, повертає нас на головну сторінку та виводить усі помилки. Далі нам треба обробити ще й саме завдання (label), і того, хто створив ідею (who). Також ми знаходимо час створення (зауважте, воно не відправляється з формою, просто записується час створення завдання), і викликаємо функцію Task.create(). Як і функцію Task.all ми скоро допишемо у файлі app/models/Task.scala. Ну і тепер, коли все створено ми переправляємо користувача на головну сторінку.

Настав час звернутися до бази даних.

Що нам лишилося зробити?Підключитися-таки до бази даних, дописати методи моделі та контролера. Займемося базою даних.

Зараз настав час відкрити сторінку localhost:9000/tasks в браузері. Ви повинні побачити таку картинку:

scala

Play знайшов нашу еволюцію і хоче її виконати.Натисніть "Apply this script now".Для "зв'язку" з базою даних ми будемо використовуватиanormдля того, щоб перетворити JDBC сирої ResultSet на значення Task. Для початку додамо імпорти:

А тепер додамо основний код:

Тутtaskвиступає парсером значень, які ми отримуватимемо від JDBC ResultSet Тепер, коли парсер написаний, ми можемо сміливо приступати до приєднання до бази даних. Додамо імпорти:

А тепер закінчуємо функції all, create, delete та complete:

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

Тепер ви можете створювати справи. Спробуйте перейти до localhost.9000/tasks і створити кілька справ. Але ні видаляти, ні робити завершеними ви ще не можете.

Залишилося пару штрихів. Небагато доробимо фал app/views/index.scala.html. Ось цей код:

Вітаю! Якщо ви чесно слідували за статтею, то зараз у вас є додаток, що повністю працює. Разом із справами воно може виглядати так:

scala

Тепер перейдемо до розгортання програми. Я буду використовувати git та heroku. Але для початку треба створити Procfile в корені програми (у папці todolist):

Також змініть project/Build.scala:

Це треба зробити тому, що ми використовували базу даних H2, а на heroku база даних - PostgreSQL. Нарешті ми можемо перейти до безпосереднього розгортання (у вас має бути встановлена ​​heroku, і ви повинні бути зареєстровані на сайті heroku.com), якщо ні:

Підведемо підсумки. Сьогодні ми познайомилися з мовою програмування Scala (не все, звичайно), з фреймворком Play. Користуватися ним чи ні – вирішувати вам. Я на простому прикладі показав усю простоту їхнього використання. Мені б хотілося, щоб кожен, хто прочитав цю статтю, почав користуватися набутими знаннями та розвивати їх.Пишіть на scala зplay!

Корисні посилання: