Рубрики
Без рубрики

Введение в принимает

Узнайте о Takes – неизменяемой и объектно-ориентированной веб-платформе для Java

Автор оригинала: Anshul Bansal.

1. Обзор

В экосистеме Java доступно множество веб-платформ, таких как Spring, Play и Grails. Однако ни один из них не может претендовать на то, чтобы быть полностью непреложным и объектно-ориентированным.

В этом учебнике мы изумим платформу Takes и создадим простое веб-приложение, используя его общие функции, такие как маршрутизация, обработка запросов/ответов и унитарное тестирование.

2. Принимает

Takes является непреложной веб-платформой Java 8, которая не использует недействительный ни общественные статические методика.

Кроме того, фреймворка не поддерживает мутируемые классы, литье или отражение . Следовательно, это истинная объектно-ориентированная структура.

3. Настройка

Во-первых, мы добавим последние занимает Maven зависимость от пом.xml :


    org.takes
    takes
    1.19

Затем давайте создадим TakesHelloWorld класс, который реализует Возьмите интерфейс:

public class TakesHelloWorld implements Take {
    @Override
    public Response act(Request req) {
        return new RsText("Hello, world!");
    }
}

Возьмите интерфейс обеспечивает основополагающую особенность фреймворка. Каждая Возьмите служит в качестве обработчик запроса, возвращая ответ через действовать метод .

Здесь мы использовали RsText класс для визуализации простого текста Здравствуй, мир! в ответ, когда запрос делается в TakesHelloWorld брать.

Далее мы создадим ПринимаетApp класс для запуска веб-приложения:

public class TakesApp {
    public static void main(String... args) {
        new FtBasic(new TakesHelloWorld()).start(Exit.NEVER);
    }
}

Здесь мы использовали FtBasic класс, который обеспечивает базовую реализацию Передняя интерфейс для запуска webserver и перемотка запроса в TakesHelloWorld брать.

Принимает реализует свой собственный веб-сервер без состояния с помощью класса ServerSocket. По умолчанию он запускает сервер в порту 80. Тем не менее, мы можем определить порт в коде:

new FtBasic(new TakesHelloWorld(), 6060).start(Exit.NEVER);

Или мы можем пройти номер порта, используя параметр командной строки -Порт .

Затем давайте компилировать классы с помощью команды Maven:

mvn clean package

Теперь мы готовы запустить ПринимаетApp класс как простое Java-приложение в IDE.

4. Бегите

Мы также можем запустить нашу ПринимаетApp класс как отдельное приложение веб-сервера.

4.1. Командная линия Java

Во-первых, давайте составить наши классы:

javac -cp "takes.jar:." com.baeldung.takes.*

Затем мы можем запустить приложение с помощью командной строки Java:

java -cp "takes.jar:." com.baeldung.takes.TakesApp --port=6060

4.2. Мавен

Или, мы можем использовать exec-maven-plugin плагин, чтобы запустить его через Maven :


    
        reload
        
            
                
                    org.codehaus.mojo
                    exec-maven-plugin
                    1.6.0
                    
                        
                            start-server
                            pre-integration-test
                            
                                java
                            
                        
                    
                    
                        com.baeldung.takes.TakesApp
                        false
                        
                            --port=${port}
                        
                   
                
            
        
    

Теперь мы можем запустить наше приложение с помощью команды Maven:

mvn clean integration-test -Preload -Dport=6060

5. Маршрутизация

Рамки обеспечивают ТкФорк класс для маршрутов запросов на различные принимает.

Например, давайте добавим несколько маршрутов в наше приложение:

public static void main(String... args) {
    new FtBasic(
        new TkFork(
            new FkRegex("/", new TakesHelloWorld()),
            new FkRegex("/contact", new TakesContact())
        ), 6060
    ).start(Exit.NEVER);
}

Здесь мы использовали FkRegex класс, чтобы соответствовать пути запроса.

6. Обработка запросов

В рамках предусмотрено несколько классы декоратора в org.takes.rq пакет для обработки запроса HTTP.

Например, мы можем использовать RqMethod интерфейс для извлечения метода HTTP:

public class TakesHelloWorld implements Take { 
    @Override
    public Response act(Request req) throws IOException {
        String requestMethod = new RqMethod.Base(req).method(); 
        return new RsText("Hello, world!"); 
    }
}

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

Iterable requestHeaders = new RqHeaders.Base(req).head();

Мы можем использовать RqPrint класс, чтобы получить тело запроса:

String body = new RqPrint(req).printBody();

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

String username = new RqFormSmart(req).single("username");

7. Обработка ответов

Принимает также предоставляет много полезных декораторов для обработки ответа HTTP в org.takes.rs пакет.

Декоратор ответа реализует головная и тело методы Ответные интерфейс.

Например, RsWithStatus класс отображает ответ кодом статуса:

Response resp = new RsWithStatus(200);

Выход ответа может быть проверен с помощью головная метод:

assertEquals("[HTTP/1.1 200 OK], ", resp.head().toString());

