Это старая версия документа!
Набор архитектурных идей и принципов для построения сложных информационных систем с пользовательским интерфейсом
Model
Содержит всю бизнес-логику приложения
Самая независимая часть системы, она не должна ничего знать о двух других модулях
View
Отвечает за отображение данных пользователю, все что видит пользователь
Представляет информацию из модели в удобном для пользователя виде
Controller
Код, который отвечает за обработку действий пользователя
Именно через него вносятся изменения в модель
Ключевая идея в том что любое приложение, в первом приближении, можно разбить на два модуля
Первый модуль содержит основной функционал приложения, он является ядром системы, в которой реализована модель предметной области
Во втором реализован весь пользовательский интерфейс, включая отображение и логику взаимодействия пользователя с приложением
Для еще большей независимости модели от интерфейса, интерфейс должен быть в роли т.н. наблюдателя, шаблон проектирования, из серии сигнало-слотов
При каких либо изменениях, модель просто посылает сигнал, все подписчики его получают и реагируют
Один из вариантов разделения это функциональный, т.е. у интерфейса есть две функции, «вводить» данные и «выводить» их, по этой линии можно и выполнить разделение
Вид и контроллер не должны напрямую работать с классами/методами модели, иначе теряется независимость
Модель представляет тесно связанный между собой набор классов, к которым ни у Вида ни у Контроллера не должно быть доступа
Для связи необходимо реализовать шаблон проектирования «Фасад», он и будет той самой прослойкой между Моделью и интерфейсом. Вид и Контроллер работают только с методами классов фасада, как и модель, тоже взаимодействует только с фасадом
В interprise версии Idea можно создать spring boot проект из меню, в community этого нет, можно сгенерировать проект на офф. сайте 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); } }
pow.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.spring0</groupId> <artifactId>spring0</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring0</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Main page</title> </head> <body> <p>Get your greeting <a href="/greeting">here</a></p> </body> </html>
greeting
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p th:text="'Hello, ' + ${name} + '!'" /> </body> </html>
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», используется оно либо дефолтное