ym104432846
Вставьте ссылку на видео из Youtube, Rutube, VK видео
Задайте вопрос по видео
Что вас интересует?
00:00:46
Понятие CRUD-приложения:
  • КРУД-приложения (Create-Read-Update-Delete) позволяют добавлять, читать, обновлять и удалять данные из базы данных
  • Веб-приложения, использующие CRUD-функциональность, чаще всего работают по протоколу HTTP, используя GET, POST, PATCH и DELETE-запросы
  • Стандартизация REST API предполагает использование определённых URL и HTTP-методов для выполнения операций над сущностью (например, получение списка сущностей, создание новой, обновление, удаление)
00:07:41
REST и CRUD:
  • На уроке планируется начать реализацию CRUD-приложения (создание, чтение, обновление, удаление) для сущности «персона»
  • Контроллер для работы с сущностью «персона» назван во множественном числе («people controller»), поскольку он управляет множеством объектов
  • На первом этапе реализации планируется реализовать только функцию чтения данных (метод GET), остальные операции будут выполнены на последующих занятиях
00:11:32
Архитектура CRUD-приложения:
  • Разработана архитектура приложения, включающая модель `person`, отдельный класс `person dao` для работы с базой данных и контроллер `people controller`
  • Для работы с базой данных выбран подход через использование паттерна проектирования «data access object (дао)», где `person dao` будет отвечать за взаимодействие с базой данных
  • Временно используется динамическая структура данных (рейлист), имитирующая базу данных, для упрощения разработки архитектуры приложения
00:15:08
Реализация CRUD-контроллера:
  • Создан новый Java-класс People (контроллер), расположенный в пакете controllers
  • Реализованы два метода в контроллере: один возвращает список всех людей, второй возвращает одного человека по идентификатору
  • В следующем уроке планируется реализация методов для создания, редактирования и удаления пользователей
00:18:56
Создание модели персоны:
  • 1. Создан новый пакет `modules` для разделения классов по смыслу в Spring приложении
  • 2. Разработана модель класса `Person`, включающая поля `id` (целое число) и `name` (строка)
  • 3. Реализованы конструкторы и геттеры/сеттеры для модели `Person`
00:19:58
Реализация DAO-класса:
  • Создан отдельный пакет для проекта под названием «дао», внутри которого планируется создать класс «персон дао»
  • Разработан параметризированный список (класс «пипл») для хранения людей, представляющий собой упрощённую базу данных, которую позже заменят настоящей базой данных
  • Реализованы два метода в классе «дао»
  • Метод `index` возвращает список всех людей
  • Метод поиска по идентификатору (`id`) возвращает одного человека, используя лямбда-выражение или цикл `for`
00:28:43
Шаблоны представлений:
  • Создана новая папка «пипл», в которой планируется разместить два шаблона: шаблон индекса и шаблон шоу
  • В шаблоне вывода списка людей использован цикл (аналог foreach), позволяющий выводить каждого человека индивидуально
  • Разработан механизм перехода по клику на имя человека на отдельную страницу с информацией о конкретном человеке
