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

В предыдущей части я расказал о том, что такое Scalatra, показал как её установить и создать скелет проекта. В этой части я опишу создание первого проекта на примере key -> value хранилища в связке с MongoDB. Чтож... без лишних слов, давайте приступим!

Прежде всего необходимо определиться с тем, что мы хотим видеть в итоге - простое key -> value хранилище, в которое можно записывать новые значения (CREATE) и получать полный список всех значений (READ). Для первого проекта вполне достаточно.

Для начала выберем интерфейс взаимодействия с MongoDB. На мой взгляд, для этой роли прекрасно подходит библиотека Casbah. Укажем эту зависимость в файле project/build.scala:

"org.mongodb" %% "casbah" % "2.7.2"

На странице Casbah можно найти подробное описание того, как работает эта библиотека. Нам же, для нашего проекта, понадобятся:

Создадим пакет controllers в основном пакете приложения, в нём новый контроллер StorageController.scala:

package net.lon10.firstProject.controllers
 
import net.lon10.firstProject.FirstProjectStack
import com.mongodb.casbah.Imports._
 
class StorageController(storageCollection: MongoCollection /*Биндинг коннекта к контроллеру*/) extends ScalatraserviceStack {
  post("/") {
    val pair = MongoDBObject(params("key") -> params("value")) // Создание нового объекта из параметров
    storageCollection.insert(pair) // Сохранение объекта в коллекцию  
  }
 
  get("/") {
    storageCollection.find() // Список всех объектов в коллекции
    for { x <- storageCollection} yield x // Рендеринг списка. Не json, конечно, но это уже другая история ;)
  }
}

Таким образом у нас есть контроллер, ответственный за все действия, определённые нами в начале - CREATE, READ. Подмонтируем его к роуту "/" в ScalatraBootsrap:

import com.mongodb.casbah.Imports._
import net.lon10.firstProject.controllers.StorageController
import org.scalatra._
import javax.servlet.ServletContext
 
class ScalatraBootstrap extends LifeCycle {
  override def init(context: ServletContext) {
    val mongoClient = MongoClient("localhost", 27017) // Коннект к MongoDB 
    val storageCollection = mongoClient("scalatra_simple_service")("storage") // Определение коллекции в MongoDB
 
    context.mount(new StorageController(storageCollection), "/") // Монтирование контроллера, биндинг коннекта.
  }
}

Готово! Давайте запустим scalatra - сервер и проверим его работу.

Создание новой записи можно протестировать curl'ом:

curl -i -H "Accept: application/json" -X POST -d "key=first_key&value=first_value" http://localhost:8080/

Список всех записей можно получить, открыв в браузере localhost:8080.

Код проекта доступен на Github.


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