СОДЕРЖАНИЕ:
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 внедрение зависимостей происходит ч/з конструктор
Таким образом данное приложение позволяет внедрять значения из внешнего файла, что позволяет не редактировать файл xml. ЗАДАНИЕ
В данном проекте опробованы два скопа singleton и prototype При определении bean в Spring Framework, у нас есть возможность объявить область видимости этого компонента.
В Spring Framework имеются пять возможных значений свойства scope, в данном примере рассматривается два скопа В Spring предусмотрены различные области времени действия би-нов: 1) singleton - может быть создан только один экземпляр бина. Этот тип используется спрингом по умолчанию, если не указано другое. Следует осторожно использовать публичные свойства класса, т.к. они не будут потокобезопасными. 2) prototype - создается новый экземпляр при каждом запросе.В данном примере ввели следующую строку в applicationContext.xml
где указан пакет, в котором Spring будет сканировать и искать все классы с аннотаией Component, при нахождении определённой аннотации будет созlан Бин из этого класса.
В приведённом примере отработана аннотация Component, которая была введена перед классами RockMusic и ClassicalMusik@Component перед классом RockMusic
@Component перед классом ClassicalMusik
В тестовом классе создано два экземпляра разных классов для демонстрации вывода в консоли результатов:
Рассмотрение @Autowired в коде...
в классе MusicPlayer поставлена @Autowired
проверка выпонения в консоли
Ситуация, когда Spring не найдёт нужный Бин для внедрения в MusicPlayer, для этого убрали @Component перед классом ClassicalMusik: ...таким образом у Spring не будет Бина, который подходит для конструктора public MusicPlayer(ClassicalMusic classicalMusic) класса MusicPlayer Проверка выпонения в классе TestSpring без @Component перед классом ClassicalMusik:rage1:... исправим приватное поле в классе MusicPlayer c класса ClassicalMusic на интерфейс Music, тем самым мы Spring, что хотим внедрить тот Бин, который реализует интерфейс Music.
... как можно убедиться, в Spring внедрён Бин Music и MusicPlayer играет рок музыку. При вернуть обратно @Component в класс ClassicalMusic, то получится неоднозначность, т.к. по условию конструктора public MusicPlayer(Music music) проходит Бин ClassicalMusic и RockMusic и они оба реализуют интерфейс Music. Результатом выполнения будет ошибка. :rage1:Внедрение @Autowired через Setter:👍
Spring все равно как называется метод, он находит название интерфейса (класса) и все равно внедрит зависимость используя данный метод. Внедрение @Autowired через поле:👍
Внедрение @Autowired через конструктор с параметрами классов ClassicalMusic и RockMusic:👍
Внедрение зависимостей Spring-ом внутри других зависимостей:👍 Создание дополнительного клсса Computer:👍.... изменения в классе MusicPlayer:👍
.... создание экземпляра в классе TestSpring:👍
Демонстрация области видимости на примере:
проверка @Scope "singleton". Проверка объектов в главном классе, значение true, говорит о том что объекты одинаковы, подтвержение того что Scope singleton сработал правильно. Демонстрация @Scope "prototype" вместе с выводом в консоли falseДемонстрация жизненного цикла Бина на примере ....
Выполнение всех перечисленных аннотациий проработаны в коде... После создания Java класса конфигурации, данный xml файл успешно удаляется
Spring MVC
SpringMVCAppWebXML - приложение с xml конфигурацией
А теперь старые и добрые GET и POST_, немного теории о них:
SpringRequestParameters - рассмотрены GET запросы и как обрабатываются параметры которые передаются в URL запросе в самом адресе на серевер с помощью Spring Framework
вывод в консоли параметров Get запроса, введённых через_@RequestParameter в строке браузера:
Вывод ошибки 400, если ввести запрос через @RequestParameter без параметров...
Таким образом, видно, что Get запрос ждёт введение параметров, указанных в методе, иначе каждый раз будет вывод ошибки 400.
Для устранения данной ошибки, необходимо в параметрах метода @RequestParam укзать "required = false", что позволит избежать ошибки.Здесь можно пронаблюдать как выводятся данные страницы...
Вывод в консоли значений null null...
пример передачи параметров Get запросов при нажатии на ссылку на странице браузера: необходимо в html странице, прописать обращение к методу контроллера с параметрами Get запроса...
Вывод на странице браузера ссылки на страницу с параметрами...SpringIntroToModel - передача данных от контроллера к модели
В нашем ранее рассмотреном примере продемонстрируем работу передачи данных...
Ддобавление модели в контроллере: обращение в представлении к контроллеру по ключу модели.... Вывод данных на странице браузера:_Spring_CRUD_App2 - в данном приложении рассмотрена аннотация @ModelAttribute и HTML Формы (Thymeleaf).
![1@ModelAttribute](https://user-images.githubusercontent.com/61631173/126778300-6885e46a-12c4-497d-a204-b3e9a6015729.JPG) ПРАКТИКА добавление в контроллер методов с @GetMapping и @PostMapping: Создание конструктора класса Person, для добавление человека: добавление метода creat() в классе PersonDAO работы с БД: создание новой html страницы для добавления человека в БД: Проверка в браузере страницы добавления человека: Добавление человека в БД с выодом на странице браузера: Страница информации имени человека и его id: Применение аннотации @@ModelAttribute вместо вызова класса Model в параметре:_Spring_CRUDApp3 - приложение доработано, теперь оно сможет обновлять и удалять данные
ПРАКТИКА
В примере прошлого приложения добавляем методы edit и update в контроллере: ...в классе PersonDAO добавляем метод update ... создали страницу html для редактирования данных человека Ошибка 405 при изменении имени человека... добавление методов позволяющих вносить изменения для Spring и избежания ошибки 405
проверяем на странице изменения данных выполнение прописанных методов ... страница списка людей с изменённым именемДобавление метода для удаления персоны:
метод delete в контроллере метод delete в классе PersonDAOформа delete в странице html Show
цель урока: научиться правильно офрмлять поля для их адекватного заполнения (например: в поле Email не должны вводиться данные эл. почты без @).
Всего этого можно добиться при помощи специальных аннотаций, которые подгружаются после добавления зависимости hibernate-validator в файл pom.xml ...Зависимость hibernate-validator версии 7 0 1 Final не срабатывала на вывод ошибок, сработала зависимость hibernate-validator версии 6.1.6.Final представленая на уроке 24 данного курса После добавления зависимости, добавляются необходимые аннотации в класс Person: ... далее в методах update и create класса контроллера вносятся аннотации @Valid перед входящими праметрами Person и прописывается необходимое условие: ... на страницах html edit и new добавлены теги для вывода сообщений красным цветом об ошибках при введении не подходящей информации в соответствующие поля ... после всего проделанного можно запустить приложение и убедиться в выводе информации об ошибках при не правильно введённой информации:Для выполнения выше изложенного, необходимо установить БД PostgreSQL и создать в ней таблицу с соответствующими столбцами:
Добавили зависимость в файле pom.xml: Для создания соединения приложения с БД, в классе PersonDAO, создали приватные статические переменные и в статическом блоке создали соединение с БД. ... в методе index внесли изменения, прописали запрос на выбор всех персонажей в таблице, данный метод возвращает список всех персонажей в БД. Реализацию остальных методов закоментировали, для избежания вывода ошибок и последующего рефакторинга. ... можно убедиться на стрпанице браузера Добавление людей в БД, прописано в методе save(пока не совсем правильно, позже будет исправлено):минусы такого подхода:
Spring_SpringJDBC2 в приведённом проекте рассмотрены SQL инъекции!
... после теории, переход на практику и убеждаемся на примере работы инекции Таким образом переписали код и предотвратили SQLинъекции.SpringTemplateJDBC - в данном проекте переписан код с JDBC на обёртку Template фреймворка Spring, что позволило избавиться от лишнего кода.