0: На этом уроке мы разберёмся с понятиями крут рест и дао и начнём разрабатывать наше крут приложение, а вы знали, что за нахождение багов в чужом по можно получить пару тройку сотен, а то и тысяч долларов программа bug bounty.
1: Позволяет заработать на этом всем желающим. Вы, конечно, можете проверить себя на внимательность и поискать ошибки вручную, а можете предоставить это дело специальному инструменту, как статический анализатор, к примеру, пиве студио способен находить ошибки в коде, написанном
2: На си плюс плюс сишарп и java, а также имеет удобный интерфейс скачивайте его, применив промокод в описании к этому уроку, и сможете целый месяц пользоваться им бесплатно и попробовать свои силы в поиске багов ссылка на скачивание пив студио.
3: И на статью про бак баунти находится в описании к этому видео удачи. Давайте начнём с того, что разберёмся с понятием крут. Крут. Это аббревиатура, которая происходит от 4 английских слов криейт рит апдейт.
4: И делит. Это стандартная классификация функций по манипуляции данными. То есть вот эти 4 базовые функции, они чаще всего используются при работе с базами данных. Мы либо что-то создаём, добавляем что-то новое.
5: В базу данных, либо мы читаем что-то из базы данных, либо мы обновляем существующее значение, либо же мы удаляем какое-то значение. Крут. Приложение это приложение, которое позволяет добавлять, читать, обновлять и удалять данные.
6: То есть вот если мы реализуем какое-то крут приложение, мы сможем обращаться к нему, и оно будет обращаться к какой-то базе данных и будет читать его из него данные и будет в эту базу данных данные записывать, обновлять.
7: Удалять данные из этой базы данных. Чаще всего круд приложения являются ещё и веб приложениями. То есть доступ к этому круд приложению мы получаем через протокол. Http, то есть какой-то клиент, например, чаще всего через
8: Браузер, он совершает эйчтипи запросы к нашему крут приложению, которое работает на веб сервере. Это get запросы для получения данных это пост, запросы для добавления новых данных. Это patch запрос.
9: Для обновления каких-то существующих данных это delete запрос для удаления данных. То есть это те самые методы, http, запроса, которые мы изучали в уроке 18. И это крут приложение, которое является ещё и веб приложение.
10: Оно уже взаимодействует с базой данных и, соответственно, добавляет, удаляет, обновляет и читает данные из этой базы данных. Большинство веб приложений в сети, это так или иначе крут приложения. Потому что если мы, например, возьмём, к примеру, какую-нибудь
11: Соцсеть, то в этой соцсети мы можем создать новую запись, мы можем обновить существующую запись, мы можем удалить свою запись и мы можем читать какие-то записи тех людей, на которых мы подписаны. То есть опять-таки в большинстве
12: Приложений прослеживается вот это вот эти 4 базовых операции, которые могут проводиться над данными. Теперь давайте разберём крут на каком-нибудь примере. Здесь я для примера взял сущность, пост, то есть запись в какой-то социальной сети и
13: Предположим, что мы хотим реализовать круд приложение для этой сущности, и хотим, чтобы это crowd, приложение было ещё веб приложением, чтобы мы могли обращаться к нему через протокол. Http, в этом случае у нас есть вот такой стандарт, какие юрлы использовать для этого и какие
14: Http методы должны быть использованы. Здесь, в этой таблице показан какой-то http метод, который используется, показан url, то есть адрес, по которому мы будем обращаться к нашему веб приложению, например,
15: Через браузер. И показано то действие, которое будет совершенно при обращении к этому юрлу с этим http методом. Если мы обратимся к адресу слэш постс с get запросом, то этот запрос
16: Он вернёт нам все записи для этой сущности пост. То есть мы получим все посты и обратите внимание на то, что здесь у нас пост во множественном числе. То есть несмотря на то, что сама сущность называется пост, то есть запись.
17: Здесь по стандартам, по конвенциям мы должны url этот адрес сделать во множественном числе. То есть посты, записи. Если мы сделаем гет запрос по этому адресу, то мы из базы данных получим все посты. Это будет как раз-таки рит.
18: Операция. Если мы сделаем пост запрос к этому же адресу, к этому же юрлу, то это уже будет означать создание какой-то новой записи. То есть операция криейт здесь в этом пост запросе в теле самого запроса мы
19: Должны будем передавать новую запись, новый пост, который мы хотим создать и при пост запросе на этот же адрес. Пост. Мы будем создавать новый пост. Мы будем добавлять новый пост, новую запись в нашу базу данных, если мы
20: Делаем гет запрос на адрес слэш пост слэш нью нам в браузер вернётся, должна вернуться по конвенции, должна вернуться html форма для создания записи, то есть если мы обратимся по этому адресу с get запросом в нашем браузер.
21: Появится html форма, где мы можем создать новый пост и эта html форма как только мы нажмём на кнопку там создать пост, эта форма, она передаст данные с формы на этот адрес слэш.
22: Пост с методом пост, то есть вот форма, которую мы видим в браузере, и вот тот адрес, на который этот, эта форма будет передавать данные. Дальше у нас тоже самое с редактированием постов, с редактированием записей.
23: У нас есть сама форма, мы её получаем с get запросом. Мы переходим на адрес слэш постс. Тут должны указать id того поста, который мы хотим отредактировать. И после этого слэш эдит. И этот http запрос должен нам вернуть html форму.
24: Для редактирования записи, когда мы эту форму там, когда мы в этой форме отредактируем нашу запись и нажмём на окей эта форма, она будет отправлена с puch запросом на этот адрес, на адрес слэш пост, слэш айди.
25: То есть вот у нас 3 здесь одинаковых юрла, но эти методы разные, и каждый из этих методов, он отвечает за какое-то своё действие. Вот с этой формы, с формы редактирования записи, данные с формы будут пересылаться п.
26: Запросом на этот адрес и здесь как раз-таки будет обновляться запись в базе данных. Дальше здесь если мы сделаем гет запрос на адрес, слэш пост слэш айди укажем здесь айди какого-то поста, то мы получим 1 запись это тоже будет опера.
27: Rit. Если в этом случае мы получали все записи с get запросом по этому адресу, то с get запросом по этому адресу мы получим 1 запись. 1 какой-то пост. Если мы совершим эйчтипи запрос с методом delete на вот этот url, то мы удалим запись
28: С id, который мы передаём в этом юрле, таким образом, для всех действий из этого круга есть какой-то свой url с каким-то своим методом, который является стандартом, и мы именно так в таком виде должны реализовывать.
29: Наши веб приложения, которые являются крут приложениями, почему именно такие юрлы используются? Почему именно такие юрлы, именно такие http методы. Дело в том, что вот это все, оно описывается стандартом, который называется rest.
30: И rest это паттерн проектирования web приложений рест описывает то, как посредством протокола http должен взаимодействовать клиент, например, браузер с сервером здесь, в этой парадигме рест, все взаимодействие с сервером, оно сводится к 4.
31: Операциям это получение данных с помощью метода get, это добавление новых данных с помощью метода post, это изменение существующих данных с помощью метода пэч или method put, но об этом мы поговорим позже и удаление данных с помощью метода delete.
32: И это конечно не все правила и ограничения, которые описаны в rest есть много других правил и каких-то архитектурных подходов, которые описаны в этом паттерне рест это достаточно широкая тема, но пока нам хватит вот этого то что rest описывает.
33: То, какие юрлы и http методы у нас должны быть для того, чтобы взаимодействовать с данными. И здесь вы можете спросить в чем же разница между rest и крут это понятия в принципе они в чем-то пересекаются, но на самом
34: Разные крут это, как я уже говорил 4 базовых функции create read update delete, которые используются при работе с базами данных rest в свою очередь это паттерн проектирования web приложений он описывает то как по протоколу http вот.
35: С этими http методами по этим url адресам мы должны взаимодействовать с сервером для чтения, добавления, изменения и удаления данных то есть он описывает какие юрлы эйчтипи методы использовать но это не все что есть в rest в rest ещё есть много всего другог.
36: Но между rest и крут есть, естественно, связь, потому что в crowd у нас есть вот эти операции для работы с базами данных рит крейт апдейт делит, и в rest у нас тоже есть эти 4 http method get post пач делит, которые делают
37: Тоже самое. И вот такие юрлы мы будем использовать для нашего web приложения. С такими http методами мы будем к этим юрела обращаться. И при обращении к этим юрлом будет происходить либо чтение данных, либо создание новых данных, либо обновле,
38: Данных, либо удаление данных, то есть крут приложение, оно может быть и не веб приложением, оно может быть, например, каким-то просто приложением, которое работает с базами данных. А rest это вот тот паттерн, который описывает как мы с помощью эйч
39: По сети должны изменять, добавлять, удалять и читать данные. Что мы будем делать на этом уроке? На этом уроке мы начнём реализовывать крут приложение для сущности персон, для сущности человек. То есть у нас будет модель человек
40: Person у нас будет people контроллер контроллер, который работает с этой моделью персон. Обратите внимание на то, что здесь опять-таки я использую множественное число. Это тоже такая конвенция по наименованию контроллеров, если у нас сущность персон,
41: В единственном числе, то контроллер должен быть во множественном числе, потому что он работает со множеством этих людей, поэтому он называется people контроллер. На этом уроке мы реализуем только операцию рит для нашей базы данных. То есть мы будем только читать людей.
42: И будем этих людей показывать в браузере, то есть при обращении, при get запросе на адрес слэш пипл мы должны будем получить список из людей, а при обращении, при get, запросе на адрес слэш, пипл слэш с каким-то айдишником мы должны
43: Будем получить какого-то конкретного человека, и все это мы должны будем отобразить в браузере на этом уроке мы реализуем только read на следующих уроках мы реализуем оставшиеся операции create update delete по диаграмме, которая была на предыдущем слайде.
44: Мы видим, что сам, сама модель, сам класс person, он напрямую взаимодействует с базой данных. На самом деле это плохо, потому что мы не хотим в самой модели, в самом классе person иметь логику взаимодействия с базой данных. Мы хотим вы
45: Логику взаимодействия с базой данных из самой модели в отдельный класс и такой паттерн проектирования, когда отдельный класс занимается взаимодействием с базой данных для какой-то сущности называется дао или data access object как это?
46: Будет выглядеть, мы не будем иметь никакой логики по взаимодействию с базой данных в нашем, в нашей модели, в нашем классе person у нас будет отдельный класс person дао, который будет инкапсулировать всю работу с
47: Всю логику работы с базой данных для этой модели person, то есть здесь в этом person дао, будут какие-то методы, мы их будем вызывать. И соответственно, этот person дао будет обращаться уже к базе данных и будет либо читать.
48: Данные из этой базы данных, либо будет создавать какую-то новую запись в базу данных, обновлять существующую запись или удалять какую-то запись. В этих дао классах обычно пишется эскьюэль код для работы с базами данных, например, если
49: Здесь у нас был скюэль, то здесь мы могли бы подключиться к этой базе данных в нашем дао и с помощью sql запросов, например, читать людей из этой базы данных или добавлять, обновлять или удалять людей в этой базе данных помимо.
50: Дао есть ещё другой паттерн взаимодействия с базами данных он называется репозиторий, он во многом похож на этот паттерн дао его мы будем изучать, когда дойдём до хайбернейт и spring data джипиэй, этот паттерн, он тоже общается с базой.
51: Данных мы тоже с помощью него получаем, например, какие-то записи или добавляем записи, но этот паттерн он предоставляет большую абстракцию над базой данных, чем дао обычно в дао люди разработчики сами пишут все запросы обычно с помощью sql.
52: Если резюмировать, то вот как должно выглядеть наше крут приложение. В финальном варианте у нас есть модель person, у нас есть person дао, который использует эту модель person. У нас есть крут. В этом приложении мы будем использовать рей лист вместо базы данных.
53: То есть данные у нас будут читаться, обновляться, добавляться и удаляться все в ray листе, в динамическом списке это мы делаем временно, потому что сейчас важно сфокусироваться на самом круде, на самой архитектуре.
54: И затем мы уже сможем. Поняв крут, мы сможем уже легко заменить вот этот рей лист на настоящую базу данных и уже делать настоящие запросы к настоящей базе данных. Но пока у нас будет динамический список в качестве такой условной базы данных дальше.
55: Person дао будет общаться с нашим списком, а people контроллер, то есть контроллер, который работает с сущностью персон, он будет обращаться к этому дао и будет либо читать с него данные, либо вызывать методы в этом дао, чтобы
56: Создать нового человека, обновить существующего человека или удалить человека. И все это все, что мы получаем от этого person. Дау, например, список всех людей или какого-то конкретного человека, мы будем отображать на страни
57: В браузере с помощью шаблонизатора тайм лиф и с помощью time Лифа мы также создадим формы, в которых мы будем каких-то людей новых создавать и будем делать по запросы или patch, запросы или delete, запросы к контроллеру.
58: Контроллер будет уже вызывать какой-то метод дала и будет добавлять, обновлять или удалять человека. Теперь давайте начнём, начнём с операции рит, реализуем чтение людей и чтение конкретного человека. Давайте перейдём к практике. Я
59: Пришёл в среду разработки, я открыл пустой спринг энвиси проект здесь обычная java конфигурация, этот проект пустой, ссылка на него будет в описании к этому уроку теперь давайте начнём и начнём с того, что реализуем контроллер. Для этого перейдём.
60: В пакет controllers и здесь создадим новый java класс, новый java класс people, контроллер, то есть контроллер людей здесь мы пометим этот класс аннотации, контроллер и пометим этот класс аннота.
61: Request маппинг, потому что все наши адреса в этом контроллере, они будут начинаться со smash people. Теперь в этом уроке мы реализуем 2 метода в этом контроллере мы реализуем метод, который будет возвращать список из людей.
62: И реализуем метод, который будет возвращать 1 человека. По его id, в следующих уроках мы реализуем методы для создания, обновления и удаления людей. Но на этом уроке мы реализуем только 2 этих метода. Давайте начнём с 1 метода, который возвращает
63: Список из людей пометим Гетт маппинг и реализуем новый метод и он будет называться индекс, этот метод пока давайте будем возвращать null, пока у нас нету.
64: Класса, и в этом методе гет маппинг будет пустой, потому что адрес этого метода будет просто smash people он у нас уже здесь есть, поэтому, набрав слэш пипл и сделав гет запрос, мы попадём в этот метод и в этом методе.
65: Мы получим из дао и передадим.
66: На отображение этих людей в представление и уже с помощью time лиф мы этих людей отобразим в представлении. Давайте здесь также передадим этому методу модель в качестве аргументов, чтобы спринг фреймворк её вне
67: Потому что нам придётся в модели передавать объект из содержащий в себе людей на представление, чтобы time лиф его, этот список из людей, чтобы он его отобразил. Теперь реализуем 2 me.
68: Этот метод будет тоже возвращать строку, то есть название нашего шаблона и будет называться шоу, и этот метод будет принимать на вход.
69: Id в самом запросе, то есть у него будет такой же get маппинг, но здесь у него будет добавлено к splash пипл, будет добавлено слэш айди и здесь мы ука.
70: Указываем вот такой вот синтаксис, мы указываем слэш и в фигурных скобках мы указываем айди. Это означает, что во время того, как мы запустим наше приложение, можно будет вот сюда поместить любое число и это число поместится.
71: В аргументы этого метода с помощью аннотации паверил мы извлечём этот id из юрла из адреса и получим к нему доступ внутри этого метода используем аннотацию паверил иии, используем целое число id.
72: То есть в этом аргументе этого метода шоу, в этом аргументе айди будет лежать то целое число, которое передаётся в адресе запроса к этому методу. Слэш пипл слэш какой-то id теперь также
73: Здесь в качестве 2 аргумента будет модель, потому что мы тоже будем передавать уже 1 человека в шаблон, и здесь мы тоже пока вернём null, когда мы реализуем дао, мы здесь добавим код, который извлекает 1.
74: Человека из дао. Здесь какая будет логика? Мы получим 1 человека, по его id из
75: Дао и передадим этого человека на отображение в представление. Теперь пойдём дальше и реализуем наш, нашу модель класс person. Для этого мы создадим новый пакет и
76: Его мы назовём modules, обычно в spring приложениях хорошим тоном считается разные по смыслу классы разделять в разные пакеты, то есть вот у нас 2 класса лежат в Папке config, это класс, относящийся к конфигурации контроллер лежит в
77: Controllers. А модель наша будет лежать в Папке modules давайте создадим нашу модель, это будет человек и у человека, у нас в нашей программе пусть будет id, то есть какой-то уникальный идентификатор какой-то
78: Целое число и пусть будет ещё имя string name. Давайте сгенерируем конструктор для этих 2 полей и сгенерируем геттеры и сеттеры. Теперь у нас модель готова. Теперь можем перейти к реализации дао.
79: Для дао у нас тоже будет отдельный пакет. Давайте его реализуем. Он будет называться дао. И в этом пакете мы создадим новый дао, который будет называться персон дао персон дао. И этот класс он будет
80: Заниматься тем, что будет общаться со списком и будет извлекать людей из списка, находить какого-то конкретного человека по id из списка, в дальнейшем будет добавлять человека в список, обновлять человека из списка и удалять человек.
81: Из списка. Список у нас сейчас это такая условная база данных, но вообще в дао мы обычно общаемся с настоящей базой данных, но здесь, чтобы пока не заморачивать голову базами данных, я
82: Решил использовать список, но когда мы будем идти дальше, мы уже перейдём на базы данных. Давайте здесь мы заведём этот самый список, который будет представлять из себя базу данных людей. И пусть он будет называться пипл. То есть люди этот
83: Список он параметризован классом персон о списках и о коллекциях в целом у меня подробно в курсе продвинутая java, ссылка тоже будет в описании к этому уроку, и теперь давайте мы в этом дао создадим.
84: Несколько людей, потому что пока мы в этом уроке не будем создавать людей. Поэтому, чтобы что-то у нас было что отображать, давайте здесь прямо в самом дао, мы создадим несколько людей. Для этого мы будем использовать вот такой вот блок инициализа.
85: Мы можем использовать просто конструктор в конструкторе описать добавление людей в этот список пипл, но в принципе, разницы нет. Можете использовать конструктор, я буду использовать вот этот блок инициализации, потому что он, мне кажется, здесь больше подходит. Я
86: В моё поле пипл, я кладу новый динамический список пустой. И теперь в этот список я добавляю людей. Давайте я добавлю какого-нибудь человека, например, у него будет id
87: 1 имя будет какое-нибудь, добавлю ещё 1 человека, у него так, new person, у него имя будет другое, айди, соответственно, будет равно 2 и так.
88: Далее добавлю 3 человека id равно 3, имя какое-нибудь другое. Здесь, кстати, вот мы айди, добавляем вручную в конструкторе, на самом деле можно это дело автоматизировать, потому что обычно в базах данных
89: Вот это поле id, оно назначается автоматически и каждый раз при добавлении новой строки в базу данных это поле, оно автоматически инкрементируется, поэтому мы можем, например, здесь завести какую-нибудь статическую
90: Переменную пипл каунт, например, в начале она будет равна нулю. И здесь мы просто будем класть плюс плюс пипл каунт. То есть здесь будет лежать единица, здесь будет лежать двойка, здесь будет лежать тройка.
91: И так далее. Каждый раз у нас people аккаунт будет инкрементироваться при добавлении нового человека, соответственно, будет отсчитывать количество людей и также будет каждому человеку назначать уникальный id.
92: Как в настоящей базе данных. Давайте ещё 1 человека добавим какого-нибудь
93: Добавили 4 людей. Теперь в нашем списке пипл есть 4 человека, и мы их сможем вывести на экран и сможем вывести каждого из них, обращаясь по айди. Теперь давайте реализуем 2 метода. 1 метод у нас должен возвращать список из объектов.
94: Класса person, то есть список из людей и этот метод будет называться индекс. Здесь все очень просто. Просто. Мы возвращаем наш список пипл и этот список пипл мы с помощью time Лифа отобразим в браузере 2 метод он посложнее, он должен
95: Возвращать 1 человека, он должен принимать на вход id этого человека и должен найти человека с этим id, из нашего, из нашей базы данных условной, то есть из нашего списка people, и должен этого человека вернуть здесь.
96: Можем использовать лямда выражения, которые появились в 8 джаве, потому что это сократит наш код. Но, в принципе, здесь спокойно можно использовать просто цикл for, просто пройтись по всему этому списку, пипл, найти человека с нужным id.
97: А если такого человека нет, то вернуть, например, null, то есть вернуть ничто. Ну давайте я использую лям до выражения стрим, я отфильтрую человека.
98: По его id, чтобы id равнялся тому айди, который пришёл в качестве аргумента, я найду этого человека, если он есть, а если нет, я верну нул, так здесь у нас какая-то
99: Ошибка, потому что нам нужно указать, что мы используем 8 версию джавы. Окей, мы её используем. Теперь нам можно использовать лямда выражения. И вот таким образом мы в 1 строчку находим человека с этим id и возвращаем его.
100: Если же этого человека нет, то мы возвращаем null, теперь наше дао готово для 2 методов, все остальные методы по созданию, по обновлению, по удалению тоже будут лежать в этом дао, на этом уроке мы пока реализуем только чтение людей.
101: Теперь давайте перейдём обратно в контроллер и будем использовать наше дао, чтобы получать людей. Для этого мы должны внедрить объект дао в этот контроллер. Здесь наконец то мы уже почув
102: Пользу спринг фреймворк от того, что он внедрит зависимость персон дао в наш контроллер автоматически, то есть автоматически, создаст этот bin персон. Дао. Кстати, здесь мы забыли этот класс пометить как компонент тогда
103: Спринг создаст бин этого класса и этот bin он внедрит в наш контроллер. Кстати, обратите внимание на то, что person у нас не компонент, то есть Бинов создавать не надо класса person нам нужен bin только этого дао, и этот
104: Bean мы должны внедрить в наш контроллер, точнее, спринг должен автоматически его внедрить в наш контроллер, для этого мы можем здесь завести это поле персон дао.
105: Мы его можем импортировать и можем здесь написать аннотацию авто вайрд. И таким образом спринг внедрит объект класса person дава в наш контроллер. Здесь появляется предупреждение от среды разработки, потому что
106: Лучше использовать внедрение через конструктор, то есть вот у нас здесь поле, и мы через конструктор пипл контроллер внедряем этот дао в с помощью спринга. Но такой вот способ лучше, потому что конвенция
107: Говорит о том, что этот способ лучше, чем писать автоарт над самим полем здесь мы можем писать авторайд можем не писать в принципе неважно, спринг в любом случае внедрит зависимость в наш контроль.
108: Теперь, когда у нас есть в контроллере дао, это означает, что мы можем уже получать людей из нашей условной базы данных. Давайте здесь в методе индекс мы получим людей и положим их в модель.
109: Чтобы передать их в представление модул эт атрибьют, назовём наше, нашу переменную пипл и здесь мы обратимся к дао и просто вызовем метод индекс и положим, в этот подключем пи.
110: У нас будет лежать список из людей, то есть динамический массив релист из объектов класса персон. И здесь мы вернём ту страницу, тот шаблон, который будет отображать список из людей. Теперь мы
111: Перейдём в следующий метод, метод шоу и здесь мы должны получить человека по id и должны его тоже положить в модель и вернуть необходимый шаблон. Опять вызовем модул эт атрибьют.
112: Здесь будет подключён персон лежать то, что у нас пришло из дао, то, что пришло по айди, то есть конкретный человек, которого, которого мы нашли по его id. И мы возвращаем из этого метода назва
113: Того шаблона, где будет показываться этот человек, тоже в Папке пипл. Он будет лежать, будет называться шоу. Теперь нам осталось реализовать 2 шаблона. 1 будет отображать список из людей, a2 будет отображать 1
114: Человека. Давайте перейдём в папку вьюс. Здесь мы создадим новую папку, она будет называться пипл. И здесь мы должны создать 2 шаблона. Шаблон, индекс и шаблон шоу. Создадим сначала шаблон.
115: Индекс индекс. И здесь мы должны, во первых, указать, что мы используем, используем time лиф. Давайте это укажем.
116: Time live точка орг. Так здесь не нужно.
117: Запятая указали, что мы используем time лиф, теперь давайте изменим то, что у нас будет показываться в названии этой страницы эта страница будет называться все люди, и теперь здесь мы должны пройтись по тому массиву из людей, по тому списку из людей.
118: И вывести каждого человека, то есть вот то, что мы отправляем в этот шаблон, мы отправляем список, из людей подключён пипл, теперь мы должны по нему пройтись и вывести каждого человека на экран для этого в time live есть хороший
119: Способ это сделать в time live можно есть некое подобие цикла, который проходится по элементам коллекции и выводит каждый из элементов в виде html кода давайте это используем, используем тег.
120: Diff. И здесь используем вот этот аргумент тич ич. Ему мы передаём на вход.
121: Что-то наподобие цикла foreach, то есть мы указываем здесь название коллекции и указываем тот ту временную переменную, которая будет указывать на каждый из элементов этой коллекции. Закрываем.
122: Тег дифф. И здесь, внутри этого Тега диф. У нас уже в этой временной переменной персон будет лежать каждый из людей из этой коллекции. Пипл. Обращаемся к этой коллекции вот с помощью такого синтаксиса, с помощью доллара и фигурных скобок. Теперь
123: Здесь мы давайте сделаем ссылку, чтобы по каждому человеку можно было по его имени нажать и чтобы перейти на его страницу по его айдишнику, здесь пусть будет какой-то user, все равно это название изменится, название будет
124: Это здесь будет лежать имя человека, оно будет вставляться тайм лифом динамически. Здесь давайте мы будем с помощью th текст вставлять имя пользователя. Вот сюда вместо user используем
125: Тоже синтаксис с долларом и фигурными скобками персон гет нейм вызываем гетер, который есть у класса person, и получаем имя. Это имя с помощью th текст оно вставится вот сюда вместо этого юзера. То есть здесь, если мы запустим
126: Этот код и перейдём на эту страницу, то у нас будет пока просто список из имён людей, но теперь нам нужно сделать так, чтобы при нажатии на каждый из этих, из этих имён мы переходили на страницу каждого человека. Для этого есть отдельно.
127: Отдельный аргумент. Тиэйч эйч рф. И здесь мы можем указать ту ссылку, которая будет, на которую будет осуществляться переход при нажатии на эту, на каждую из этих ссылок. Теперь здесь мы можем использовать вот такую
128: Вот такой синтаксис, собачка, фигурные скобки. Здесь мы указываем адрес, на который нужно переходить пипл слэш айди какой-то здесь уже в круглых скобках после этого
129: Мы должны указать значение для этого id id. У нас равняется тому, что лежит в персон точка гет айди. То есть мы получаем id каждого человека, мы его кладём в эту временную переменную id, и это вре.
130: Переменная, она используется прямо здесь же, вот здесь, чтобы сформировать динамически правильный адрес, на который будет переходить пользователь при нажатии на эту ссылку, то есть для 1 человека здесь
131: Будет слэш пипл слэш 1 для 2 человека, здесь будет слэш пипл, слэш 2 и так далее. То есть time ли будет динамически генерировать нам html код с правильными ссылками. Таким образом здесь у нас будут ссылки при нажатии на каждую из которых мы будем
132: Переходить на вот этот метод контроллера. Будем передавать id в адресе. Соответственно, будем переходить на страницу какого-то конкретного человека. Давайте эту страницу мы сейчас реализуем здесь создадим новый эль файл, он будет
133: Называться шоу здесь в качестве тайтла будет написано человек.
134: Здесь давайте мы скопируем то, что здесь мы написали про time live вот сюда. И теперь здесь мы просто для конкретного человека, мы будем отображать его, его.
135: Я его id тиэйч текст равняется здесь. Персон гет нейм вызываем гетер для
136: Для имени и давайте также мы обратимся к id человека.
137: Person get id тоже вызываем его time. Лиф вставит вот вместо этого значения велю, то есть динамически будет вставляться необходимое значение, потому что человек правильный, он получается от
138: Контроллера. Вот здесь мы под ключ персон. Мы помещаем правильного человека и paul этого человека будут доступны в нашем шаблоне. Соответственно, мы сможем их поместить вместо вот этих значений велю. Теперь давайте запустим
139: Это приложение. Посмотрим, как оно работает. Я перешёл в браузер, я перешёл на страницу слэш пипл, и я вижу список из всех людей. То есть ещё раз мы сделали гет запрос на этот адрес из person дао. Мы извлекли всех людей из нашего условного, из, на
140: Условной базы данных, то есть из нашего списка и с помощью шаблонизатора тайм лиф мы вывели всех этих людей на экран. То есть для каждого человека из списка мы сгенерировали вот этот код, эйч код со ссылкой и
141: Этого человека мы видим здесь, мы можем по нему нажать и мы перейдём на его страницу. Почему? Потому что если мы посмотрим на код, мы увидим, что time лиф сгенерировал правильный код для каждого человека. То есть здесь вот где мы
142: Писали в фигурных скобках айди, этот id был заменён тем id, который действительно есть у человека, который мы получили с помощью геттера, то есть у этого человека id равен единице, у этого двойке и так далее, если мы нажмём сейчас на какого-то человека,
143: Мы перейдём по этой ссылке, и эта ссылка, она ведёт у нас на другой метод контроллера, на метод шоу, и этот метод он опять-таки получит через персон дао доступ к человеку по его айдишнику и отобразит этого человека с помощью time Лифа.
144: На экране. Давайте я, например, нажму на вот этого человека, я перейду по этому адресу и я перейду на страницу шоу.