HTML Diff
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