Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Ratpack — гениально перепето

Anna | 5.06.2014 | нет комментариев

Исторически сложилось, что Groovy берет много классного у Ruby. В первую очередь, безусловно Grails (от Rails), но и Spock (от Spec) и даже где-то Gradle (от Buildr, правда никто не сознается). Сегодня я вам расскажу про еще одну толковую «спертую» штуку — web framework Ratpack.
image
Списан Ratpack с Sinatra, о котором много написано на Прогре, скажем вот здесь.
На мой взор, основное преобладание Синатры — что он гениальный певец что это примитивный в применении и молниеносный в разработке фреймворк. Сделать несколько примитивных страниц, менять их и видеть итоги налету, и за несколько часов сваять довольно нетривиальный сайт с динамическим контентом — это как раз то, для чего и был придуман Синатра. Это, своего рода, результат «ожиревшим» Рельсам. Верно в такой же роли (результата «ожиревшим» Грейлзам) Синатра и перекочевал в Груви.

Должен подметить, что на сей раз сообщество Груви были не первыми, кто передрал Синатру. Первыми были Scala, со своей Скалатрой (ага, результат на «ожиревший» Play). Насколько я знаю, решение не делать наименование схожим на слух, а искать ассоциацию по смыслу, было принято в первую очередь, придя в ужас от звучания наименования версии Скалы :)

Ratpack переводится на русский как Крысиная стая, и привязка к Синатре в том, что это тусовка, в которой тусовался Франк Синатра.

А причем здесь Java?

Ну, здесь, мне кажется, все ясно. В различие от Руби, где когда-то был lightweight RoR, либо от Груви с его Грейлз, в Джаве никогда не было «легковесных» фреймворков. У нас есть либо массивные server-side component фреймворки типа JSF и Wicket, либо MVC фреймворки, которые, безусловно, легче компонентных монстров, но все равно, требуют нагородить MVC для примитивной странички. Здесь, безусловно, я говорю о Spring MVC и Struts2. И всё это с чудовищно неторопливым циклом разработки «поменял слово? перезагрузи!». Бррр.

Как неизменно, преобладание Груви для програмистов Джава — что они Ощущают себя как дома. 99% Java кода работает в Грувях без изменений, следственно всякий Груви фреймворк либо инструмент может быть неотлагательно использован Java программистом.
Обстановка и с ratpack еще отменнее — разработчики намеренно постарались, Дабы дозволено было писать на чистой Джаве, не задействуя Груви ни на одном этапе разработки. Один из примеров в этой статье будет написан 100% на Java. Кого не интерсует всё это Грувийное шаманство, перекручивает прямо на конечный пример. Остальные начинают тут:

Hello, World!

Ну, я думаю, начать нужно с Hello, World!, правда? Полновесное веб-приложение на ratpack выглядит так:

@GrabResolver('http://oss.jfrog.org/artifactory/libs-snapshot') //(1)
@Grab('org.ratpack-framework:ratpack-groovy:0.9.0-SNAPSHOT')
import static org.ratpackframework.groovy.RatpackScript.ratpack

ratpack { //(2)
    handlers {
        get {
            response.send 'Hello, world!' //(3)
        }
    }
}

Всё. Добросовестно. Пишем это в файл (скажем ratpack.groovy), запускаем через groovy ratpack.groovy:
INFO: Ratpack started for http://localhost:5050
Послушно идем на http://localhost:5050 и обнаруживаем там ожидаемое:

Давайте посмотрим, что же мы написали:

  1. Это инструкция скачать все нужные библиотеки с бесплатного opensource аккаунта Artifactory
  2. Это объявление приложения, оно состоит из обработчиков и модулей
  3. Это обработчик команды get. От того что у него нет параметров, он отработает по вызову root url. Здесь-то мы и умоляем воротить Hello World.

 

Добавляем еще один handler

Вписываем в наш ratpack.groovy еще один обработчик:

ratpack {
    handlers {
        get {
            response.send 'Hello, world!'
        }
        get('habr'){
            response.send 'Hello, habr!' //наш новейший обработчик
        }
    }
}

Файл сберегаем, в браузере идем на http://localhost:5050/habr, наслаждаемся.

Перезагружать? Нееее, это не для нас. Кто молодец? Spring-loaded молодец.

Добавим динамизьму

Прибавим скорости и интересу. Код:

ratpack {
    handlers {
        get('hello/:username') {
            response.send "Hello, ${pathTokens.username}"
        }
    }
}

Итог:

Ну, либо так. Код:

ratpack {
    handlers {
        get('hello') {
            response.send "Hello, ${request.queryParams.username}"
        }
    }
}

Итог:

Подключаем образцы

Дозволено упомянуть еще о многих увлекательных фичах, но статья теснее и так не короткая, а я еще будет пример на чистой Джаве, следственно давайте посмотрим на работу с образцами. Для примера возьмем Groovy template:
Образцы лежат в директории templates. Сбережем там, скажем, index.html со дальнейшим оглавлением:

<html>
<head>
    <title>${model.title}</title>
</head>
<body>
    <h5>${model.content}</h5>
    <br/>
    <img src="http://habr.habrastorage.org/post_images/9a5/14b/49a/9a514b49a2017e50f386f154c8cb0da2.png"/>
</body>
</html>

Скрипт с обработчиком сейчас выглядит так:

@GrabResolver('http://oss.jfrog.org/artifactory/libs-snapshot')
@Grab('org.ratpack-framework:ratpack-groovy:0.9.0-SNAPSHOT')
import static org.ratpackframework.groovy.RatpackScript.ratpack
import static org.ratpackframework.groovy.Template.groovyTemplate

ratpack {
    handlers {
        get {
            render groovyTemplate("index.html", title: 'Здравствуй Прогру от Ratpack', content: 'Здесь логотипы:')
        }
    }
}

Обратите внимание на новейший static import.
Итог ждем:

Кто ожидал Джавы? Их есть у нас!

Ну, здесь не будет запускаемого скрипта, и не ожидайте. Здесь будет солидное приложение, со конструкцией директорий, модулями, с файлом сборки.
Dependency injection будет на Guice, веб-сервер на netty, сборка и запуск на gradle, перезагрузка с помощю Spring-loaded.
Поехали:
Конструкция плана:

Файл ratpack.properties говорит кто есть HandlerFactory (откуда брать обработчиков):

handlerFactory=example.HandlerFactory

Класс example.HandlerFactory является, натурально factory для обработчиков. У нас там только один,Hello, %username%:

package example;

import ...

public class HandlerFactory implements org.ratpackframework.launch.HandlerFactory {

    public Handler create(LaunchConfig launchConfig) {
        return chain(new Action<Chain>() {
            public void execute(Chain chain) {
                chain.add(get("hello/:username", new Handler() {
                    public void handle(Context context) {
                        Map<String, String> pathTokens = context.getPathTokens();
                        context.getResponse().send("Hello from Java, "   pathTokens.get("username"));
                    }
                }));
            }
        });
    }
}

Да, Java 8 не помешал бы.
Здесь все схоже на Грувийную версию — добавляем обработчик на путь hello/:username, потом берем значение динамической части пути из context.getPathTokens().

Запускаем task-ом run, перекомпилируем метаморфозы task-ом classes (в ином окне, run останавливать не нужно):

Итог:

Добросовестно говоря, Java пример получился не дюже симпатичным. Нагородили классов и директорий, когда это все дозволено написать в 4 строчках Груви. Так для чего?
Превосходства Джавы начинаются при росте в трудности и размере. Неожиданно, распределение на классы и пакеты, жесткое типизирование и вероятность тестов становятся гораздо главней числа файлов и строк. Дабы увидеть эти приемущества, посмотрите на больше полный пример Java приложения на Ratpack вот здесь. Я уверен, вы осознаете о каких превосходствах я говорю.

Завершение

Безусловно, это самые основы, безусловно, в Ratpack есть гораздо огромнее плюшек, чем я теперь показал. Это и модули Guice-а, и сервисы, и интеграция с MongoDB и с GORM-ом.

Применение Java классов для обработчиков, модулей и сервисов дает вероятность создавать модулярное и легко тестируемое приложение средней трудности.
Применение Groovy скриптов дает вероятность значительно больше стремительной разработки чего-либо простого, «на коленке», с впечатляющими итогами.

Я верю, что смог заинтересовать вас этим фреймворком. Как вы могли подметить, даже первая версия еще пока не вышла (правда теснее скоро), следственно я бы не стал переписывать на него mission-critical приложения, но он достоин того, что обратить на него внимание, и испробовать наваять на нем вашу следующую «чудовищную домашнюю страничку»

P.S.

Если вы хотите продолжения, пишите в комменты.
Если вы хотите пообщаться на счет Ratpack-а лично, а так-же послушать про другие увлекательные штуки, приходите на JUG 31-го августа.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB