Krassilnikov-AV / SpringCurse

0 stars 0 forks source link

SpringCurse

СОДЕРЖАНИЕ:

Spring

• Изначально создавался для облегчения разработки JavaEE-приложений

• Сейчас на нём разрабатываются, как JavaEE, так и JavaSE-приложения

_В репозитории вкратце рассмотрены вопросы фреймворка Spring c примерами их реализации.

курс представлен на Ютуб канале https://www.youtube.com/playlist?list=PLAma_mKffTOR5o0WNHnY0mTjKxnCgSXrZ Наилем Алишевым_


конфигурация Spring с помощью xml. На примере музыкального плеера рассматривается внедрение инверсии управления Inversion of Control (IoC) 1) создание интерфейса Music 2) создание Java классов ClassikMusic и RockMusic, которые переопределяют интерфейс Music 3) создание Java классов ClassikPlayer в котором внедряем зависимость IoC путём создания конструктора, который получает параметр интерфейса и выводит в консоль проинрываемое значение 4) В applicationContext.xml вызывается Бин по направлению музыки.


В IoC внедрение зависимости производили вручную через Бин Musik. Для избежания создания ручного внедрения зависимости, в данном приложении используется Dependency Injection (DI), через конструктор с использованием xml. 1) В applicationContext.xml создаётся ещё один Бин с id = musicPlayer и указанием пути с конструктором, ссылающимся на уже созданный Бин. 2) При получении Бина MusicPlayer из applicationContext.xml он будет с внедрённой зависимостью. Таким образом не нужно обращаться к интерфейсу Music и создавать вручную экземпляр MusicPlayer. 3) В TestSpring создаётся обращение к контексту через параметры musicPlayer и таким образом можно менять в пути Бина название класса, который будет выводить результат в консоли. Тем самым при помощи Spring была внедрена зависимость, которая и называется DEPENDENCY INJECTION.


В приложении SpringAppDI внедрение зависимостей происходит ч/з конструктор _, а в приложении _SpringApp_DISetter происходит при помощи метода setter: 1) создание метода setMusic в классе MusicPlayer, который в кач-ве параметра принимает значение интерфейса music 2) в xml файле используется тэг property для передачи ему зависимости musicBean

Таким образом данное приложение позволяет внедрять значения из внешнего файла, что позволяет не редактировать файл xml. ЗАДАНИЕ

TestSpring_Component


Annotation_Autowired

Annotation_Autowired_как работает

Annotation_Autowired_ещё об

Annotation_Autowired_ещё об 1

Annotation_Autowired_ещё об 2

Рассмотрение @Autowired в коде...

в классе MusicPlayer поставлена @Autowired

пример @Autowired_MusicPlayer

проверка выпонения в консоли пример @Autowired_TestSpring

Ситуация, когда Spring не найдёт нужный Бин для внедрения в MusicPlayer, для этого убрали @Component перед классом ClassicalMusik: пример @Autowired_MusicPlayer_ без @Component

...таким образом у Spring не будет Бина, который подходит для конструктора public MusicPlayer(ClassicalMusic classicalMusic) класса MusicPlayer

Проверка выпонения в классе TestSpring без @Component перед классом ClassicalMusik:rage1: пример @Autowired_TestSpring_ошибка выполнения_что ожидается Бин

... исправим приватное поле в классе MusicPlayer c класса ClassicalMusic на интерфейс Music, тем самым мы Spring, что хотим внедрить тот Бин, который реализует интерфейс Music. пример @Autowired_MusicPlayer_ без @Component_параметр конструктора MusicPlayer интерфейс Music

... как можно убедиться, в Spring внедрён Бин Music и MusicPlayer играет рок музыку.

При вернуть обратно @Component в класс ClassicalMusic, то получится неоднозначность, т.к. по условию конструктора public MusicPlayer(Music music) проходит Бин ClassicalMusic и RockMusic и они оба реализуют интерфейс Music.

Результатом выполнения будет ошибка. :rage1:

пример @Autowired_TestSpring_ошибка выполнения_неоднозначность, реализация интерфейса несколькими Бинами

Внедрение @Autowired через Setter:👍

пример @Autowired_MusicPlayer_ через Setter

