Первый проект на Scalatra (Часть 1)

В этой статье я бы хотел рассказать о замечательном и, без сомненья, интересном мини-web-фреймворке Scalatra. Статья разбита на две части. В первой я объясню как установить этот фреймворк, затем кратко пробегусь по его структуре и настройке. Во второй приведу пример простенького сервиса key - value хранилища в связке с MongoDB.

Эта статья предназначена для начинающих, но, надеюсь, опытные программисты тоже смогут почерпнуть для себя что-то новое.


Что это такое

Scalatra - это свободно распространяемый web-фреймворк, написанный на Scala. По-сути это старая-добрая Sinatra, но с поддержкой Java окружения.

"Scalatra is a simple, accessible and free web micro-framework. It combines the power of the JVM with the beauty and brevity of Scala, helping you quickly build high-performance web sites and APIs." - scalatra.org

Актуальная версия на момент написния статьи - 2.3.0


Установка

Вам понадобится Java 7. Что бы узнать версию явы, выполните в консоли:

$ java -version

Вывод должен быть примерно таким:

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

Scalatra устанавливается через Giter8, который ставится через Conscript.

Conscript:

curl https://raw.githubusercontent.com/n8han/conscript/master/setup.sh | sh

Добавим "~/bin" в окружение:

PATH=$PATH:~/bin
export PATH
source ~/.bash_profile # (для Mac)
source ~/.bashrc       # (для Linux)

Giter8:

cs n8han/giter8

Создание первого проекта

С помощью Giter8 создаём каркас проекта:

g8 scalatra/scalatra-sbt 

В процессе создания, надо будет ответить на несколько вопросов:

$ g8 scalatra/scalatra-sbt 
organization [com.example]: net.lon10
package [com.example.app]: net.lon10.firstProject
name [My Scalatra Web App]: First Project
servlet_name [MyScalatraServlet]: FirstProject
scala_version [2.11.1]: 2.11.1
version [0.1.0-SNAPSHOT]: 1.0.0

Описание параметров:

Инсталятор создаст скелет scalatra-приложения в директории с названием вашего проекта. Для сборки Scalatra использует Simple Build Tool. Чтобы собрать проект и попасть в sbt-консоль, необходимо выполнить следующие комманды:

cd /your/project/directory
chmod u+x sbt
./sbt

После того, как sbt отработает первый запуск, скачает необходимые зависимости и скомпилирует скелет приложения (что занимает довольно много времени), можно запустить сервер коммандой:

> container:start

Уже можно посмотреть результат в браузере localhost:8080. Чтобы не перезапускать сервер после каждой итерации изменения кода, нужно выполнить в консоли:

> ~ ;copy-resources;aux-compile

Это сигнал, который будет посылаться sbt каждый раз, когда код изменится. Подробнее это описанно здесь.


Структура проекта

project
|_build.properties  <= Определяет используюмую версию sbt
|_build.scala       <= Зависимости и конфиги проекта
|_plugins.sbt       <= Используемые в проекте sbt-плагины

src
|_ main
|  |_ scala
|  |  |   |_ScalatraBootstrap.scala             <= Монтирование сервисов
|  |  |_net
|  |      |_ lon10
|  |         |_ firstProject
|  |            |_ FirstProjectServlet.scala    <= Основной сервлет приложения
|  |_ webapp                                    <= Всё, что связано с frontend'ом
|     |_ WEB-INF
|        |_ views
|        |  |_ hello-scalate.scaml
|        |_ layouts
|        |  |_ default.scaml
|        |_ web.xml
|_ test                                         <= Тесты
   |_ scala
      |_ net
         |_ lon10
            |_ firstProject
               |_ FirstProjectServletSpec.scala

Плагины

На самом деле, Scalatra - всего лишь sbt-плагин, наш проект билдится sbt, а в plugins.sbt прописана зависимость:

addSbtPlugin("org.scalatra.sbt" % "scalatra-sbt" % "0.3.5")

Мы так же можем подключить и другие плагины, а sbt сам скачает их из репозиториев и скомпилирует. Например, что бы добавить в проект поддержку LESS, нужно включить в plugins.sbt новый репозиторий и прописать новую зависимость:

resolvers += Resolver.url(
  "bintray-sbt-plugin-releases",
    url("http://dl.bintray.com/content/sbt/sbt-plugin-releases"))(
      Resolver.ivyStylePatterns)
 
resolvers += "softprops-maven" at "http://dl.bintray.com/content/softprops/maven"
 
addSbtPlugin("me.lessis" % "less-sbt" % "0.2.2")

Файл build.scala пока трогать не будем. О нём поговорим в следующей части.


Роуты

Сервлет FirstProjectServlet монтируется к роуту "/" в файле "ScalatraBootstrap.scala":

override def init(context: ServletContext) {
  context.mount(new FirstProjectServlet(), "/")
}

А уже в FirstProjectServlet.scala определяются роуты, относительно точки монтирования. Например, код:

get("/") {
  "Hello, Scalatra!"
}
 
post("/add") {
  "Added!"
}

Добавит два новых роута в приложение:

GET  -> "127.0.0.1:8080/"
POST -> "127.0.0.1:8080/add"

Если монтировать сервлет не к "/", а к, например, "new_route", то роуты станут:

GET  -> "127.0.0.1:8080/new_route/"
POST -> "127.0.0.1:8080/new_route/add"

Вот, в общем-то и всё. В следующей части подробно посмотрим код на Scala на живом примере.


09.12.2014
Обсуждение недоступно