====== Model-View-Controller ====== Набор архитектурных идей и принципов для построения сложных информационных систем с пользовательским интерфейсом\\ **Model**\\ Содержит всю бизнес-логику приложения\\ Самая независимая часть системы, она не должна ничего знать о двух других модулях\\ **View**\\ Отвечает за отображение данных пользователю, все что видит пользователь\\ Представляет информацию из модели в удобном для пользователя виде\\ **Controller**\\ Код, который отвечает за обработку действий пользователя\\ Именно через него вносятся изменения в модель\\ {{:develop:java:2023-04-02_09-57.png?direct&400|}} ===== Отделить бизнес-логику от интерфейса ===== Ключевая идея в том что любое приложение, в первом приближении, можно разбить на два модуля\\ Первый модуль содержит основной функционал приложения, он является ядром системы, в которой реализована модель предметной области\\ Во втором реализован весь пользовательский интерфейс, включая отображение и логику взаимодействия пользователя с приложением\\ {{:develop:java:2023-04-02_10-02.png?direct&400|}} ===== Использование шаблона наблюдатель ===== Для еще большей независимости модели от интерфейса, интерфейс должен быть в роли т.н. наблюдателя, шаблон проектирования, из серии сигнало-слотов\\ При каких либо изменениях, модель просто посылает сигнал, все подписчики его получают и реагируют\\ ===== Разделение интерфейса на вид и контроллер ===== Один из вариантов разделения это функциональный, т.е. у интерфейса есть две функции, "вводить" данные и "выводить" их, по этой линии можно и выполнить разделение\\ {{:develop:java:2023-04-02_10-10.png?direct&400|}} ===== Фасад ===== Вид и контроллер не должны напрямую работать с классами/методами модели, иначе теряется независимость\\ Модель представляет тесно связанный между собой набор классов, к которым ни у Вида ни у Контроллера не должно быть доступа\\ Для связи необходимо реализовать шаблон проектирования "Фасад", он и будет той самой прослойкой между Моделью и интерфейсом. Вид и Контроллер работают только с методами классов фасада, как и модель, тоже взаимодействует только с фасадом\\ {{:develop:java:2023-04-02_10-19.png?direct&400|}} ====== MVC Spring-boot ====== ===== Пример приложения ===== В interprise версии Idea можно создать spring boot проект из меню, в community этого нет, можно сгенерировать проект на офф. сайте [[https://start.spring.io|start.spring.io]], скачать/распаковать и открыть проект в Idea\\ Результат впринципе тот же, там в меню галочками выбираем пакеты которые нужно добавить, здесь все это сразу пишем в "pow" файл, в случае с maven, и все чики-пики\\
Файлы на старте Основной класс проекта package com.spring0.spring0; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Spring0Application { public static void main(String[] args) { SpringApplication.run(Spring0Application.class, args); } } pom.xml 4.0.0 org.springframework.boot spring-boot-starter-parent 3.0.5 com.spring0 spring0 0.0.1-SNAPSHOT spring0 Demo project for Spring Boot 17 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin
Создаем две веб страницы, по пути "resources/templates/" index.html Main page

Get your greeting here

greeting.html Getting Started: Serving Web Content

Создаем контроллер, подпакет "controller" HelloWorldController.java package com.spring0.spring0.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.ui.Model; @Controller public class HelloWorldController { @RequestMapping(value = "/greeting") public String helloWorldController(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) { model.addAttribute("name", name); return "greeting"; } }
Аннотация "@Controller" говорит о том что данный класс является контроллером. Контроллеры в Spring обрабатывают HTTP запросы на определенные адреса\\ В данном классе есть метод, с мапингом на адрес "greeting", данный метод сработает если кто то перейдет на данный адрес\\ Метод должен возвращать строку с именем страницы, в данном случае **"greeting.html"**, она и открывается при выполнении метода\\ Так же, через объект "Model", аттрибутом, передается переменная "name", которая используется в веб странице, загружая тем самым динамическое содержимое\\ В эту переменную, параметр, можно передать значение в url, типа "/greeting?name=Amigo", используется оно либо дефолтное\\ [[https://javarush.com/groups/posts/2537-chastjh-8-pishem-neboljhshoe-prilozhenie-na-spring-boot|источник]]\\ ===== Maven ===== Самостоятельный инструмент для управления и сборки проектов, так же присутствует (да и встраивается) в IDE, в т.ч. Intellij\\ Стандартная структура проекта maven:\\ * src/main/java - основные java классы * src/test/java - для тестов * src/main/resources - ресурсы, которые используются в приложении (html страницы, картинки, css и т.д.) Так же обязателен файл **pow.xml**, главный файл для управления работой мавена\\ ==== Управление зависимостями ==== Зависимости перечисляются в теге **"dependencies"**\\ Всегда задаются как минимум три параметра: "groupId", "artifactId" и "version"\\ Узнать эти параметры можно на офф сайте пакета либо на сайте [[https://mvnrepository.com/|maven-репозитория]]. Репозитории кстати есть локальный, приоритетный и внешний\\ Пример блока "dependencies"\\ commons-io commons-io 2.6 ===== Аннотации ===== **Controller** – специальный тип класса, применяемый в MVC приложениях. Похож на обычный сервлет HttpServlet, работающий с объектами HttpServletRequest и HttpServletResponse, но с расширенными возможностями от Spring Framework.\\ **Repository** – указывает, что класс используется для задания перечня необходимых работ по поиску, получению и сохранению данных. Аннотация может использоваться для реализации шаблона DAO.\\ **Service** – указывает, что класс является сервисом для реализации бизнес логики.\\ **Configuration** – эта аннотация используется для классов, которые определяют bean-компоненты.\\ **Autowired** – аннотация позволяет автоматически установить значение поля. Функциональность этой аннотации заключается в том, что нам не нужно заботиться о том, как лучше всего Bean'у передать экземпляр другого Bean'a. Spring сам найдет нужный Bean и подставит его значение в свойство, которое отмечено аннотацией.\\ **Bean** - компоненты которые создаются и управляются контейнером "Spring IoC"\\
:!: Spring IoC Inversion of Control - процесс, в котором объект определяет свои зависимости (вложенные объекты например) не объявляя их. Этот объект делегирует работу с такими зависимостями контейнеру "IoC"\\ Например класс А содержит в своем свойстве объект класса Б, для инициализации первого объекта, нужно сначала явно создать объект второго, с помощью контейнера IoC этого можно избежать\\ Пример объявления @Component public class Company { // this body is the same as before } @Configuration @ComponentScan(basePackageClasses = Company.class) public class Config { @Bean public Address getAddress() { return new Address("High Street", 1000); } } //////// ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); Company company = context.getBean("company", Company.class); assertEquals("High Street", company.getAddress().getStreet()); assertEquals(1000, company.getAddress().getNumber());
===== Установка ===== [[https://maven.apache.org/install.html|Дока]]\\ Скачать дистрибутив, распаковать, добавить путь **bin/mvn** в переменную **PATH**