Spring все равно как называется метод, он находит название интерфейса (класса) и все равно внедрит зависимость используя данный метод. Внедрение @Autowired через поле:👍

пример @Autowired_MusicPlayer_ через поле

Внедрение @Autowired через конструктор с параметрами классов ClassicalMusic и RockMusic:👍

пример @Autowired_MusicPlayer_ с добавлением конструктора класса MusicPlayer  с параметрами классов ClassicalMusic RockMusic и введением @Componetn в класс ClassicalMusic

Внедрение зависимостей Spring-ом внутри других зависимостей:👍

Создание дополнительного клсса Computer:👍

пример @Autowired_MusicPlayer_ с добавлением класса Computer_класс Computer

.... изменения в классе MusicPlayer:👍

пример @Autowired_MusicPlayer_ с добавлением класса Computer

.... создание экземпляра в классе TestSpring:👍

пример @Autowired_MusicPlayer_ с добавлением класса Computer_класс TestSpring


ClassicalMusic

MusicPlayer

Musik_интерфейс

TestSpring


внедрение внешних значений при помощи @Value

Демонстрация на примере... пример_Value_musicPlayer properties

пример_MusicPlayer

пример_TestSpring

Область видимости Бинов_Scope_xml

Область видимости Бинов_Scope_Singleton vs  Prototype

Область видимости Бинов_@Scope

Демонстрация области видимости на примере: пример_Scope_singleton_ClassicalMusic

проверка @Scope "singleton". Проверка объектов в главном классе, значение true, говорит о том что объекты одинаковы, подтвержение того что Scope singleton сработал правильно. пример_Scope_singleton_TestSpring

Демонстрация @Scope "prototype" вместе с выводом в консоли false пример_Scope_prototype_ClassicalMusic

жизненный цикл Бина

жизненный цикл Бина_методы

жизненный цикл Бина_@PostConstruct_@PreDestroy

жизненный цикл Бина_пример_@PostConstruct_@PreDestroy

жизненный цикл Бина_сигнатура_@PostConstruct_@PreDestroy

Демонстрация жизненного цикла Бина на примере .... пример_PostConstruct_PreDestroy_ClassicalMusic


1_список конфигураций

2_Annotation Configuration in Java

3_xml тег = соответствующая аннотация

3_тег = аннотация

4_использование конфигурационного файла

5_ручное внедрение зависимостей без Autowired

6_Подробнее об аннотации Bean

7_Внедрение зависимостей из внешнего файла_раньше

7_Внедрение зависимостей из внешнего файла_теперь

Выполнение всех перечисленных аннотациий проработаны в коде... пример_1_создание конфигурационного класса эквивалента xml файла конфигураций После создания Java класса конфигурации, данный xml файл успешно удаляется

пример_2_файл xml под удаление после создания Java класса конфигурации

пример_3_удаление загрузочного класса файл xml

пример_4_создание нового экземпляра загрузочного класса вместо экземпляра файла xml с результатом выполнения

пример_5_заполнение конфигурационного класса SpringConfig аннотациями для классов с запуском для проверки


Spring MVC

1_Обзор курса

2_Spring MVC_ определение

3_Spring MVC - структура

4_состав Spring MVC

5_DispatcherServlet

6_Контроллер_описание

7_Представление (View)_описание


1_Контроллер

2_Контроллер and Component

3_методы контроллера

4_Маппинги

5_RequestMapping


А теперь старые и добрые GET и POST_, немного теории о них:

1_HTTP Hyper Text Transfer Protocol

2_клиент-сервер

3_клиент-сервер

4_http на примере Google

5_смотреть код страницы

6_просмотр данных страницы

7_методы HTTP запроса

8_GET-метод HTTP запроса

9_GET-запрос параметры

10_POST-запрос

11_POST-запрос параметры

12_GET и POST-сравнение

13_структура для передачи клиент - сервер

14_структура для передачи сервер - клиент

15_http response _структура для передачи сервер - клиент

16_http response _пример с Googla

17_http _ статусы ответов

18_http _ типы содержимого


SpringRequestParameters - рассмотрены GET запросы и как обрабатываются параметры которые передаются в URL запросе в самом адресе на серевер с помощью Spring Framework

1_запросы к серверу

2_клиент-сервер

3_параметры GET запроса

4_способы получения GET запросов

