Введение в Jooby

Введение в Jooby

1. обзор

Jooby - это масштабируемая и быстрая микро-веб-платформа, построенная на основе наиболее часто используемогоNIO web servers. Он очень простой и модульный, явно разработанный для современной веб-архитектуры. Он также поддерживаетJavascript иKotlin.

По умолчаниюJooby отлично поддерживаетNetty, Jetty, and Undertow.

В этой статье мы узнаем об общей структуре проектаJooby и о том, как создать простое веб-приложение с использованиемJooby.

2. Архитектура приложений

Простая структура приложенияJooby будет выглядеть примерно так:

├── public
|   └── welcome.html
├── conf
|   ├── application.conf
|   └── logback.xml
└── src
|   ├── main
|   |   └── java
|   |       └── com
|   |           └── example
|   |               └── jooby
|   |                   └── App.java
|   └── test
|       └── java
|           └── com
|               └── example
|                   └── jooby
|                       └── AppTest.java
├── pom.xml

Здесь следует отметить, что в каталогеpublic мы можем помещать статические файлы, такие как css / js / html и т. Д. В каталогеconf мы можем поместить любой файл конфигурации, который нужен приложению, напримерlogback.xml илиapplication.conf и т. Д.

3. Maven Dependency

Мы можем создать простое приложениеJooby, добавив следующую зависимость в нашpom.xml:


    org.jooby
    jooby-netty
    1.1.3

Если мы хотим выбратьJetty илиUndertow, мы можем использовать следующую зависимость:


    org.jooby
    jooby-jetty
    1.1.3


    org.jooby
    jooby-undertow
    1.1.3

Вы можете проверить последнюю версию проектаJooby в папкеCentral Maven Repository.

Jooby also has a dedicated Maven archetype. Мы можем использовать его для создания примера проекта со всеми необходимыми заранее построенными зависимостями.

Мы можем использовать следующий скрипт для генерации примера проекта:

mvn archetype:generate -B -DgroupId=com.example.jooby -DartifactId=jooby
-Dversion=1.0 -DarchetypeArtifactId=jooby-archetype
-DarchetypeGroupId=org.jooby -DarchetypeVersion=1.1.3

4. Создание приложения

4.1. Запуск сервера

Чтобы запустить встроенный сервер, нам нужно использовать следующий фрагмент кода:

public class App extends Jooby {
    public static void main(String[] args) {
        run(App::new, args);
    }
}

После запуска сервер будет работать наdefault port8080.

Мы также можем настроить внутренний сервер с настраиваемым портом и настраиваемым портомHTTPS:

{
    port( 8081 );
    securePort( 8443 );
}

4.2. Реализация маршрутизатора

Создать маршрутизатор на основе пути вJooby очень просто. Например, мы можем создать маршрутизатор для пути «/login» следующим образом:

{
    get( "/login", () -> "Hello from example");
}

Аналогичным образом, если мы хотим обрабатывать другие методыHTTP, такие как POST, PUT и т. Д., Мы можем использовать приведенный ниже фрагмент кода:

{
    post( "/save", req -> {
        Mutant token = req.param( "token" );
        return token.intValue();
    });
}

Здесь мы получаем токен имени параметра запроса из запроса. По умолчанию все параметры запроса приводятся к типу данныхJooby ’sMutant. Исходя из ожидания, мы можем преобразовать его в любой поддерживаемый тип данных примитива.

Мы можем проверить любой URL-параметр следующим образом:

{
    get( "/user/{id}", req -> "Hello user : " + req.param("id").value() );
    get( "/user/:id", req -> "Hello user: " + req.param("id").value() );
}

Мы можем использовать любой из вышеперечисленных. Также возможно найти параметры, начинающиеся с фиксированного содержания. Например, мы можем найти параметр URL, начинающийся с «uid:'», следующим образом:

{
    get( "/uid:{id}", req -> "Hello User with id : uid" +
        req.param("id").value());
}

4.3. Реализация контроллера шаблона MVC

Для корпоративного приложенияJooby поставляется с API MVC, как и любые другие среды MVC, такие как Spring MVC.

Например, мы можем обработать путь с именем «/hello»:

@Path("/hello")
public class GetController {
    @GET
    public String hello() {
        return "Hello example";
    }
}

Точно так же мы можем создать обработчик для обработки других HTTP-методов с помощью@POST, @PUT, @DELETE и т. Д. аннотаций.

4.4. Обработка статического содержимого

Для обслуживания любого статического контента, такого как HTML, Javascript, CSS, изображения и т. Д., Нам необходимо поместить этот файл в каталогpublic.

После размещения с маршрутизатора мы можем сопоставить любой URL с этими ресурсами:

