Этот материал — завершающая часть цикла “Введение в Enterprise-разработку”. Предыдущие статьи:
Давай разберем простейший пример реализации MVC на примере Spring-MVC. Для этого напишем небольшое Hello World приложение на spring-boot. Для того, чтобы ты мог повторить все сам, я дам тебе пошаговую инструкцию. Сначала мы напишем небольшое приложение, а после разберем его.
Шаг 1. Creation spring-boot applications в IntelliJ IDEA
С помощью File -> New -> Project… создаем новый проект. В открывшемся окне, в левом боковом меню, выбираем Spring Initializr, выбираем Project SDK, опцию Initializr Service URL оставляем дефолтной.
Нажимаем кнопку Next. В следующем окне нам нужно выбрать параметры проекта. У нас будет Maven проект. Выбираем Type - Maven Project, заполняем Group и Artifact
Нажимаем кнопку Next. В следующем окне необходимо выбрать компоненты Spring Framework, который мы будем использовать. Нам достаточно двух:
- Spring Web - компонента, которая позволит нам создавать Web applications. Данная компонента включает в себя Spring MVC.
- Thymeleaf - Так называемый движок шаблонов. Штука, которая позволит нам передавать данные из Java в HTML pages
В следующем окне выбираем Name и расположение проекта в файловой системе:
Нажимаем кнопку Finish. Проект создан. У нас получилась следующая структура проекта:
Здесь нам интересны 2 file: pom.xml - дескриптор развертывания. Штука, которая позволяет быстро и просто импортировать библиотеки из разных фреймвроков в наш проект, а также штука, в которой мы конфигурируем сборку нашего applications. Приложение наше собирается с помощью Maven, pom.xml - конфигурационный файл этой системы сборки. Java класс - MvcDemoApplication. Это главный класс нашего applications, с которого мы будем запускать наш spring-boot проект. Для запуска достаточно запустить метод main в данном классе. Приведем code данного класса, а также file pom.xml: MvcDemoApplication:
@SpringBootApplication
public class MvcDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MvcDemoApplication.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>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.javarush</groupId>
<artifactId>mvc_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mvc_demo</name>
<description>Spring MVC Demo</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Шаг 2. Creation веб страниц
Наше приложение будет предельно простым. У нас будет главная page - index.html, внутри которого будет располагаться link на page приветствия - greeting.html. На странице greeting мы отобразим приветствие. Реализуем возможность передачи имени для приветствия на page greeting.html через параметры url. Создадим главную page нашего applications - 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>
Теперь создадим page 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>
Здесь из нетипичного для html pages можно увидеть тег:
<p th:text="'Hello, ' + ${name} + '!'" />
Атрибут
th
у тега
p
- это инструмент движка шаблонов Thymeleaf. Благодаря нему meaningм тега
p
будет текст “Hello, “ + meaning переменной
name
, которое мы зададим из Java codeа.
Шаг 3. Creation контроллера
Внутри пакте mvc_demo создадим пакет contoller, внутри которого создадим наш контроллер, HelloWorldController:
@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";
}
}
С одной стороны здесь совсем немного codeа, но с другой стороны много всего происходит. Начнем разбор. Аннотация @Controller - говорит о том, что данный класс является контроллером. Контроллеры в Spring обрабатывают HTTP requestы на определенный address. В нашем классе есть метод helloWorldController, который помечен аннотацией - @RequestMapping(value = "/greeting"). Данная annotation говорит нам о том, что данный метод обрабатывает HTTP GET requestы на address /greeting. Иными словами, данный метод сработает, если кто-то перейдет по addressу /greeting. Данный метод возвращает String. Согласно Spring-MVC, метод контроллера должен вернуть Name представления. Далее Spring будет искать html файл, с таким именем, который и вернет в качестве ответа на HTTP request. Как ты видишь, наш метод возвращает Name веб pages, которую мы создали ранее - greeting. Наш метод принимает 2 аргумента. Разберем их: Параметр 1: @RequestParam(name = "name", required = false, defaultValue = "World") String name. Аннотация @RequestParam говорит о том, что параметр String name - является параметром url. В скобках аннотации указано, что данный параметр в url является не обязательным (required = false), в случае его отсутствия, meaningм параметра String name будет World (defaultValue = "World"), а если он будет присутствовать, то данный параметр в url будет именоваться name (name = "name") Тут может быть многое непонятно. Приведем примеры. В таблице ниже указано, Howим будет meaning параметра String name, при различных вариантах обращения на address /greeting (с параметрами в URL и без)
Пример URL |
Значение параметра String name |
/greeting |
World |
/greeting?name=Amigo |
Amigo |
/greeting?name=Zor |
Zor |
Параметр 2: Вторым параметром является Model model. Данный параметр является некоторой моделью. Данная модель состоит внутри из различных атрибутов. Каждый атрибут имеет Name и meaning. What-то вроде пар ключ-meaning. С помощью данного параметра мы можем передавать данные из Java codeа в html pages. Или же, говоря терминологией MVC, передавать данные из Модели (Model) в Представление (View). Осталось разобрать последнюю строчку. То, How мы передаем данные из Java в html or же из Model во View. В теле метода есть следующая строка:
model.addAttribute("name", name);
Здесь мы создаем новый атрибут с именем name и присваиваем ему meaning параметра name. Вспомни, совсем недавно мы обсуждали тег:
<p th:text="'Hello, ' + ${name} + '!'" />
Мы говорor, что meaningм тега p будет текст “Hello, “ + meaning переменной name, которое мы зададим из Java codeа. Это meaning мы и задали с помощью строчки
model.addAttribute("name", name);
Шаг 5. Запуск
Для запуска, нам нужно запустить метод main в классе MvcDemoApplication:
В логах запуска, мы увидем, что наше web приложение стартовало на порту 8080:
А это значит, что мы можем идти в браузер на page:
http://localhost:8080:
Здесь нам отобразилась page index.html. Перейдем по ссылке на greetin:
При этом переходе сработал наш контроллер. Мы не передавали через URL ниHowих параметров, поэтому, How было указано в аннотации, meaning атрибута name приняло дефолтное meaning World. Попробуем теперь передать параметр через url:
Все работает так, How и задумано. Теперь попробуй проследить путь переменной name:
- Пользователь передал через url meaning параметра name = Amigo ->
- Контроллер обработал наше действие, принял переменную name и задал атрибут модели, с именем name и принятым meaningм ->
- Из модели эти данные попали во View, на page greeting.html и отобразorсь пользователю
Вот и все!
Сегодня мы познакомorсь с тобой с довольно большой и интересной темой MVC (Model - View - Controller). Это окончание цикла, цель которого — познакомить тебя с тем, что нужно знать перед началом Enterprise-разработки.
Оставляйте в комментариях интересующие вас темы — сделаем! |
GO TO FULL VERSION