Инструменты пользователя

Инструменты сайта


develop:java:mvc

Model-View-Controller

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

Model
Содержит всю бизнес-логику приложения
Самая независимая часть системы, она не должна ничего знать о двух других модулях

View
Отвечает за отображение данных пользователю, все что видит пользователь
Представляет информацию из модели в удобном для пользователя виде

Controller
Код, который отвечает за обработку действий пользователя
Именно через него вносятся изменения в модель

Отделить бизнес-логику от интерфейса

Ключевая идея в том что любое приложение, в первом приближении, можно разбить на два модуля

Первый модуль содержит основной функционал приложения, он является ядром системы, в которой реализована модель предметной области
Во втором реализован весь пользовательский интерфейс, включая отображение и логику взаимодействия пользователя с приложением

Использование шаблона наблюдатель

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

Разделение интерфейса на вид и контроллер

Один из вариантов разделения это функциональный, т.е. у интерфейса есть две функции, «вводить» данные и «выводить» их, по этой линии можно и выполнить разделение

Фасад

Вид и контроллер не должны напрямую работать с классами/методами модели, иначе теряется независимость
Модель представляет тесно связанный между собой набор классов, к которым ни у Вида ни у Контроллера не должно быть доступа

Для связи необходимо реализовать шаблон проектирования «Фасад», он и будет той самой прослойкой между Моделью и интерфейсом. Вид и Контроллер работают только с методами классов фасада, как и модель, тоже взаимодействует только с фасадом

MVC Spring-boot

Пример приложения

В 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);
	}
 
}

pom.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>
Создаем две веб страницы, по пути «resources/templates/»

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.html

<!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>
Создаем контроллер, подпакет «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», используется оно либо дефолтное

источник

Maven

Самостоятельный инструмент для управления и сборки проектов, так же присутствует (да и встраивается) в IDE, в т.ч. Intellij

Стандартная структура проекта maven:

  • src/main/java - основные java классы
  • src/test/java - для тестов
  • src/main/resources - ресурсы, которые используются в приложении (html страницы, картинки, css и т.д.)

Так же обязателен файл pow.xml, главный файл для управления работой мавена

Управление зависимостями

Зависимости перечисляются в теге «dependencies»
Всегда задаются как минимум три параметра: «groupId», «artifactId» и «version»
Узнать эти параметры можно на офф сайте пакета либо на сайте maven-репозитория. Репозитории кстати есть локальный, приоритетный и внешний
Пример блока «dependencies»

<dependencies>
  <dependency>
     <groupId>commons-io</groupId>
     <artifactId>commons-io</artifactId>
     <version>2.6</version>
  </dependency>
</dependencies>

Аннотации

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());

Установка

Дока
Скачать дистрибутив, распаковать, добавить путь bin/mvn в переменную PATH

develop/java/mvc.txt · Последнее изменение: 2024/04/14 05:28 — admin