0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы познакомимся с обработчиками и выясним, как ими пользоваться.</p>
1
<p>В этом уроке мы познакомимся с обработчиками и выясним, как ими пользоваться.</p>
2
<h2>Что такое обработчик</h2>
2
<h2>Что такое обработчик</h2>
3
<p>Главная содержательная часть в файле<em>HelloWorld.java</em>- это обработчик запроса ctx -> ctx.result("Hello World"):</p>
3
<p>Главная содержательная часть в файле<em>HelloWorld.java</em>- это обработчик запроса ctx -> ctx.result("Hello World"):</p>
4
<p>На каждый адрес задается<strong>обработчик</strong>- это функция, которая подготавливает ответ по заданному адресу и возвращает его. Затем веб-сервер превращает этот ответ в HTTP-ответ и отправляет клиенту. В примере выше, обработчик отдает строку<em>Hello World</em>на запрос GET /.</p>
4
<p>На каждый адрес задается<strong>обработчик</strong>- это функция, которая подготавливает ответ по заданному адресу и возвращает его. Затем веб-сервер превращает этот ответ в HTTP-ответ и отправляет клиенту. В примере выше, обработчик отдает строку<em>Hello World</em>на запрос GET /.</p>
5
<p>В Javalin все приложение представлено объектом класса Javalin. Этот объект содержит методы, аналогичные методам HTTP:</p>
5
<p>В Javalin все приложение представлено объектом класса Javalin. Этот объект содержит методы, аналогичные методам HTTP:</p>
6
<ul><li>get</li>
6
<ul><li>get</li>
7
<li>post</li>
7
<li>post</li>
8
<li>put и так далее</li>
8
<li>put и так далее</li>
9
</ul><p>Эти методы принимают на вход два параметра:</p>
9
</ul><p>Эти методы принимают на вход два параметра:</p>
10
<ul><li>Сам обработчик</li>
10
<ul><li>Сам обработчик</li>
11
<li>Маршрут, для которого он вызовется</li>
11
<li>Маршрут, для которого он вызовется</li>
12
</ul><p>В простейшем случае<strong>обработчик</strong>- это лямбда, которая принимает на вход объект ctx (<em>context</em>). Через этот объект идет чтение данных HTTP-запроса и формирование HTTP-ответа. В нашем примере мы установили тело ответа через метод ctx.result(). Остальные параметры фреймворк установил по умолчанию - например, код ответа<em>200</em>.</p>
12
</ul><p>В простейшем случае<strong>обработчик</strong>- это лямбда, которая принимает на вход объект ctx (<em>context</em>). Через этот объект идет чтение данных HTTP-запроса и формирование HTTP-ответа. В нашем примере мы установили тело ответа через метод ctx.result(). Остальные параметры фреймворк установил по умолчанию - например, код ответа<em>200</em>.</p>
13
<p>Во фреймворках принято считать, что<strong>маршрут</strong>- это комбинация метода HTTP и адреса. Другими словами, с точки зрения большинства фреймворков<em>GET /users</em>и<em>POST /users</em>- это разные маршруты со своими обработчиками.</p>
13
<p>Во фреймворках принято считать, что<strong>маршрут</strong>- это комбинация метода HTTP и адреса. Другими словами, с точки зрения большинства фреймворков<em>GET /users</em>и<em>POST /users</em>- это разные маршруты со своими обработчиками.</p>
14
<p>Посмотрим, как это работает на практике. Определим соответствующие маршруты и выполним запросы к ним с помощью curl:</p>
14
<p>Посмотрим, как это работает на практике. Определим соответствующие маршруты и выполним запросы к ним с помощью curl:</p>
15
<p>Таким способом можно добавлять любое количество обработчиков на любые адреса.</p>
15
<p>Таким способом можно добавлять любое количество обработчиков на любые адреса.</p>
16
<h2>Что такое диспетчеризация</h2>
16
<h2>Что такое диспетчеризация</h2>
17
<p>Когда приложение получает запрос, как оно понимает, какой обработчик нужно запускать? Эту задачу решает<strong>диспетчеризация запроса</strong>, реализованная внутри фреймворка. Упрощенно этот процесс выглядит так:</p>
17
<p>Когда приложение получает запрос, как оно понимает, какой обработчик нужно запускать? Эту задачу решает<strong>диспетчеризация запроса</strong>, реализованная внутри фреймворка. Упрощенно этот процесс выглядит так:</p>
18
<ol><li>Фреймворк анализирует параметры запроса и пытается сопоставить два маршрута - добавленный в объект app и полученный в запросе. Другими словами, он сравнивает комбинацию метода запроса и сам адрес. Этот процесс называется<strong>роутингом</strong>или<strong>маршрутизацией</strong></li>
18
<ol><li>Фреймворк анализирует параметры запроса и пытается сопоставить два маршрута - добавленный в объект app и полученный в запросе. Другими словами, он сравнивает комбинацию метода запроса и сам адрес. Этот процесс называется<strong>роутингом</strong>или<strong>маршрутизацией</strong></li>
19
<li>Если во время роутинга фреймворк нашел соответствующий маршрут, тогда вызывается его обработчик. Далее ответ от обработчика отправляется обратно клиенту</li>
19
<li>Если во время роутинга фреймворк нашел соответствующий маршрут, тогда вызывается его обработчик. Далее ответ от обработчика отправляется обратно клиенту</li>
20
<li>Если фреймворк не нашел нужный обработчик, то запускается обработчик по умолчанию, который возвращает ошибку 404</li>
20
<li>Если фреймворк не нашел нужный обработчик, то запускается обработчик по умолчанию, который возвращает ошибку 404</li>
21
</ol>
21
</ol>