5_пример_добавление параметров в Get запрос через_HttpServletRequest

6_пример_внесение в браузере параметров Get запроса через_HttpServletRequest

7_пример_вывод  в консоли параметров Get запроса через_HttpServletRequest

8_пример_добавление параметров в Get запрос через_аннотацию RequestParameter

9_пример_внесение в браузере параметров Get запроса через_@RequestParameter

вывод в консоли параметров Get запроса, введённых через_@RequestParameter в строке браузера: 10_пример_вывод  в консоли параметров Get запроса через_@RequestParameter

Вывод ошибки 400, если ввести запрос через @RequestParameter без параметров... 11_пример_вывод ошибки без параметров Get запроса через_@RequestParameter

Таким образом, видно, что Get запрос ждёт введение параметров, указанных в методе, иначе каждый раз будет вывод ошибки 400.

Для устранения данной ошибки, необходимо в параметрах метода @RequestParam укзать "required = false", что позволит избежать ошибки.

12_пример_код устранения вывода ошибки без параметров Get запроса через_@RequestParameter

Здесь можно пронаблюдать как выводятся данные страницы...

13_пример_вывод в консоли без параметров_@RequestParameter

Вывод в консоли значений null null...

14_пример_вывод в консоли без параметров null null_@RequestParameter

пример передачи параметров Get запросов при нажатии на ссылку на странице браузера: необходимо в html странице, прописать обращение к методу контроллера с параметрами Get запроса... 15_пример_передачи параметров Get запросов при нажатии на ссылку _@RequestParameter

Вывод на странице браузера ссылки на страницу с параметрами... 16_пример_вывод на странице ссылки с параметрами_@RequestParameter


SpringIntroToModel - передача данных от контроллера к модели

1_модель данных от контроллера к представлению

2_MVC - паттерн проектирования приложений (Model View Controller)

3_Модель -контейнер для данных нашего приложения

4_часть Модели рассмотренная в этом приложении

5_получение доступа к модели в контроллере

В нашем ранее рассмотреном примере продемонстрируем работу передачи данных...

Ддобавление модели в контроллере: 6_добавление модели в контроллере

обращение в представлении к контроллеру по ключу модели.... 7_пример_обращение в представлении к контроллеру по ключу модели

Вывод данных на странице браузера: 8_пример_вывод на странице браузера


1_CRUD

2_CRUD - определение

3_HTTP -CRUD

4_стандарт CRUD's

5_почему именно такие методы_

6_REST   CRUD_

7_описание урока

8_связь с БД

9_описание приложения, работающего с БД

10_описание приложения, работающего с БД (временно ArrayList)

После теории переход к написанию приложения, сделал скриншоты с работающего примера приложения, пока без подключения базы данных.

Класс контроллер PeopleController: 11_приложение_класс-контроллер PeopleController Класс сущности Person: 12_приложение_класс сущности Person Класс, работающий с БД - PersonDAO: 13_приложение_класс для работы с БД Представление в виде html страницы, на которой выводится список людей: 14_приложение_html страница представления_index Представление в виде html страницы, на которой выводится имя и id человека: 15_приложение_html страница представления_show страница браузера_вывод списка людей: 16_приложение_страница браузера_вывод списка людей_index страница браузера_вывод человека по id: 17_приложение_страница браузера_вывод человека по id_show


1_CRUD_методы Update_Delete

2_CRUD_методы Update_Delete на этом уроке

План урока...

3_CRUD_план урока

Немного теории...

4_деталь реализации PATCH_ DELETE и др  запросов

5_решение проблемы

6_решение проблемы с поомщью фильтра

ПРАКТИКА

В примере прошлого приложения добавляем методы edit и update в контроллере:

7_пример_добавление методов edit и update в контроллере

...в классе PersonDAO добавляем метод update

8_пример_добавление метода update в классе PersonDAO

... создали страницу html для редактирования данных человека

9_пример_создание страницы html для редактирования данных человека

Ошибка 405 при изменении имени человека 10_пример_страница ошибки 405

... добавление методов позволяющих вносить изменения для Spring и избежания ошибки 405

10_пример_добавление методов позволяющих вносить изменения для Spring и избежания ошибки 405

проверяем на странице изменения данных выполнение прописанных методов 11_пример_страница изменения имени человека

