Шикарный...
Spiffy — это веб-фреймворк, использующий Scala, Akka (реализация субъекта Scala) и API Java Servelet 3.0. Он использует асинхронный интерфейс и стремится предоставить массово-параллельную и масштабируемую среду для веб-приложений. Все различные компоненты Spiffy основаны на идее, что они должны быть независимыми минималистичными модулями, которые очень быстро выполняют небольшой объем работы и передают запрос следующему компоненту в конвейере. После того, как последний компонент завершил обработку запроса, он сигнализирует контейнеру сервлетов, «завершая» запрос и отправляя его обратно клиенту.
Добавьте несколько маршрутов:
// index page, no code, just text
"""^/$""".r -> "Welcome to Spiffy!",
// main news page
new Regex("""^/(news)/$""") -> NewsController(),
// view some news by id
new Regex("""^/(news)/(view)/(d+)/$""") -> NewsController()
Напишите контроллер:
def receive = {
// handles "news/add/"
case ControllerMsg(List("news", "save"), req, res, ctx) => {
// run validation on the request using Spiffy's validation DSL
var errors:Map[String, Set[String]] = validate (req) (
"email" as email confirmedBy "email_confirm",
"email_confirm" as email,
"title" as (string, 32),
"body" as string,
"tag" as string optional
) match {
case Some(List(errs,warns)) => { // Problem validating
errs
}
case None => None.toMap // passed validation
}
}
// handles "/news/"
case ControllerMsg(List("news"), req, res, ctx) => {
// load up news and stuff in map then render
val params = loadNews
view() ! ViewMsg("news", params, req, res, ctx)
}
// handles "/news/view/$newsId/"
case ControllerMsg(List("news", "view", newsId), req, res, ctx) => {
// usually you want to load the item, in this example we dont
// load item and set the params that the view will render
val news = loadNewsItem(newsId)
val params:Map[Any,Any] = Map("news" -> news)
// ask the view to render
view() ! ViewMsg("newsView", params, req, res, ctx)
}
}
Затем создайте несколько шаблонов. Вы можете узнать больше об этом примере, просмотрев NewsController и SpiffyConfig.
На данный момент, чтобы использовать Spiffy, вы должны собрать jar (mvn jar:jar) и добавить его в путь к классам вашего приложения. Вы также должны определить следующую переменную среды (подойдет context.xml):
<Environment name="SpiffyConfigObject" value="org.spiffy.config.SpiffyBuiltinConfig" type="java.lang.String"/>
Вам необходимо заменить org.spiffy.config.SpiffyBuiltinConfig
объектом, который расширяет org.spiffy.config.SpiffyConfig
и предоставляет все необходимые значения. Взгляните на SpiffyConfig для примера.
Спиффи полагается на актеров Akka, чтобы разделить и изолировать все его различные компоненты. Каждый компонент конвейера Spiffy (кроме начального фильтра) состоит из пула актеров Akka. Акторы Spiffy поддерживаются пулами балансировки нагрузки различных типов диспетчеров.
Spiffy реализован как фильтр. После того, как фильтр получает запрос, он переводит его в асинхронный режим и отправляет маршрутизатору. Затем маршрутизатор решает, что делать с запросом, проверяя URL-адрес запроса и сравнивая его со списком известных сопоставлений контроллеров. Сопоставление — это регулярное выражение, которое соответствует запрошенному URL-адресу и назначает его соответствующему контроллеру. Если найдено успешное совпадение, маршрутизатор отправит контроллеру сообщение с запросом (и всеми необходимыми объектами, которые необходимо отправить вместе с ним). На этом этапе работа маршрутизатора завершена, и он может обрабатывать новые входящие запросы. После того, как контроллер получит запрос, он выполнит любую необходимую логику в отношении запроса и может решить завершить запрос или передать его другому компоненту Spiffy (обычно обработчику представления).
Spiffy использует концепцию перехватчиков для выполнения логики, которую можно инкапсулировать и запускать до и после определенных компонентов конвейера платформы. Хуки можно запускать до и после контроллеров и представлений. Перехватчик, который будет запущен до того, как контроллер решит вообще обойти контроллер, или может просто выполнить некоторую логику, такую как аутентификация или изменение самого запроса, прежде чем контроллер получит возможность работать с ним. Перехватчик, который запускается после контроллера, также может перенаправить запрос на другой контроллер, изменить его или завершить его тут же, отправив его обратно клиенту. Одна и та же логика используется перед и после представлений, где перехватчик может полностью остановить рендеринг представления или может передать визуализированный вывод в другую часть платформы, которая может выполнить дополнительную работу над визуализированным выводом.