Аналогичным образом, RsWithType класс отображает ответ с помощью типа содержимого:

Response resp = new RsWithType(new RsEmpty(), "text/html");

Вот, RsEmpty класс отображает пустой ответ.

Аналогичным образом, мы можем использовать RsWithBody класса, чтобы сделать ответ с телом.

Итак, давайте создадим ПринимаетКонтакт класс и использовать обсуждаемые декораторы для визуализации ответа:

public class TakesContact implements Take {
    @Override
    public Response act(Request req) throws IOException {
        return new RsWithStatus(
          new RsWithType(
            new RsWithBody("Contact us at https://www.baeldung.com"), 
            "text/html"), 200);
    }
}

Аналогичным образом, мы можем использовать RsJson класса для визуализации ответа JSON:

@Override 
public Response act(Request req) { 
    JsonStructure json = Json.createObjectBuilder() 
      .add("id", rs.getInt("id")) 
      .add("user", rs.getString("user")) 
      .build(); 
    return new RsJson(json); 
}

8. Обработка исключений

Рамки содержат Обратный интерфейс для обработки исключительных условий. Он также предоставляет несколько реализаций для обработки сценариев возврата.

Например, давайте использовать TkFallback для обработки HTTP 404 и показывает сообщение пользователю:

public static void main(String... args) throws IOException, SQLException {
    new FtBasic(
        new TkFallback(
          new TkFork(
            new FkRegex("/", new TakesHelloWorld()),
            // ...
            ),
            new FbStatus(404, new RsText("Page Not Found"))), 6060
     ).start(Exit.NEVER);
}

Здесь мы использовали FbStatus класса для обработки обратного назад по определенному коду состояния.

Аналогичным образом, мы можем использовать FbChain класс для определения комбинации обратных вариантов:

new TkFallback(
    new TkFork(
      // ...
      ),
    new FbChain(
      new FbStatus(404, new RsText("Page Not Found")),
      new FbStatus(405, new RsText("Method Not Allowed"))
      )
    ), 6060
).start(Exit.NEVER);

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

new FbChain(
    new FbStatus(404, new RsText("Page Not Found")),
    new FbStatus(405, new RsText("Method Not Allowed")),
    new Fallback() {
        @Override
        public Opt route(RqFallback req) {
          return new Opt.Single(new RsText(req.throwable().getMessage()));
        }
    }
)

9. Шаблоны

Давайте интегрируем Apache Velocity с нашим веб-приложением Takes, чтобы обеспечить некоторую функцию шаблонирования.

Во-первых, мы добавим скорость двигателя ядра Зависимость maven:


    org.apache.velocity
    velocity-engine-core
    2.2

Тогда мы будем использовать RsVelocity класс для определения строки шаблона и параметров связывания в действовать метод:

public class TakesIndex implements Take {
    @Override
    public Response act(Request req) throws IOException {
        return new RsHtml(
            new RsVelocity("${username}", new RsVelocity.Pair("username", "Baeldung")));
        );
    }
}

Здесь мы использовали RsHtml класса для визуализации ответа HTML.

Кроме того, мы можем использовать шаблон скорости с RsVelocity класс:

new RsVelocity(this.getClass().getResource("/templates/index.vm"), 
    new RsVelocity.Pair("username", username))
);

10. Тестирование единицы

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

Например, давайте напишем удельный тест для нашей ПринимаетКонтакт класс с использованием JUnit :

String resp = new RsPrint(new TakesContact().act(new RqFake())).printBody();
assertEquals("Contact us at https://www.baeldung.com", resp);

11. Интеграционное тестирование

Мы можем протестировать все приложение с помощью JUnit и любого клиента HTTP.

Рамки обеспечивают FtRemote класс, который запускает сервер в случайном порту и обеспечивает пульт дистанционного управления для выполнения Возьмите .

Например, давайте напишем интеграционный тест и проверим ответ ПринимаетКонтакт класс:

new FtRemote(new TakesContact()).exec(
    new FtRemote.Script() {
        @Override
        public void exec(URI home) throws IOException {
            HttpClient client = HttpClientBuilder.create().build();    
            HttpResponse response = client.execute(new HttpGet(home));
            int statusCode = response.getStatusLine().getStatusCode();
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity);
            
            assertEquals(200, statusCode);
            assertEquals("Contact us at https://www.baeldung.com", result);
        }
    });

Здесь мы использовали Apache HttpClient, чтобы сделать запросы на сервер и проверить ответ.

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

В этом учебнике мы изучили платформу Takes, создав простое веб-приложение.

Во-первых, мы увидели быстрый способ настройки фреймворка в нашем проекте Maven и запуска нашего приложения.

Затем мы рассмотрели несколько общих функций, таких как маршрутизация, обработка запросов/ответов и удельное тестирование.

Наконец, мы изучили поддержку единицы и интеграционных испытаний, предоставляемых рамками.

Как обычно, все реализации кода доступны более на GitHub .