... страница списка людей с изменённым именем 12_пример_страница списка людей с изменённым именем

Добавление метода для удаления персоны:

метод delete в контроллере

13_пример_добавление метода delete в контроллере

метод delete в классе PersonDAO

14_пример_добавление метода delete в классе PersonDAO

форма delete в странице html Show

15_пример_добавление формы delete в странице html Show

16_пример_добавление ccылки на создание персоны

17_пример_страница браузера списка людей

18_пример_страница браузера для просмотра, редактирования и удаления персоны

19_пример_страница браузера списка людей после удаления из списка персоны Sanya


цель урока: научиться правильно офрмлять поля для их адекватного заполнения (например: в поле Email не должны вводиться данные эл. почты без @).

Всего этого можно добиться при помощи специальных аннотаций, которые подгружаются после добавления зависимости hibernate-validator в файл pom.xml 1_пример_Зависимость версии 7 0 1 Final не срабатывала на вывод ошибок!

...Зависимость hibernate-validator версии 7 0 1 Final не срабатывала на вывод ошибок, сработала зависимость hibernate-validator версии 6.1.6.Final представленая на уроке 24 данного курса

После добавления зависимости, добавляются необходимые аннотации в класс Person:

2_пример_класс Person_добавление необходимых аннотаций

... далее в методах update и create класса контроллера вносятся аннотации @Valid перед входящими праметрами Person и прописывается необходимое условие:

3_пример_@Valid перед входящим параметром Person методов create и update

... на страницах html edit и new добавлены теги для вывода сообщений красным цветом об ошибках при введении не подходящей информации в соответствующие поля

4_пример_добавление тегов с условием о возникновении ошибок на странице update

5_пример_добавление тегов с условием о возникновении ошибок

... после всего проделанного можно запустить приложение и убедиться в выводе информации об ошибках при не правильно введённой информации:

6_пример_демо_вывод ошибки на странице при неправилном вводе


1_заголовок урока_БД

2_проблема хранения данных в оперативной памяти

3_описание реляционных БД

4_БД PostreSQL

5_связь Java приложения с БД

6_связь Java приложения с БД_описание

7_как подклюиться к БД

8_БД основные команды

9_цель этого урока_подключение БД вместо используемого списка

Для выполнения выше изложенного, необходимо установить БД PostgreSQL и создать в ней таблицу с соответствующими столбцами:

10_пример_демонстрация созданной таблицы в БД

Добавили зависимость в файле pom.xml: 10_пример_добавление зависимости в pom

Для создания соединения приложения с БД, в классе PersonDAO, создали приватные статические переменные и в статическом блоке создали соединение с БД.

11_пример_подключение к БД в статическом блоке

... в методе index внесли изменения, прописали запрос на выбор всех персонажей в таблице, данный метод возвращает список всех персонажей в БД. Реализацию остальных методов закоментировали, для избежания вывода ошибок и последующего рефакторинга.

12_пример_метод index_запрос с выбором всех персонажей

... можно убедиться на стрпанице браузера

13_пример_вывод запроса в методе index

Добавление людей в БД, прописано в методе save(пока не совсем правильно, позже будет исправлено):

14_пример_метод save_запрос для изменения данных в БД

1_Spring_JDBC_Template_обёртка вокруг JDBC API

2_Spring_JDBC_Template_проблемы JDBC API

3_Spring_JDBC_Template_проблемы JDBC API_2

4_Spring_JDBC_Template_проблемы JDBC API_3

5_Spring_JDBC_Template_обёртка JDBC API от Spring Fraemwork

После, можно убедиться на практике выше изложенное....

6_пример_добавленная аннотация_Spring_JDBC_

использовали class PersonMapper, после того как обнаружили дублирование кода в обращение к БД. После этого, обнаружили тривиальную вещь, которая описывает название колонок БД и сеттеров класса Person. Таким образом не обязательно использовать свой Mapper, а можно применить BeanPropertyRowMapper.

7_пример_написанный class PersonMapper_после заменен на new BeanPropertyRowMapper

8_пример_класс BeanPropertyRowMapper

Далее изменения в классе PersonDAO

9_пример_изменение класса PersonDAO и методов index, show

10_пример_изменение класса PersonDAO и методов save, update, delete