====== 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**