Автор оригинала: 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 интерфейс доступен для получения заготовок запроса:
IterablerequestHeaders = 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 Optroute(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 .