diff --git a/2021-05/spring-16/spring-mvc-view-classwork/.gitignore b/2021-05/spring-16/spring-mvc-view-classwork/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/pom.xml b/2021-05/spring-16/spring-mvc-view-classwork/pom.xml
new file mode 100644
index 00000000..9aba7ff8
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/pom.xml
@@ -0,0 +1,17 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-mvc-view-class-work
+ 1.0
+
+ pom
+
+
+ spring-mvc-view-exercise
+ spring-mvc-view-solution
+
+
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/.gitignore b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/pom.xml b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/pom.xml
new file mode 100644
index 00000000..0a7c8dcc
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-mvc-view-exercise
+ 1.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.6.RELEASE
+
+
+
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ com.h2database
+ h2
+
+
+
+ org.springframework.data
+ spring-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/Main.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..395af78d
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,28 @@
+package ru.otus.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import javax.annotation.PostConstruct;
+
+@SpringBootApplication
+public class Main {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Main.class);
+ }
+
+ //Чтобы не усложнять пример, делать так нельзя :)
+ @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
+ @Autowired
+ private PersonRepository repository;
+
+ @PostConstruct
+ public void init() {
+ repository.save(new Person("Pushkin"));
+ repository.save(new Person("Lermontov"));
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..374c55ac
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,37 @@
+package ru.otus.spring.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class Person {
+
+ @Id
+ @GeneratedValue
+ private int id;
+ private String name;
+
+ public Person() {
+ }
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java
new file mode 100644
index 00000000..4b20e5b7
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java
@@ -0,0 +1,11 @@
+package ru.otus.spring.repostory;
+
+import org.springframework.data.repository.CrudRepository;
+import ru.otus.spring.domain.Person;
+
+import java.util.List;
+
+public interface PersonRepository extends CrudRepository {
+
+ List findAll();
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java
new file mode 100644
index 00000000..463146f3
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java
@@ -0,0 +1,7 @@
+package ru.otus.spring.rest;
+
+class NotFoundException extends RuntimeException{
+
+ NotFoundException() {
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/rest/PersonController.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/rest/PersonController.java
new file mode 100644
index 00000000..06f92888
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/java/ru/otus/spring/rest/PersonController.java
@@ -0,0 +1,35 @@
+package ru.otus.spring.rest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Controller
+public class PersonController {
+
+ private final PersonRepository repository;
+
+ @Autowired
+ public PersonController(PersonRepository repository) {
+ this.repository = repository;
+ }
+
+ @GetMapping("/")
+ public String listPage(Model model) {
+ List persons = repository.findAll();
+ model.addAttribute("persons", persons);
+ return "list";
+ }
+
+ @GetMapping("/edit")
+ public String editPage(@RequestParam("id") int id, Model model) {
+ return null;
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/resources/templates/edit.html b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/resources/templates/edit.html
new file mode 100644
index 00000000..63f74408
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/resources/templates/edit.html
@@ -0,0 +1,47 @@
+
+
+
+
+ Edit person
+
+
+
+
+
+
+
+
+
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/resources/templates/list.html b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/resources/templates/list.html
new file mode 100644
index 00000000..728467e5
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-exercise/src/main/resources/templates/list.html
@@ -0,0 +1,39 @@
+
+
+
+
+ List of all persons
+
+
+
+Persons:
+
+
+
+
+ | ID |
+ Name |
+ Action |
+
+
+
+
+ | 1 |
+ John Doe |
+
+ Edit
+ |
+
+
+
+
+
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/.gitignore b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/pom.xml b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/pom.xml
new file mode 100644
index 00000000..e47993b8
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-mvc-view-solution
+ 1.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.6.RELEASE
+
+
+
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ com.h2database
+ h2
+
+
+
+ org.springframework.data
+ spring-data-jpa
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/Main.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..d33c8908
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,27 @@
+package ru.otus.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import javax.annotation.PostConstruct;
+
+@SpringBootApplication
+public class Main {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Main.class);
+ }
+
+ @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
+ @Autowired
+ private PersonRepository repository;
+
+ @PostConstruct
+ public void init() {
+ repository.save(new Person("Pushkin"));
+ repository.save(new Person("Lermontov"));
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/domain/Person.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..374c55ac
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,37 @@
+package ru.otus.spring.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class Person {
+
+ @Id
+ @GeneratedValue
+ private int id;
+ private String name;
+
+ public Person() {
+ }
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java
new file mode 100644
index 00000000..4b20e5b7
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java
@@ -0,0 +1,11 @@
+package ru.otus.spring.repostory;
+
+import org.springframework.data.repository.CrudRepository;
+import ru.otus.spring.domain.Person;
+
+import java.util.List;
+
+public interface PersonRepository extends CrudRepository {
+
+ List findAll();
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java
new file mode 100644
index 00000000..463146f3
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java
@@ -0,0 +1,7 @@
+package ru.otus.spring.rest;
+
+class NotFoundException extends RuntimeException{
+
+ NotFoundException() {
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/rest/PersonController.java b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/rest/PersonController.java
new file mode 100644
index 00000000..a52fb8b4
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/java/ru/otus/spring/rest/PersonController.java
@@ -0,0 +1,52 @@
+package ru.otus.spring.rest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ExtendedModelMap;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Controller
+public class PersonController {
+
+ private final PersonRepository repository;
+
+ @Autowired
+ public PersonController(PersonRepository repository) {
+ this.repository = repository;
+ }
+
+ @GetMapping("/")
+ public String listPage(Model model) {
+ List persons = repository.findAll();
+ model.addAttribute("persons", persons);
+ return "list";
+ }
+
+ @GetMapping("/edit")
+ public String editPage(@RequestParam("id") int id, Model model) {
+ Person person = repository.findById(id).orElseThrow(NotFoundException::new);
+ model.addAttribute("person", person);
+ return "edit";
+ }
+
+ @PostMapping("/edit")
+ public String savePerson(
+ Person person,
+ Model model
+ ) {
+ Person saved = repository.save(person);
+ model.addAttribute(saved);
+ //Ошибка! Нужен редирект!
+ return "edit";
+ }
+}
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/resources/templates/edit.html b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/resources/templates/edit.html
new file mode 100644
index 00000000..230da682
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/resources/templates/edit.html
@@ -0,0 +1,47 @@
+
+
+
+
+ Edit person
+
+
+
+
+
+
+
+
+
diff --git a/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/resources/templates/list.html b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/resources/templates/list.html
new file mode 100644
index 00000000..c1ccf866
--- /dev/null
+++ b/2021-05/spring-16/spring-mvc-view-classwork/spring-mvc-view-solution/src/main/resources/templates/list.html
@@ -0,0 +1,39 @@
+
+
+
+
+ List of all persons
+
+
+
+Persons:
+
+
+
+
+ | ID |
+ Name |
+ Action |
+
+
+
+
+ | 1 |
+ John Doe |
+
+ Edit
+ |
+
+
+
+
+