{
    assets( "/employee" , "form.html" );
}

4.5. Форма обращения

Jooby’s ИнтерфейсRequest по умолчанию обрабатывает любой объект формы без использования ручного приведения типов.

Предположим, нам нужно отправить данные о сотрудниках через форму. На первом этапе нам нужно создать объект bean-компонентаEmployee, который мы будем использовать для хранения данных:

public class Employee {
    String id;
    String name;
    String email;

    // standard constructors, getters and setters
}

Теперь нам нужно создать страницу для создания формы:

Затем мы создадим обработчик сообщений для обращения к этой форме и получения отправленных данных:

post( "/submitForm", req -> {
    Employee employee = req.params(Employee.class);
    // ...
    return "empoyee data saved successfullly";
});

Здесь следует отметить, что нам нужно объявить формуenctype какapplication/x-www-form-urlencoded для поддержки динамической привязки формы.

ЧерезRequest.file(String filename) мы можем получить загруженный файл:

post( "/upload", req -> {
    Upload upload = req.file("file");
    // ...
    upload.close();
});

4.6. Реализация фильтра

Изначально, Jooby обеспечивает гибкость для определения глобальных фильтров, а также фильтров на основе путей.

Реализовать фильтр вJooby немного сложно, посколькуwe need to configure the URL path twice, once for the filter and once again for the handler.

Например, если нам нужно реализовать фильтр для URL-пути с именем «/filter',, нам нужно явно реализовать фильтр в этом пути:

get( "/filter", ( req, resp, chain ) -> {
    // ...
    chain.next( req, resp );
});

Синтаксис очень похож на фильтрServlet. Можно ограничить запрос и отправить ответ в самом фильтре, вызвав методResponse.send(Result result).

Как только фильтр реализован, нам нужно реализовать обработчик запросов:

get("/filter", (req, resp) -> {
    resp.send("filter response");
});

4.7. сессия

Jooby имеет два типа реализации сеанса; в памяти и на основе файлов cookie.

Реализация управления сессиями в памяти довольно проста. У нас есть возможность выбрать любое из хранилищ сеансов с высокой пропускной способностью, доступных сJooby, напримерEhCache, Guava, HazleCast, Cassandra, Couchbase, Redis, MongoDB, иMemcached.

Например, чтобы реализовать хранилище сеансов на основе Redis, нам нужно добавить следующую зависимость Maven:


    org.jooby
    jooby-jedis
    1.1.3

Теперь мы можем использовать приведенный ниже фрагмент кода, чтобы включить управление сессиями:

{
    use(new Redis());
    session(RedisSessionStore.class);

    get( "/session" , req -> {
        Session session = req.session();
        session.set("token", "value");
        return session.get("token").value();
    });
}

Здесь следует отметить, что мы можем настроить URLRedis как свойство‘db' вapplication.conf.

Чтобы включить управление сеансом на основе файлов cookie, нам нужно объявитьcookieSession(). If cookie based approach is selected, we must need to declare application.secret property in the application.conf file. Поскольку каждый файл cookie будет подписан этим секретным ключом, всегда рекомендуется использовать длинный случайный фрагмент строки в качестве секретного ключа. **

При подходе как в памяти, так и на основе файлов cookie, мы должны объявить необходимый параметр конфигурации в файлеapplication.conf, иначе приложение будет выдаватьIllegalStateException при запуске.

5. тестирование

Тестирование маршрута MVC действительно легко, так как маршрут привязан к стратегии для некоторого класса. Это облегчает запуск модульных тестов для всех маршрутов.

Например, мы можем быстро создать тест-кейс для URL по умолчанию:

public class AppTest {

    @ClassRule
    public static JoobyRule app = new JoobyRule(new App());

    @Test
    public void given_defaultUrl_expect_fixedString() {

        get("/").then().assertThat().body(equalTo("Hello World!"))
          .statusCode(200).contentType("text/html;charset=UTF-8");
    }
}

Здесь следует отметить, что использование аннотации@ClassRule создаст только один экземпляр сервера для всех тестовых случаев. Если нам нужно создать отдельные экземпляры серверов для каждого тестового примера, мы должны использовать аннотацию@Rule без модификатора static.

Мы также можем использоватьJooby’s MockRouter для проверки пути таким же образом:

@Test
public void given_defaultUrl_with_mockrouter_expect_fixedString()
  throws Throwable {

    String result = new MockRouter(new App()).get("/");

    assertEquals("Hello World!", result);
}

6. Заключение

В этом руководстве мы изучили проектJooby и его основные функции.

Как всегда, доступен полный исходный кодover on GitHub.