0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В коде ниже данные от пользователей принимаются и сохраняются как есть. То есть мы полагаем, что пользователи вводят данные корректно:</p>
1
<p>В коде ниже данные от пользователей принимаются и сохраняются как есть. То есть мы полагаем, что пользователи вводят данные корректно:</p>
2
<p>На практике такого не бывает. Данные могут быть неполными, ошибочными или неподходящими для нашей системы. В этом уроке мы научимся работать с такими данными.</p>
2
<p>На практике такого не бывает. Данные могут быть неполными, ошибочными или неподходящими для нашей системы. В этом уроке мы научимся работать с такими данными.</p>
3
<h2>Что такое валидация</h2>
3
<h2>Что такое валидация</h2>
4
<p>Получив данные от пользователя, мы должны их проверить. Такая проверка называется<strong>валидацией</strong>. Валидация включает два основных элемента:</p>
4
<p>Получив данные от пользователя, мы должны их проверить. Такая проверка называется<strong>валидацией</strong>. Валидация включает два основных элемента:</p>
5
<ul><li>Проверка входных данных на корректность - например, заполнены ли обязательные поля или совпадает ли пароль и его подтверждения</li>
5
<ul><li>Проверка входных данных на корректность - например, заполнены ли обязательные поля или совпадает ли пароль и его подтверждения</li>
6
<li>Проверка возможности выполнить операцию - например, мы не сможем зарегистрировать нового пользователя, если он пытается ввести почту, связанную с уже существующим аккаунтом</li>
6
<li>Проверка возможности выполнить операцию - например, мы не сможем зарегистрировать нового пользователя, если он пытается ввести почту, связанную с уже существующим аккаунтом</li>
7
</ul><h2>Как проверить корректность данных</h2>
7
</ul><h2>Как проверить корректность данных</h2>
8
<p>Проверить корректность введенного пароля можно простым сравнением:</p>
8
<p>Проверить корректность введенного пароля можно простым сравнением:</p>
9
<p>Что делать дальше? Будет логично, если мы отобразим ту же форму с двумя важными дополнениями:</p>
9
<p>Что делать дальше? Будет логично, если мы отобразим ту же форму с двумя важными дополнениями:</p>
10
<ul><li>Нужно сохранить введенные данные, чтобы пользователю не пришлось заполнять все поля заново</li>
10
<ul><li>Нужно сохранить введенные данные, чтобы пользователю не пришлось заполнять все поля заново</li>
11
<li>Нужно вывести сообщения об ошибках - например, списком над формой</li>
11
<li>Нужно вывести сообщения об ошибках - например, списком над формой</li>
12
</ul><p>Посмотрим сразу на готовый код для решения этой задачи, а потом разберем его.</p>
12
</ul><p>Посмотрим сразу на готовый код для решения этой задачи, а потом разберем его.</p>
13
<p><strong>Шаг 1</strong>. Создаем дата-класс, который передает в шаблон данные формы и ошибки. Ошибки передаются в виде объекта, который формирует Javalin в случае ошибки валидации:</p>
13
<p><strong>Шаг 1</strong>. Создаем дата-класс, который передает в шаблон данные формы и ошибки. Ошибки передаются в виде объекта, который формирует Javalin в случае ошибки валидации:</p>
14
<p><strong>Шаг 2</strong>. Расширяем обработчик. Добавляем встроенный механизм валидации Javalin и обработку его исключений:</p>
14
<p><strong>Шаг 2</strong>. Расширяем обработчик. Добавляем встроенный механизм валидации Javalin и обработку его исключений:</p>
15
<p>Валидация в Javalin работает через методы *AsClass. Они возвращают валидатор, который содержит набор методов для дополнительных проверок. Здесь мы использовали метод check(), который принимает на вход два параметра:</p>
15
<p>Валидация в Javalin работает через методы *AsClass. Они возвращают валидатор, который содержит набор методов для дополнительных проверок. Здесь мы использовали метод check(), который принимает на вход два параметра:</p>
16
<ul><li>Функцию-предикат, в которой выполняется проверка</li>
16
<ul><li>Функцию-предикат, в которой выполняется проверка</li>
17
<li>Строку, которую мы выведем при проваленной проверке</li>
17
<li>Строку, которую мы выведем при проваленной проверке</li>
18
</ul><p>Если валидация провалена, Javalin выкидывает исключение ValidationException. Далее мы перехватываем его, чтобы отрисовать форму. Затем мы идем в блок catch, берем данные формы и это исключение, после чего передаем все в шаблон<em>users/build.jte</em>на отрисовку.</p>
18
</ul><p>Если валидация провалена, Javalin выкидывает исключение ValidationException. Далее мы перехватываем его, чтобы отрисовать форму. Затем мы идем в блок catch, берем данные формы и это исключение, после чего передаем все в шаблон<em>users/build.jte</em>на отрисовку.</p>
19
<p><strong>Шаг 3</strong>. Заполняем шаблон данными и выводим ошибки:</p>
19
<p><strong>Шаг 3</strong>. Заполняем шаблон данными и выводим ошибки:</p>
20
<p>Чтобы заполнить данные, достаточно применить интерполяцию в нужных элементах формы. А вот вывод ошибок выглядит чуть сложнее. Все дело в структуре объектов для представления ошибок.</p>
20
<p>Чтобы заполнить данные, достаточно применить интерполяцию в нужных элементах формы. А вот вывод ошибок выглядит чуть сложнее. Все дело в структуре объектов для представления ошибок.</p>
21
<p>Каждая ошибка представляет собой Map, потому что один валидатор может генерировать несколько ошибок. Например, мы можем добавить проверку на длину пароля:</p>
21
<p>Каждая ошибка представляет собой Map, потому что один валидатор может генерировать несколько ошибок. Например, мы можем добавить проверку на длину пароля:</p>
22
<p><strong>Шаг 4</strong>. Дополняем обработчик формы создания пользователя, потому что теперь его шаблон работает с BuildUserPage:</p>
22
<p><strong>Шаг 4</strong>. Дополняем обработчик формы создания пользователя, потому что теперь его шаблон работает с BuildUserPage:</p>
23
23